perf fixes
Subsystems (2)
Linus,
Please pull the latest perf-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf-urgent-for-linus
# HEAD: b3f207855f57b9c8f43a547a801340bb5cbc59e5 perf: Handle compat ioctl
A kprobes and a perf compat ioctl fix.
Thanks,
Ingo
------------------>
Masami Hiramatsu (1):
kprobes: Skip kretprobe hit in NMI context to avoid deadlock
Pawel Moll (1):
perf: Handle compat ioctl
kernel/events/core.c | 23 ++++++++++++++++++++++- kernel/kprobes.c | 13 ++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-)
kernel/events/core.c +22 -1
@@ -41,6 +41,7 @@#include <linux/cgroup.h> #include <linux/module.h> #include <linux/mman.h> +#include <linux/compat.h> #include "internal.h"
@@ -3717,6 +3718,26 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)return 0 ; } +#ifdef CONFIG_COMPAT +static long perf_compat_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) +{ +switch (_IOC_NR (cmd)) { +case _IOC_NR (PERF_EVENT_IOC_SET_FILTER ): +case _IOC_NR (PERF_EVENT_IOC_ID ): +/* Fix up pointer size (usually 4 -> 8 in 32-on-64-bit case */ +if (_IOC_SIZE (cmd) ==sizeof (compat_uptr_t)) { + cmd &= ~IOCSIZE_MASK ; + cmd |=sizeof (void *) <<IOCSIZE_SHIFT ; + } +break ; + } +return perf_ioctl (file, cmd, arg); +} +#else +# define perf_compat_ioctl NULL +#endif +int perf_event_task_enable (void ) {struct perf_event *event;
@@ -4222,7 +4243,7 @@ static const struct file_operations perf_fops = { .read = perf_read, .poll = perf_poll, .unlocked_ioctl = perf_ioctl, - .compat_ioctl = perf_ioctl, + .compat_ioctl = perf_compat_ioctl, .mmap = perf_mmap, .fasync = perf_fasync, };
kernel/kprobes.c +12 -1
@@ -1778,7 +1778,18 @@ static int pre_handler_kretprobe(struct kprobe *p, struct pt_regs *regs)unsigned long hash, flags =0 ;struct kretprobe_instance *ri; -/*TODO: consider to only swap the RA after the last pre_handler fired */ +/* +* To avoid deadlocks, prohibit return probing in NMI contexts, +* just skip the probe and increase the (inexact) 'nmissed' +* statistical counter, so that the user is informed that +* something happened: +*/ +if (unlikely (in_nmi ())) { + rp->nmissed++; +return 0 ; + } + +/* TODO: consider to only swap the RA after the last pre_handler fired */ hash =hash_ptr (current,KPROBE_HASH_BITS );raw_spin_lock_irqsave (&rp->lock, flags);if (!hlist_empty (&rp->free_instances)) {