aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/events/core.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 534e01e7bc36..dc7dead2d2cc 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -9077,26 +9077,29 @@ static void perf_event_addr_filters_apply(struct perf_event *event)
9077 if (task == TASK_TOMBSTONE) 9077 if (task == TASK_TOMBSTONE)
9078 return; 9078 return;
9079 9079
9080 if (!ifh->nr_file_filters) 9080 if (ifh->nr_file_filters) {
9081 return; 9081 mm = get_task_mm(event->ctx->task);
9082 9082 if (!mm)
9083 mm = get_task_mm(event->ctx->task); 9083 goto restart;
9084 if (!mm)
9085 goto restart;
9086 9084
9087 down_read(&mm->mmap_sem); 9085 down_read(&mm->mmap_sem);
9086 }
9088 9087
9089 raw_spin_lock_irqsave(&ifh->lock, flags); 9088 raw_spin_lock_irqsave(&ifh->lock, flags);
9090 list_for_each_entry(filter, &ifh->list, entry) { 9089 list_for_each_entry(filter, &ifh->list, entry) {
9091 event->addr_filter_ranges[count].start = 0; 9090 if (filter->path.dentry) {
9092 event->addr_filter_ranges[count].size = 0; 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 perf_addr_filter_apply(filter, mm, &event->addr_filter_ranges[count]); 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 count++; 9104 count++;
9102 } 9105 }
@@ -9104,9 +9107,11 @@ static void perf_event_addr_filters_apply(struct perf_event *event)
9104 event->addr_filters_gen++; 9107 event->addr_filters_gen++;
9105 raw_spin_unlock_irqrestore(&ifh->lock, flags); 9108 raw_spin_unlock_irqrestore(&ifh->lock, flags);
9106 9109
9107 up_read(&mm->mmap_sem); 9110 if (ifh->nr_file_filters) {
9111 up_read(&mm->mmap_sem);
9108 9112
9109 mmput(mm); 9113 mmput(mm);
9114 }
9110 9115
9111restart: 9116restart:
9112 perf_event_stop(event, 1); 9117 perf_event_stop(event, 1);