clocksource: Resume clocksource without taking the clocksource mutex
git commit
75c5158f70c065b9 converted the clocksource spinlock to a
mutex. This causes the following BUG:
BUG: sleeping function called from invalid context at
kernel/mutex.c:280 in_atomic(): 0, irqs_disabled(): 1, pid: 2473,
name: pm-suspend 2 locks held by pm-suspend/2473:
#0: (&buffer->mutex){......}, at: [<
ffffffff8115ab13>]
sysfs_write_file+0x3c/0x137
#1: (pm_mutex){......}, at: [<
ffffffff810865b5>]
enter_state+0x39/0x130 Pid: 2473, comm: pm-suspend Not tainted 2.6.31
#1 Call Trace:
[<
ffffffff810792f0>] ? __debug_show_held_locks+0x22/0x24
[<
ffffffff8104a2ef>] __might_sleep+0x107/0x10b
[<
ffffffff8141fca9>] mutex_lock_nested+0x25/0x43
[<
ffffffff81073537>] clocksource_resume+0x1c/0x60
[<
ffffffff81072902>] timekeeping_resume+0x1e/0x1c8
[<
ffffffff812aee62>] __sysdev_resume+0x25/0xcf
[<
ffffffff812aef79>] sysdev_resume+0x6d/0xae
[<
ffffffff810864f8>] suspend_devices_and_enter+0x12b/0x1af
[<
ffffffff8108665b>] enter_state+0xdf/0x130
[<
ffffffff81085dc3>] state_store+0xb6/0xd3
[<
ffffffff81204c73>] kobj_attr_store+0x17/0x19
[<
ffffffff8115abd2>] sysfs_write_file+0xfb/0x137
[<
ffffffff811057d2>] vfs_write+0xae/0x10b
[<
ffffffff81208392>] ? __up_read+0x1a/0x7f
[<
ffffffff811058ef>] sys_write+0x4a/0x6e
[<
ffffffff81011b82>] system_call_fastpath+0x16/0x1b
clocksource_resume is called early in the resume process, there is
only one cpu, no processes are running and the interrupts are
disabled. It is therefore possible to resume the clocksources
without taking the clocksource mutex.
Reported-by: Xiaotian Feng <xtfeng@gmail.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Tested-by: Michal Schmidt <mschmidt@redhat.com>
Cc: Xiaotian Feng <xtfeng@gmail.com>
Cc: John Stultz <johnstul@us.ibm.com>
LKML-Reference: <
20090924172952.
49697825@mschwide.boeblingen.de.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>