• H
    trace: disable preemption before taking raw spinlocks · 5b6045a9
    Heiko Carstens 提交于
    s390 code uses smp_processor_id() in __raw_spin_lock() code which
    reveals that a (raw) spinlock is taken without preemption disabled.
    This can potentially deadlock.
    
    To fix this explicitly disable and enable preemption.
    
    BUG: using smp_processor_id() in preemptible [00000000] code: cat/2278
    caller is trace_find_cmdline+0x40/0xfc
    CPU: 0 Not tainted 2.6.30-rc7-dirty #39
    Process cat (pid: 2278, task: 000000003faedb68, ksp: 000000003b33b988)
    000000003b33b988 000000003b33bae0 0000000000000002 0000000000000000
           000000003b33bb80 000000003b33baf8 000000003b33baf8 00000000000175d6
           0000000000000001 000000003b33b988 000000003f9b0000 000000000000000b
           000000000000000c 000000003b33bb40 000000003b33bae0 0000000000000000
           0000000000000000 00000000000175d6 000000003b33bae0 000000003b33bb28
    Call Trace:
    ([<00000000000174b2>] show_trace+0x112/0x170)
     [<0000000000017582>] show_stack+0x72/0x100
     [<0000000000441538>] dump_stack+0xc8/0xd8
     [<000000000025c350>] debug_smp_processor_id+0x114/0x130
     [<00000000000bf0e4>] trace_find_cmdline+0x40/0xfc
     [<00000000000c35d4>] trace_print_context+0x58/0xac
     [<00000000000bb676>] print_trace_line+0x416/0x470
     [<00000000000bc8fe>] s_show+0x4e/0x428
     [<000000000013834e>] seq_read+0x36a/0x5d4
     [<0000000000112a78>] vfs_read+0xc8/0x174
     [<0000000000112c58>] SyS_read+0x74/0xc4
     [<000000000002c7ae>] sysc_noemu+0x10/0x16
     [<000002000012436c>] 0x2000012436c
    1 lock held by cat/2278:
     #0:  (&p->lock){+.+.+.}, at: [<0000000000138056>] seq_read+0x72/0x5d4
    
    [ Impact: fix preempt-unsafe raw spinlock ]
    Signed-off-by: NHeiko Carstens <heiko.carstens@de.ibm.com>
    Acked-by: NSteven Rostedt <rostedt@goodmis.org>
    Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
    5b6045a9
trace.c 98.0 KB