Josh Poimboeuf
eda8dca519
sched/debug: Fix deadlock when enabling sched events
I see a hang when enabling sched events:
echo 1 > /sys/kernel/debug/tracing/events/sched/enable
The printk buffer shows:
BUG: spinlock recursion on CPU#1, swapper/1/0
lock: 0xffff88007d5d8c00, .magic: dead4ead, .owner: swapper/1/0, .owner_cpu: 1
CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.7.0-rc2+ #1
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.8.1-20150318_183358- 04/01/2014
...
Call Trace:
<IRQ> [<ffffffff8143d663>] dump_stack+0x85/0xc2
[<ffffffff81115948>] spin_dump+0x78/0xc0
[<ffffffff81115aea>] do_raw_spin_lock+0x11a/0x150
[<ffffffff81891471>] _raw_spin_lock+0x61/0x80
[<ffffffff810e5466>] ? try_to_wake_up+0x256/0x4e0
[<ffffffff810e5466>] try_to_wake_up+0x256/0x4e0
[<ffffffff81891a0a>] ? _raw_spin_unlock_irqrestore+0x4a/0x80
[<ffffffff810e5705>] wake_up_process+0x15/0x20
[<ffffffff810cebb4>] insert_work+0x84/0xc0
[<ffffffff810ced7f>] __queue_work+0x18f/0x660
[<ffffffff810cf9a6>] queue_work_on+0x46/0x90
[<ffffffffa00cd95b>] drm_fb_helper_dirty.isra.11+0xcb/0xe0 [drm_kms_helper]
[<ffffffffa00cdac0>] drm_fb_helper_sys_imageblit+0x30/0x40 [drm_kms_helper]
[<ffffffff814babcd>] soft_cursor+0x1ad/0x230
[<ffffffff814ba379>] bit_cursor+0x649/0x680
[<ffffffff814b9d30>] ? update_attr.isra.2+0x90/0x90
[<ffffffff814b5e6a>] fbcon_cursor+0x14a/0x1c0
[<ffffffff81555ef8>] hide_cursor+0x28/0x90
[<ffffffff81558b6f>] vt_console_print+0x3bf/0x3f0
[<ffffffff81122c63>] call_console_drivers.constprop.24+0x183/0x200
[<ffffffff811241f4>] console_unlock+0x3d4/0x610
[<ffffffff811247f5>] vprintk_emit+0x3c5/0x610
[<ffffffff81124bc9>] vprintk_default+0x29/0x40
[<ffffffff811e965b>] printk+0x57/0x73
[<ffffffff810f7a9e>] enqueue_entity+0xc2e/0xc70
[<ffffffff810f7b39>] enqueue_task_fair+0x59/0xab0
[<ffffffff8106dcd9>] ? kvm_sched_clock_read+0x9/0x20
[<ffffffff8103fb39>] ? sched_clock+0x9/0x10
[<ffffffff810e3fcc>] activate_task+0x5c/0xa0
[<ffffffff810e4514>] ttwu_do_activate+0x54/0xb0
[<ffffffff810e5cea>] sched_ttwu_pending+0x7a/0xb0
[<ffffffff810e5e51>] scheduler_ipi+0x61/0x170
[<ffffffff81059e7f>] smp_trace_reschedule_interrupt+0x4f/0x2a0
[<ffffffff81893ba6>] trace_reschedule_interrupt+0x96/0xa0
<EOI> [<ffffffff8106e0d6>] ? native_safe_halt+0x6/0x10
[<ffffffff8110fb1d>] ? trace_hardirqs_on+0xd/0x10
[<ffffffff81040ac0>] default_idle+0x20/0x1a0
[<ffffffff8104147f>] arch_cpu_idle+0xf/0x20
[<ffffffff81102f8f>] default_idle_call+0x2f/0x50
[<ffffffff8110332e>] cpu_startup_entry+0x37e/0x450
[<ffffffff8105af70>] start_secondary+0x160/0x1a0
Note the hang only occurs when echoing the above from a physical serial
console, not from an ssh session.
The bug is caused by a deadlock where the task is trying to grab the rq
lock twice because printk()'s aren't safe in sched code.
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Matt Fleming <matt@codeblueprint.co.uk>
Cc: Mel Gorman <mgorman@techsingularity.net>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: stable@vger.kernel.org
Fixes: cb2517653f ("sched/debug: Make schedstats a runtime tunable that is disabled by default")
Link: http://lkml.kernel.org/r/20160613073209.gdvdybiruljbkn3p@treble
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
2016-06-14 12:47:21 +02:00 |
| .. |
|
bpf
|
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
|
2016-05-31 22:28:28 -07:00 |
|
configs
|
|
|
|
debug
|
mm/init: Add 'rodata=off' boot cmdline parameter to disable read-only kernel mappings
|
2016-02-22 08:51:37 +01:00 |
|
events
|
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
|
2016-06-10 11:15:41 -07:00 |
|
gcov
|
gcov: disable for COMPILE_TEST
|
2016-05-10 17:12:49 +02:00 |
|
irq
|
irqchip updates for 4.7-rc1:
|
2016-06-03 15:05:51 +02:00 |
|
livepatch
|
Merge branches 'for-4.7/core', 'for-4.7/livepatching-doc' and 'for-4.7/livepatching-ppc64' into for-linus
|
2016-05-17 12:06:35 +02:00 |
|
locking
|
locking/qspinlock: Fix spin_unlock_wait() some more
|
2016-06-08 14:29:08 +02:00 |
|
power
|
PM / Hibernate: Call flush_icache_range() on pages restored in-place
|
2016-04-28 13:35:48 +01:00 |
|
printk
|
printk/nmi: flush NMI messages on the system panic
|
2016-05-20 17:58:30 -07:00 |
|
rcu
|
debugobjects: insulate non-fixup logic related to static obj from fixup callbacks
|
2016-05-19 19:12:14 -07:00 |
|
sched
|
sched/debug: Fix deadlock when enabling sched events
|
2016-06-14 12:47:21 +02:00 |
|
time
|
timer: Export destroy_hrtimer_on_stack()
|
2016-05-31 11:44:08 -07:00 |
|
trace
|
bpf, trace: use READ_ONCE for retrieving file ptr
|
2016-06-07 14:48:03 -07:00 |
|
.gitignore
|
|
|
|
acct.c
|
|
|
|
async.c
|
|
|
|
audit.c
|
Merge branch 'stable-4.7' of git://git.infradead.org/users/pcmoore/audit
|
2016-05-18 18:46:55 -07:00 |
|
audit.h
|
security: Make inode argument of inode_getsecid non-const
|
2015-12-24 11:09:39 -05:00 |
|
audit_fsnotify.c
|
wrappers for ->i_mutex access
|
2016-01-22 18:04:28 -05:00 |
|
audit_tree.c
|
audit: cleanup prune_tree_thread
|
2016-04-04 09:46:47 -04:00 |
|
audit_watch.c
|
don't bother with ->d_inode->i_sb - it's always equal to ->d_sb
|
2016-04-10 17:11:51 -04:00 |
|
auditfilter.c
|
audit: Fix typo in comment
|
2016-02-08 11:25:39 -05:00 |
|
auditsc.c
|
Merge branch 'stable-4.7' of git://git.infradead.org/users/pcmoore/audit
|
2016-05-18 18:46:55 -07:00 |
|
backtracetest.c
|
|
|
|
bounds.c
|
|
|
|
capability.c
|
|
|
|
cgroup.c
|
cgroup: fix compile warning
|
2016-05-12 11:05:27 -04:00 |
|
cgroup_freezer.c
|
cgroup: kill cgrp_ss_priv[CGROUP_CANFORK_COUNT] and friends
|
2015-12-03 10:24:08 -05:00 |
|
cgroup_pids.c
|
cgroup_pids: fix a typo.
|
2015-12-14 14:54:37 -05:00 |
|
compat.c
|
|
|
|
configs.c
|
|
|
|
context_tracking.c
|
context_tracking: Switch to new static_branch API
|
2015-11-24 09:56:43 +01:00 |
|
cpu.c
|
sched/hotplug: Make activate() the last hotplug step
|
2016-05-06 14:58:25 +02:00 |
|
cpu_pm.c
|
|
|
|
cpuset.c
|
cpuset: use static key better and convert to new API
|
2016-05-19 19:12:14 -07:00 |
|
crash_dump.c
|
|
|
|
cred.c
|
kmemcg: account certain kmem allocations to memcg
|
2016-01-14 16:00:49 -08:00 |
|
delayacct.c
|
kmemcg: account certain kmem allocations to memcg
|
2016-01-14 16:00:49 -08:00 |
|
dma.c
|
|
|
|
elfcore.c
|
|
|
|
exec_domain.c
|
|
|
|
exit.c
|
wait: allow sys_waitid() to accept __WNOTHREAD/__WCLONE/__WALL
|
2016-05-23 17:04:14 -07:00 |
|
extable.c
|
|
|
|
fork.c
|
mm: oom_reaper: remove some bloat
|
2016-05-26 15:35:44 -07:00 |
|
freezer.c
|
|
|
|
futex.c
|
futex: Calculate the futex key based on a tail page for file-based futexes
|
2016-06-08 19:23:54 +02:00 |
|
futex_compat.c
|
ptrace: use fsuid, fsgid, effective creds for fs access checks
|
2016-01-20 17:09:18 -08:00 |
|
groups.c
|
|
|
|
hung_task.c
|
kernel/hung_task.c: use timeout diff when timeout is updated
|
2016-03-22 15:36:02 -07:00 |
|
irq_work.c
|
treewide: Remove old email address
|
2015-11-23 09:44:58 +01:00 |
|
jump_label.c
|
treewide: Remove old email address
|
2015-11-23 09:44:58 +01:00 |
|
kallsyms.c
|
kallsyms: add support for relative offsets in kallsyms address table
|
2016-03-15 16:55:16 -07:00 |
|
kcmp.c
|
ptrace: use fsuid, fsgid, effective creds for fs access checks
|
2016-01-20 17:09:18 -08:00 |
|
Kconfig.freezer
|
|
|
|
Kconfig.hz
|
|
|
|
Kconfig.locks
|
|
|
|
Kconfig.preempt
|
|
|
|
kcov.c
|
kcov: don't profile branches in kcov
|
2016-04-28 19:34:04 -07:00 |
|
kexec.c
|
s390/kexec: consolidate crash_map/unmap_reserved_pages() and arch_kexec_protect(unprotect)_crashkres()
|
2016-05-23 17:04:14 -07:00 |
|
kexec_core.c
|
s390/kexec: consolidate crash_map/unmap_reserved_pages() and arch_kexec_protect(unprotect)_crashkres()
|
2016-05-23 17:04:14 -07:00 |
|
kexec_file.c
|
kexec: introduce a protection mechanism for the crashkernel reserved memory
|
2016-05-23 17:04:14 -07:00 |
|
kexec_internal.h
|
kexec: move some memembers and definitions within the scope of CONFIG_KEXEC_FILE
|
2016-01-20 17:09:18 -08:00 |
|
kmod.c
|
|
|
|
kprobes.c
|
|
|
|
ksysfs.c
|
rcu: Remove TINY_RCU bloat from pointless boot parameters
|
2015-12-07 16:59:37 -08:00 |
|
kthread.c
|
|
|
|
latencytop.c
|
sched/debug: Make schedstats a runtime tunable that is disabled by default
|
2016-02-09 11:54:23 +01:00 |
|
Makefile
|
ELF/MIPS build fix
|
2016-05-23 17:04:14 -07:00 |
|
membarrier.c
|
|
|
|
memremap.c
|
memremap: add arch specific hook for MEMREMAP_WB mappings
|
2016-04-04 10:26:41 +02:00 |
|
module-internal.h
|
|
|
|
module.c
|
module: preserve Elf information for livepatch modules
|
2016-04-01 15:00:10 +02:00 |
|
module_signing.c
|
KEYS: Move the point of trust determination to __key_link()
|
2016-04-11 22:43:43 +01:00 |
|
notifier.c
|
|
|
|
nsproxy.c
|
cgroup: introduce cgroup namespaces
|
2016-02-16 13:04:58 -05:00 |
|
padata.c
|
kernel/padata.c: hide unused functions
|
2016-05-19 19:12:14 -07:00 |
|
panic.c
|
printk/nmi: flush NMI messages on the system panic
|
2016-05-20 17:58:30 -07:00 |
|
params.c
|
|
|
|
pid.c
|
remove lots of IS_ERR_VALUE abuses
|
2016-05-27 15:26:11 -07:00 |
|
pid_namespace.c
|
|
|
|
profile.c
|
profile: hide unused functions when !CONFIG_PROC_FS
|
2016-03-22 15:36:02 -07:00 |
|
ptrace.c
|
ptrace: change __ptrace_unlink() to clear ->ptrace under ->siglock
|
2016-03-22 15:36:02 -07:00 |
|
range.c
|
|
|
|
reboot.c
|
|
|
|
relay.c
|
kernel/relay.c: fix potential memory leak
|
2016-06-09 14:23:11 -07:00 |
|
resource.c
|
/proc/iomem: only expose physical resource addresses to privileged users
|
2016-04-14 12:56:09 -07:00 |
|
seccomp.c
|
Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
|
2016-05-19 10:02:26 -07:00 |
|
signal.c
|
kernel/signal.c: convert printk(KERN_<LEVEL> ...) to pr_<level>(...)
|
2016-05-23 17:04:14 -07:00 |
|
smp.c
|
Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
|
2016-03-15 13:50:29 -07:00 |
|
smpboot.c
|
cpu/hotplug: Unpark smpboot threads from the state machine
|
2016-03-01 20:36:56 +01:00 |
|
smpboot.h
|
cpu/hotplug: Create hotplug threads
|
2016-03-01 20:36:56 +01:00 |
|
softirq.c
|
arch, ftrace: for KASAN put hard/soft IRQ entries into separate sections
|
2016-03-25 16:37:42 -07:00 |
|
stacktrace.c
|
|
|
|
stop_machine.c
|
kernel/stop_machine.c: remove CONFIG_SMP dependencies
|
2016-01-16 11:17:24 -08:00 |
|
sys.c
|
prctl: make PR_SET_THP_DISABLE wait for mmap_sem killable
|
2016-05-23 17:04:14 -07:00 |
|
sys_ni.c
|
vfs: add copy_file_range syscall and vfs helper
|
2015-12-01 14:00:53 -05:00 |
|
sysctl.c
|
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
|
2016-05-25 17:05:40 -07:00 |
|
sysctl_binary.c
|
kernel/sysctl_binary.c: use generic UUID library
|
2016-05-20 17:58:30 -07:00 |
|
task_work.c
|
|
|
|
taskstats.c
|
taskstats: use the libnl API to align nlattr on 64-bit
|
2016-04-23 20:13:25 -04:00 |
|
test_kprobes.c
|
|
|
|
torture.c
|
rcutorture: Dump trace buffer upon shutdown
|
2016-04-21 13:47:04 -07:00 |
|
tracepoint.c
|
kernel/...: convert pr_warning to pr_warn
|
2016-03-22 15:36:02 -07:00 |
|
tsacct.c
|
time, acct: Drop irq save & restore from __acct_update_integrals()
|
2016-02-29 09:53:09 +01:00 |
|
uid16.c
|
|
|
|
up.c
|
|
|
|
user-return-notifier.c
|
|
|
|
user.c
|
|
|
|
user_namespace.c
|
kernel/*: switch to memdup_user_nul()
|
2016-01-04 10:27:55 -05:00 |
|
utsname.c
|
|
|
|
utsname_sysctl.c
|
|
|
|
watchdog.c
|
watchdog: don't run proc_watchdog_update if new value is same as old
|
2016-03-17 15:09:34 -07:00 |
|
workqueue.c
|
debugobjects: insulate non-fixup logic related to static obj from fixup callbacks
|
2016-05-19 19:12:14 -07:00 |
|
workqueue_internal.h
|
sched/core: Get rid of 'cpu' argument in wq_worker_sleeping()
|
2016-03-02 10:28:47 -05:00 |