perf/core: Fix the address filtering fix

The following recent commit:

c60f83b813e5 ("perf, pt, coresight: Fix address filters for vmas with non-zero offset")

changes the address filtering logic to communicate filter ranges to the PMU driver
via a single address range object, instead of having the driver do the final bit of
math.

That change forgets to take into account kernel filters, which are not calculated
the same way as DSO based filters.

Fix that by passing the kernel filters the same way as file-based filters.
This doesn't require any additional changes in the drivers.

Reported-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Fixes: c60f83b813e5 ("perf, pt, coresight: Fix address filters for vmas with non-zero offset")
Link: https://lkml.kernel.org/r/20190329091212.29870-1-alexander.shishkin@linux.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>

authored by

Alexander Shishkin and committed by
Ingo Molnar
52a44f83 5f843ed4

+21 -16
+21 -16
kernel/events/core.c
··· 9077 9077 if (task == TASK_TOMBSTONE) 9078 9078 return; 9079 9079 9080 - if (!ifh->nr_file_filters) 9081 - return; 9080 + if (ifh->nr_file_filters) { 9081 + mm = get_task_mm(event->ctx->task); 9082 + if (!mm) 9083 + goto restart; 9082 9084 9083 - mm = get_task_mm(event->ctx->task); 9084 - if (!mm) 9085 - goto restart; 9086 - 9087 - down_read(&mm->mmap_sem); 9085 + down_read(&mm->mmap_sem); 9086 + } 9088 9087 9089 9088 raw_spin_lock_irqsave(&ifh->lock, flags); 9090 9089 list_for_each_entry(filter, &ifh->list, entry) { 9091 - event->addr_filter_ranges[count].start = 0; 9092 - event->addr_filter_ranges[count].size = 0; 9090 + if (filter->path.dentry) { 9091 + /* 9092 + * Adjust base offset if the filter is associated to a 9093 + * binary that needs to be mapped: 9094 + */ 9095 + event->addr_filter_ranges[count].start = 0; 9096 + event->addr_filter_ranges[count].size = 0; 9093 9097 9094 - /* 9095 - * Adjust base offset if the filter is associated to a binary 9096 - * that needs to be mapped: 9097 - */ 9098 - if (filter->path.dentry) 9099 9098 perf_addr_filter_apply(filter, mm, &event->addr_filter_ranges[count]); 9099 + } else { 9100 + event->addr_filter_ranges[count].start = filter->offset; 9101 + event->addr_filter_ranges[count].size = filter->size; 9102 + } 9100 9103 9101 9104 count++; 9102 9105 } ··· 9107 9104 event->addr_filters_gen++; 9108 9105 raw_spin_unlock_irqrestore(&ifh->lock, flags); 9109 9106 9110 - up_read(&mm->mmap_sem); 9107 + if (ifh->nr_file_filters) { 9108 + up_read(&mm->mmap_sem); 9111 9109 9112 - mmput(mm); 9110 + mmput(mm); 9111 + } 9113 9112 9114 9113 restart: 9115 9114 perf_event_stop(event, 1);