Peter Zijlstra
4a1c0f262f
perf: Fix lockdep warning on process exit
Sasha Levin reported:
> While fuzzing with trinity inside a KVM tools guest running the latest -next
> kernel I've stumbled on the following spew:
>
> ======================================================
> [ INFO: possible circular locking dependency detected ]
> 3.15.0-next-20140613-sasha-00026-g6dd125d-dirty #654 Not tainted
> -------------------------------------------------------
> trinity-c578/9725 is trying to acquire lock:
> (&(&pool->lock)->rlock){-.-...}, at: __queue_work (kernel/workqueue.c:1346)
>
> but task is already holding lock:
> (&ctx->lock){-.....}, at: perf_event_exit_task (kernel/events/core.c:7471 kernel/events/core.c:7533)
>
> which lock already depends on the new lock.
> 1 lock held by trinity-c578/9725:
> #0: (&ctx->lock){-.....}, at: perf_event_exit_task (kernel/events/core.c:7471 kernel/events/core.c:7533)
>
> Call Trace:
> dump_stack (lib/dump_stack.c:52)
> print_circular_bug (kernel/locking/lockdep.c:1216)
> __lock_acquire (kernel/locking/lockdep.c:1840 kernel/locking/lockdep.c:1945 kernel/locking/lockdep.c:2131 kernel/locking/lockdep.c:3182)
> lock_acquire (./arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602)
> _raw_spin_lock (include/linux/spinlock_api_smp.h:143 kernel/locking/spinlock.c:151)
> __queue_work (kernel/workqueue.c:1346)
> queue_work_on (kernel/workqueue.c:1424)
> free_object (lib/debugobjects.c:209)
> __debug_check_no_obj_freed (lib/debugobjects.c:715)
> debug_check_no_obj_freed (lib/debugobjects.c:727)
> kmem_cache_free (mm/slub.c:2683 mm/slub.c:2711)
> free_task (kernel/fork.c:221)
> __put_task_struct (kernel/fork.c:250)
> put_ctx (include/linux/sched.h:1855 kernel/events/core.c:898)
> perf_event_exit_task (kernel/events/core.c:907 kernel/events/core.c:7478 kernel/events/core.c:7533)
> do_exit (kernel/exit.c:766)
> do_group_exit (kernel/exit.c:884)
> get_signal_to_deliver (kernel/signal.c:2347)
> do_signal (arch/x86/kernel/signal.c:698)
> do_notify_resume (arch/x86/kernel/signal.c:751)
> int_signal (arch/x86/kernel/entry_64.S:600)
Urgh.. so the only way I can make that happen is through:
perf_event_exit_task_context()
raw_spin_lock(&child_ctx->lock);
unclone_ctx(child_ctx)
put_ctx(ctx->parent_ctx);
raw_spin_unlock_irqrestore(&child_ctx->lock);
And we can avoid this by doing the change below.
I can't immediately see how this changed recently, but given that you
say it's easy to reproduce, lets fix this.
Reported-by: Sasha Levin <sasha.levin@oracle.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Cc: Tejun Heo <tj@kernel.org>
Cc: Dave Jones <davej@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: http://lkml.kernel.org/r/20140623141242.GB19860@laptop.programming.kicks-ass.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
2014-07-16 13:18:42 +02:00 |
| .. |
|
debug
|
kernel/printk: use symbolic defines for console loglevels
|
2014-06-04 16:54:17 -07:00 |
|
events
|
perf: Fix lockdep warning on process exit
|
2014-07-16 13:18:42 +02:00 |
|
gcov
|
gcov: add support for GCC 4.9
|
2014-06-10 15:34:46 -07:00 |
|
irq
|
genirq: Improve documentation to match current implementation
|
2014-05-27 10:16:44 +02:00 |
|
locking
|
Merge branch 'locking-urgent-for-linus.patch' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
|
2014-06-21 07:06:02 -10:00 |
|
power
|
x86, kaslr: boot-time selectable with hibernation
|
2014-06-16 23:30:44 +02:00 |
|
printk
|
kernel/printk: use symbolic defines for console loglevels
|
2014-06-04 16:54:17 -07:00 |
|
rcu
|
Merge branch 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip into next
|
2014-06-03 12:57:53 -07:00 |
|
sched
|
Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
|
2014-06-12 19:42:15 -07:00 |
|
time
|
Merge branch 'akpm' (patchbomb from Andrew) into next
|
2014-06-04 16:55:13 -07:00 |
|
trace
|
One bug fix that goes back to 3.10. Accessing a non existent buffer
|
2014-06-12 21:07:25 -07:00 |
|
.gitignore
|
|
|
|
acct.c
|
ipc, kernel: clear whitespace
|
2014-06-06 16:08:14 -07:00 |
|
async.c
|
|
|
|
audit.c
|
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
|
2014-06-12 14:27:40 -07:00 |
|
audit.h
|
|
|
|
audit_tree.c
|
|
|
|
audit_watch.c
|
|
|
|
auditfilter.c
|
Merge git://git.infradead.org/users/eparis/audit
|
2014-04-12 12:38:53 -07:00 |
|
auditsc.c
|
auditsc: audit_krule mask accesses need bounds checking
|
2014-06-10 08:44:40 -07:00 |
|
backtracetest.c
|
kernel/backtracetest.c: replace no level printk by pr_info()
|
2014-06-04 16:54:14 -07:00 |
|
bounds.c
|
|
|
|
capability.c
|
fs,userns: Change inode_capable to capable_wrt_inode_uidgid
|
2014-06-10 13:57:22 -07:00 |
|
cgroup.c
|
Merge branch 'for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
|
2014-06-09 15:03:33 -07:00 |
|
cgroup_freezer.c
|
cgroup: remove css_parent()
|
2014-05-16 13:22:48 -04:00 |
|
compat.c
|
kernel/compat.c: use sizeof() instead of sizeof
|
2014-06-04 16:54:19 -07:00 |
|
configs.c
|
|
|
|
context_tracking.c
|
x86/kprobes: Fix build errors and blacklist context_track_user
|
2014-06-14 09:07:44 +02:00 |
|
cpu.c
|
More ACPI and power management updates for 3.16-rc1
|
2014-06-12 13:14:19 -07:00 |
|
cpu_pm.c
|
|
|
|
cpuset.c
|
Merge branch 'for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
|
2014-06-09 15:03:33 -07:00 |
|
crash_dump.c
|
|
|
|
cred.c
|
|
|
|
delayacct.c
|
|
|
|
dma.c
|
|
|
|
elfcore.c
|
|
|
|
exec_domain.c
|
kernel/exec_domain.c: code clean-up
|
2014-06-04 16:54:15 -07:00 |
|
exit.c
|
signals: mv {dis,}allow_signal() from sched.h/exit.c to signal.[ch]
|
2014-06-06 16:08:11 -07:00 |
|
extable.c
|
|
|
|
fork.c
|
ptrace: fix fork event messages across pid namespaces
|
2014-06-06 16:08:11 -07:00 |
|
freezer.c
|
|
|
|
futex.c
|
Merge branch 'next' (accumulated 3.16 merge window patches) into master
|
2014-06-08 11:31:16 -07:00 |
|
futex_compat.c
|
|
|
|
groups.c
|
|
|
|
hrtimer.c
|
Merge branch 'perf/urgent' into perf/core, to resolve conflict and to prepare for new patches
|
2014-06-06 07:55:06 +02:00 |
|
hung_task.c
|
kernel/hung_task.c: convert simple_strtoul to kstrtouint
|
2014-06-04 16:54:15 -07:00 |
|
irq_work.c
|
|
|
|
itimer.c
|
|
|
|
jump_label.c
|
|
|
|
kallsyms.c
|
kernel: use macros from compiler.h instead of __attribute__((...))
|
2014-04-07 16:36:11 -07:00 |
|
kcmp.c
|
|
|
|
Kconfig.freezer
|
|
|
|
Kconfig.hz
|
|
|
|
Kconfig.locks
|
locking/rwlocks: Introduce 'qrwlocks' - fair, queued rwlocks
|
2014-06-06 07:58:28 +02:00 |
|
Kconfig.preempt
|
|
|
|
kexec.c
|
kernel/kexec.c: convert printk to pr_foo()
|
2014-06-06 16:08:12 -07:00 |
|
kmod.c
|
signals: change wait_for_helper() to use kernel_sigaction()
|
2014-06-06 16:08:12 -07:00 |
|
kprobes.c
|
kprobes: Show blacklist entries via debugfs
|
2014-04-24 10:26:41 +02:00 |
|
ksysfs.c
|
kobject: Make support for uevent_helper optional.
|
2014-04-25 12:00:49 -07:00 |
|
kthread.c
|
kthread: fix return value of kthread_create() upon SIGKILL.
|
2014-06-04 16:53:51 -07:00 |
|
latencytop.c
|
kernel/latencytop.c: convert seq_printf to seq_puts
|
2014-06-04 16:54:15 -07:00 |
|
Makefile
|
|
|
|
module-internal.h
|
|
|
|
module.c
|
Most of this is cleaning up various driver sysfs permissions so we can
|
2014-06-11 16:09:14 -07:00 |
|
module_signing.c
|
|
|
|
notifier.c
|
kprobes, notifier: Use NOKPROBE_SYMBOL macro in notifier
|
2014-04-24 10:26:39 +02:00 |
|
nsproxy.c
|
|
|
|
padata.c
|
|
|
|
panic.c
|
kernel/panic.c: add "crash_kexec_post_notifiers" option for kdump after panic_notifers
|
2014-06-06 16:08:12 -07:00 |
|
params.c
|
param: hand arguments after -- straight to init
|
2014-04-28 11:48:34 +09:30 |
|
pid.c
|
|
|
|
pid_namespace.c
|
|
|
|
posix-cpu-timers.c
|
|
|
|
posix-timers.c
|
|
|
|
profile.c
|
kernel/profile.c: use static const char instead of static char
|
2014-06-06 16:08:13 -07:00 |
|
ptrace.c
|
|
|
|
range.c
|
|
|
|
reboot.c
|
kernel/reboot.c: convert simple_strtoul to kstrtoint
|
2014-06-04 16:54:15 -07:00 |
|
relay.c
|
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
|
2014-04-12 14:49:50 -07:00 |
|
res_counter.c
|
kernel/res_counter.c: replace simple_strtoull by kstrtoull
|
2014-06-04 16:54:15 -07:00 |
|
resource.c
|
resources: Clarify sanity check message
|
2014-05-23 10:47:21 -06:00 |
|
seccomp.c
|
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
|
2014-06-12 14:27:40 -07:00 |
|
signal.c
|
signals: introduce kernel_sigaction()
|
2014-06-06 16:08:12 -07:00 |
|
smp.c
|
smp: print more useful debug info upon receiving IPI on an offline CPU
|
2014-06-06 16:08:12 -07:00 |
|
smpboot.c
|
|
|
|
smpboot.h
|
|
|
|
softirq.c
|
Merge branch 'rcu/next' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu into core/rcu
|
2014-05-22 11:36:10 +02:00 |
|
stacktrace.c
|
|
|
|
stop_machine.c
|
kernel/stop_machine.c: kernel-doc warning fix
|
2014-06-04 16:54:15 -07:00 |
|
sys.c
|
sched: Consolidate open coded implementations of nice level frobbing into nice_to_rlimit() and rlimit_to_nice()
|
2014-05-22 11:16:36 +02:00 |
|
sys_ni.c
|
sys_sgetmask/sys_ssetmask: add CONFIG_SGETMASK_SYSCALL
|
2014-06-04 16:54:14 -07:00 |
|
sysctl.c
|
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next
|
2014-06-19 07:50:07 -10:00 |
|
sysctl_binary.c
|
|
|
|
system_certificates.S
|
|
|
|
system_keyring.c
|
|
|
|
task_work.c
|
|
|
|
taskstats.c
|
|
|
|
test_kprobes.c
|
|
|
|
time.c
|
|
|
|
timeconst.bc
|
|
|
|
timer.c
|
timer: Prevent overflow in apply_slack
|
2014-04-30 13:46:17 +02:00 |
|
torture.c
|
torture: Remove __init from torture_init_begin/end
|
2014-05-14 09:46:30 -07:00 |
|
tracepoint.c
|
kernel/tracepoint.c: kernel-doc fixes
|
2014-06-04 16:54:15 -07:00 |
|
tsacct.c
|
|
|
|
uid16.c
|
|
|
|
up.c
|
|
|
|
user-return-notifier.c
|
|
|
|
user.c
|
kernel/user.c: drop unused field 'files' from user_struct
|
2014-06-04 16:54:16 -07:00 |
|
user_namespace.c
|
kernel/user_namespace.c: kernel-doc/checkpatch fixes
|
2014-06-06 16:08:13 -07:00 |
|
utsname.c
|
|
|
|
utsname_sysctl.c
|
sysctl: convert use of typedef ctl_table to struct ctl_table
|
2014-06-06 16:08:16 -07:00 |
|
watchdog.c
|
kernel/watchdog.c:touch_softlockup_watchdog(): use raw_cpu_write()
|
2014-04-18 16:40:08 -07:00 |
|
workqueue.c
|
Merge branch 'for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq
|
2014-06-09 14:56:49 -07:00 |
|
workqueue_internal.h
|
workqueue: rename manager_mutex to attach_mutex
|
2014-05-20 10:59:32 -04:00 |