[IA64] Must enable interrupts in do_notify_resume_user before calling tracehook_notif...
authorTony Luck <tony.luck@intel.com>
Thu, 20 Sep 2012 18:47:13 +0000 (11:47 -0700)
committerTony Luck <tony.luck@intel.com>
Thu, 20 Sep 2012 18:47:13 +0000 (11:47 -0700)
If we call with interrupts disabled, we'll be hit with:

WARNING: at kernel/softirq.c:160 local_bh_enable_ip+0x150/0x180() and a stack
trace like this:

Call Trace:
 [<a000000100015480>] show_stack+0x80/0xa0
 [<a000000100d9a520>] dump_stack+0x30/0x50
 [<a000000100072fc0>] warn_slowpath_common+0xc0/0x100
 [<a000000100073040>] warn_slowpath_null+0x40/0x60
 [<a0000001000884d0>] local_bh_enable_ip+0x150/0x180
 [<a000000100da2960>] _raw_write_unlock_bh+0x40/0x60
 [<a000000100cf03c0>] unix_release_sock+0x120/0x5a0
 [<a000000100cf0880>] unix_release+0x40/0x60
 [<a000000100b84400>] sock_release+0x60/0x1a0
 [<a000000100b84b70>] sock_close+0x30/0xa0
 [<a0000001001d10f0>] __fput+0x190/0x500
 [<a0000001001d1580>] ____fput+0x20/0x40
 [<a0000001000b6570>] task_work_run+0x1b0/0x260
 [<a000000100015190>] do_notify_resume_user+0x110/0x2a0
 [<a00000010000c5a0>] notify_resume_user+0x40/0x60
 [<a00000010000c4d0>] skip_rbs_switch+0xe0/0xf0
 [<a000000000040720>] ia64_ivt+0xffffffff00040720/0x400

Fix-suggested-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Tony Luck <tony.luck@intel.com>
arch/ia64/kernel/process.c

index dd6fc14497419dca929be82a44b55ce638bc4705..cf84a2f37c139e87804de9aa735c4c7835a2d2ef 100644 (file)
@@ -196,8 +196,8 @@ do_notify_resume_user(sigset_t *unused, struct sigscratch *scr, long in_syscall)
                ia64_do_signal(scr, in_syscall);
        }
 
-       if (test_thread_flag(TIF_NOTIFY_RESUME)) {
-               clear_thread_flag(TIF_NOTIFY_RESUME);
+       if (test_and_clear_thread_flag(TIF_NOTIFY_RESUME)) {
+               local_irq_enable();     /* force interrupt enable */
                tracehook_notify_resume(&scr->pt);
        }