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 if (task == TASK_TOMBSTONE) 9078 return; 9079 9080 - if (!ifh->nr_file_filters) 9081 - return; 9082 9083 - mm = get_task_mm(event->ctx->task); 9084 - if (!mm) 9085 - goto restart; 9086 - 9087 - down_read(&mm->mmap_sem); 9088 9089 raw_spin_lock_irqsave(&ifh->lock, flags); 9090 list_for_each_entry(filter, &ifh->list, entry) { 9091 - event->addr_filter_ranges[count].start = 0; 9092 - event->addr_filter_ranges[count].size = 0; 9093 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 perf_addr_filter_apply(filter, mm, &event->addr_filter_ranges[count]); 9100 9101 count++; 9102 } ··· 9107 event->addr_filters_gen++; 9108 raw_spin_unlock_irqrestore(&ifh->lock, flags); 9109 9110 - up_read(&mm->mmap_sem); 9111 9112 - mmput(mm); 9113 9114 restart: 9115 perf_event_stop(event, 1);
··· 9077 if (task == TASK_TOMBSTONE) 9078 return; 9079 9080 + if (ifh->nr_file_filters) { 9081 + mm = get_task_mm(event->ctx->task); 9082 + if (!mm) 9083 + goto restart; 9084 9085 + down_read(&mm->mmap_sem); 9086 + } 9087 9088 raw_spin_lock_irqsave(&ifh->lock, flags); 9089 list_for_each_entry(filter, &ifh->list, entry) { 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; 9097 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 + } 9103 9104 count++; 9105 } ··· 9104 event->addr_filters_gen++; 9105 raw_spin_unlock_irqrestore(&ifh->lock, flags); 9106 9107 + if (ifh->nr_file_filters) { 9108 + up_read(&mm->mmap_sem); 9109 9110 + mmput(mm); 9111 + } 9112 9113 restart: 9114 perf_event_stop(event, 1);