diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-21 13:07:17 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-21 13:07:17 -0400 |
| commit | 401c58fcbbf570e7e4a8ee0e21ffd829deb4de0b (patch) | |
| tree | 6c61f2d3288f0f299e41e70b79bf91b99ae27764 /kernel | |
| parent | 7b08d618a232aa3bfc538cf1eccd9ce0c239bf03 (diff) | |
| parent | cf230918cda19532e4a5cc4f0d5c82fa7e5e94f6 (diff) | |
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Ingo Molnar:
"This is larger than usual: the main reason are the ARM symbol lookup
speedups that came in late and were hard to resist.
There's also a kprobes fix and various tooling fixes, plus the minimal
re-enablement of the mmap2 support interface"
* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (36 commits)
x86/kprobes: Fix build errors and blacklist context_track_user
perf tests: Add test for closing dso objects on EMFILE error
perf tests: Add test for caching dso file descriptors
perf tests: Allow reuse of test_file function
perf tests: Spawn child for each test
perf tools: Add dso__data_* interface descriptons
perf tools: Allow to close dso fd in case of open failure
perf tools: Add file size check and factor dso__data_read_offset
perf tools: Cache dso data file descriptor
perf tools: Add global count of opened dso objects
perf tools: Add global list of opened dso objects
perf tools: Add data_fd into dso object
perf tools: Separate dso data related variables
perf tools: Cache register accesses for unwind processing
perf record: Fix to honor user freq/interval properly
perf timechart: Reflow documentation
perf probe: Improve error messages in --line option
perf probe: Improve an error message of perf probe --vars mode
perf probe: Show error code and description in verbose mode
perf probe: Improve error message for unknown member of data structure
...
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/context_tracking.c | 3 | ||||
| -rw-r--r-- | kernel/events/core.c | 37 |
2 files changed, 36 insertions, 4 deletions
diff --git a/kernel/context_tracking.c b/kernel/context_tracking.c index 019d45008448..5664985c46a0 100644 --- a/kernel/context_tracking.c +++ b/kernel/context_tracking.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/sched.h> | 19 | #include <linux/sched.h> |
| 20 | #include <linux/hardirq.h> | 20 | #include <linux/hardirq.h> |
| 21 | #include <linux/export.h> | 21 | #include <linux/export.h> |
| 22 | #include <linux/kprobes.h> | ||
| 22 | 23 | ||
| 23 | #define CREATE_TRACE_POINTS | 24 | #define CREATE_TRACE_POINTS |
| 24 | #include <trace/events/context_tracking.h> | 25 | #include <trace/events/context_tracking.h> |
| @@ -104,6 +105,7 @@ void context_tracking_user_enter(void) | |||
| 104 | } | 105 | } |
| 105 | local_irq_restore(flags); | 106 | local_irq_restore(flags); |
| 106 | } | 107 | } |
| 108 | NOKPROBE_SYMBOL(context_tracking_user_enter); | ||
| 107 | 109 | ||
| 108 | #ifdef CONFIG_PREEMPT | 110 | #ifdef CONFIG_PREEMPT |
| 109 | /** | 111 | /** |
| @@ -181,6 +183,7 @@ void context_tracking_user_exit(void) | |||
| 181 | } | 183 | } |
| 182 | local_irq_restore(flags); | 184 | local_irq_restore(flags); |
| 183 | } | 185 | } |
| 186 | NOKPROBE_SYMBOL(context_tracking_user_exit); | ||
| 184 | 187 | ||
| 185 | /** | 188 | /** |
| 186 | * __context_tracking_task_switch - context switch the syscall callbacks | 189 | * __context_tracking_task_switch - context switch the syscall callbacks |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 5fa58e4cffac..a33d9a2bcbd7 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | #include <linux/mm_types.h> | 40 | #include <linux/mm_types.h> |
| 41 | #include <linux/cgroup.h> | 41 | #include <linux/cgroup.h> |
| 42 | #include <linux/module.h> | 42 | #include <linux/module.h> |
| 43 | #include <linux/mman.h> | ||
| 43 | 44 | ||
| 44 | #include "internal.h" | 45 | #include "internal.h" |
| 45 | 46 | ||
| @@ -5128,6 +5129,7 @@ struct perf_mmap_event { | |||
| 5128 | int maj, min; | 5129 | int maj, min; |
| 5129 | u64 ino; | 5130 | u64 ino; |
| 5130 | u64 ino_generation; | 5131 | u64 ino_generation; |
| 5132 | u32 prot, flags; | ||
| 5131 | 5133 | ||
| 5132 | struct { | 5134 | struct { |
| 5133 | struct perf_event_header header; | 5135 | struct perf_event_header header; |
| @@ -5169,6 +5171,8 @@ static void perf_event_mmap_output(struct perf_event *event, | |||
| 5169 | mmap_event->event_id.header.size += sizeof(mmap_event->min); | 5171 | mmap_event->event_id.header.size += sizeof(mmap_event->min); |
| 5170 | mmap_event->event_id.header.size += sizeof(mmap_event->ino); | 5172 | mmap_event->event_id.header.size += sizeof(mmap_event->ino); |
| 5171 | mmap_event->event_id.header.size += sizeof(mmap_event->ino_generation); | 5173 | mmap_event->event_id.header.size += sizeof(mmap_event->ino_generation); |
| 5174 | mmap_event->event_id.header.size += sizeof(mmap_event->prot); | ||
| 5175 | mmap_event->event_id.header.size += sizeof(mmap_event->flags); | ||
| 5172 | } | 5176 | } |
| 5173 | 5177 | ||
| 5174 | perf_event_header__init_id(&mmap_event->event_id.header, &sample, event); | 5178 | perf_event_header__init_id(&mmap_event->event_id.header, &sample, event); |
| @@ -5187,6 +5191,8 @@ static void perf_event_mmap_output(struct perf_event *event, | |||
| 5187 | perf_output_put(&handle, mmap_event->min); | 5191 | perf_output_put(&handle, mmap_event->min); |
| 5188 | perf_output_put(&handle, mmap_event->ino); | 5192 | perf_output_put(&handle, mmap_event->ino); |
| 5189 | perf_output_put(&handle, mmap_event->ino_generation); | 5193 | perf_output_put(&handle, mmap_event->ino_generation); |
| 5194 | perf_output_put(&handle, mmap_event->prot); | ||
| 5195 | perf_output_put(&handle, mmap_event->flags); | ||
| 5190 | } | 5196 | } |
| 5191 | 5197 | ||
| 5192 | __output_copy(&handle, mmap_event->file_name, | 5198 | __output_copy(&handle, mmap_event->file_name, |
| @@ -5205,6 +5211,7 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event) | |||
| 5205 | struct file *file = vma->vm_file; | 5211 | struct file *file = vma->vm_file; |
| 5206 | int maj = 0, min = 0; | 5212 | int maj = 0, min = 0; |
| 5207 | u64 ino = 0, gen = 0; | 5213 | u64 ino = 0, gen = 0; |
| 5214 | u32 prot = 0, flags = 0; | ||
| 5208 | unsigned int size; | 5215 | unsigned int size; |
| 5209 | char tmp[16]; | 5216 | char tmp[16]; |
| 5210 | char *buf = NULL; | 5217 | char *buf = NULL; |
| @@ -5235,6 +5242,28 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event) | |||
| 5235 | gen = inode->i_generation; | 5242 | gen = inode->i_generation; |
| 5236 | maj = MAJOR(dev); | 5243 | maj = MAJOR(dev); |
| 5237 | min = MINOR(dev); | 5244 | min = MINOR(dev); |
| 5245 | |||
| 5246 | if (vma->vm_flags & VM_READ) | ||
| 5247 | prot |= PROT_READ; | ||
| 5248 | if (vma->vm_flags & VM_WRITE) | ||
| 5249 | prot |= PROT_WRITE; | ||
| 5250 | if (vma->vm_flags & VM_EXEC) | ||
| 5251 | prot |= PROT_EXEC; | ||
| 5252 | |||
| 5253 | if (vma->vm_flags & VM_MAYSHARE) | ||
| 5254 | flags = MAP_SHARED; | ||
| 5255 | else | ||
| 5256 | flags = MAP_PRIVATE; | ||
| 5257 | |||
| 5258 | if (vma->vm_flags & VM_DENYWRITE) | ||
| 5259 | flags |= MAP_DENYWRITE; | ||
| 5260 | if (vma->vm_flags & VM_MAYEXEC) | ||
| 5261 | flags |= MAP_EXECUTABLE; | ||
| 5262 | if (vma->vm_flags & VM_LOCKED) | ||
| 5263 | flags |= MAP_LOCKED; | ||
| 5264 | if (vma->vm_flags & VM_HUGETLB) | ||
| 5265 | flags |= MAP_HUGETLB; | ||
| 5266 | |||
| 5238 | goto got_name; | 5267 | goto got_name; |
| 5239 | } else { | 5268 | } else { |
| 5240 | name = (char *)arch_vma_name(vma); | 5269 | name = (char *)arch_vma_name(vma); |
| @@ -5275,6 +5304,8 @@ got_name: | |||
| 5275 | mmap_event->min = min; | 5304 | mmap_event->min = min; |
| 5276 | mmap_event->ino = ino; | 5305 | mmap_event->ino = ino; |
| 5277 | mmap_event->ino_generation = gen; | 5306 | mmap_event->ino_generation = gen; |
| 5307 | mmap_event->prot = prot; | ||
| 5308 | mmap_event->flags = flags; | ||
| 5278 | 5309 | ||
| 5279 | if (!(vma->vm_flags & VM_EXEC)) | 5310 | if (!(vma->vm_flags & VM_EXEC)) |
| 5280 | mmap_event->event_id.header.misc |= PERF_RECORD_MISC_MMAP_DATA; | 5311 | mmap_event->event_id.header.misc |= PERF_RECORD_MISC_MMAP_DATA; |
| @@ -5315,6 +5346,8 @@ void perf_event_mmap(struct vm_area_struct *vma) | |||
| 5315 | /* .min (attr_mmap2 only) */ | 5346 | /* .min (attr_mmap2 only) */ |
| 5316 | /* .ino (attr_mmap2 only) */ | 5347 | /* .ino (attr_mmap2 only) */ |
| 5317 | /* .ino_generation (attr_mmap2 only) */ | 5348 | /* .ino_generation (attr_mmap2 only) */ |
| 5349 | /* .prot (attr_mmap2 only) */ | ||
| 5350 | /* .flags (attr_mmap2 only) */ | ||
| 5318 | }; | 5351 | }; |
| 5319 | 5352 | ||
| 5320 | perf_event_mmap_event(&mmap_event); | 5353 | perf_event_mmap_event(&mmap_event); |
| @@ -6897,10 +6930,6 @@ static int perf_copy_attr(struct perf_event_attr __user *uattr, | |||
| 6897 | if (ret) | 6930 | if (ret) |
| 6898 | return -EFAULT; | 6931 | return -EFAULT; |
| 6899 | 6932 | ||
| 6900 | /* disabled for now */ | ||
| 6901 | if (attr->mmap2) | ||
| 6902 | return -EINVAL; | ||
| 6903 | |||
| 6904 | if (attr->__reserved_1) | 6933 | if (attr->__reserved_1) |
| 6905 | return -EINVAL; | 6934 | return -EINVAL; |
| 6906 | 6935 | ||
