diff options
| -rw-r--r-- | kernel/events/core.c | 37 |
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 | ||
| 9111 | restart: | 9116 | restart: |
| 9112 | perf_event_stop(event, 1); | 9117 | perf_event_stop(event, 1); |
