other_info
struct other_info *other_info,
if (other_info) {
other_skipnr = sanitize_stack_entries(other_info->stack_entries,
other_info->num_stack_entries,
other_info->ai.ip, &other_reordered_to);
other_frame = other_info->stack_entries[other_skipnr];
if (other_info) {
get_bug_type(ai->access_type | other_info->ai.access_type),
if (other_info) {
get_access_type(other_info->ai.access_type), other_info->ai.ptr,
other_info->ai.size, get_thread_desc(other_info->ai.task_pid),
other_info->ai.cpu_id);
print_stack_trace(other_info->stack_entries + other_skipnr,
other_info->num_stack_entries - other_skipnr,
print_verbose_info(other_info->task);
static void release_report(unsigned long *flags, struct other_info *other_info)
other_info->ai.size = 0;
struct other_info *other_info)
other_info->task = current;
other_info->task = NULL;
} while (other_info->ai.size && other_info->ai.ptr == ai->ptr &&
other_info->task == current);
struct other_info *other_info)
WARN_ON(other_info->ai.size);
other_info->ai = *ai;
other_info->num_stack_entries = stack_trace_save(other_info->stack_entries, NUM_STACK_ENTRIES, 2);
set_other_info_task_blocking(flags, ai, other_info);
struct other_info *other_info)
while (!other_info->ai.size) { /* Await valid @other_info. */
if (WARN_ON(!matching_access((unsigned long)other_info->ai.ptr & WATCHPOINT_ADDR_MASK, other_info->ai.size,
if (!matching_access((unsigned long)other_info->ai.ptr, other_info->ai.size,
release_report(flags, other_info);
struct other_info *other_info = &other_infos[watchpoint_idx];
if (!prepare_report_consumer(&flags, &ai, other_info))
print_report(value_change, &ai, other_info, old, new, mask);
release_report(&flags, other_info);
static struct other_info other_infos[CONFIG_KCSAN_NUM_WATCHPOINTS + NUM_SLOTS-1];