Heiko Carstens
5b6045a906
trace: disable preemption before taking raw spinlocks
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: Heiko Carstens <heiko.carstens@de.ibm.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
|
2009-05-28 01:21:03 +02:00 |
| .. |
|
blktrace.c
|
blktrace: remove debugfs entries on bad path
|
2009-05-19 10:29:21 +02:00 |
|
ftrace.c
|
tracing: fix check for return value of register_module_notifier
|
2009-05-18 10:24:13 +02:00 |
|
Kconfig
|
ftrace: Add task_comm support for trace_event
|
2009-05-26 03:03:21 +02:00 |
|
kmemtrace.c
|
tracing/filters: use ring_buffer_discard_commit() in filter_check_discard()
|
2009-04-14 00:00:56 +02:00 |
|
Makefile
|
Merge branch 'tracing/hw-branch-tracing' into tracing/core
|
2009-05-07 13:36:22 +02:00 |
|
ring_buffer.c
|
ring-buffer: move code around to remove some branches
|
2009-05-11 23:33:06 -04:00 |
|
ring_buffer_benchmark.c
|
ring-buffer: check for divide by zero in ring-buffer-benchmark
|
2009-05-11 13:22:26 -04:00 |
|
trace.c
|
trace: disable preemption before taking raw spinlocks
|
2009-05-28 01:21:03 +02:00 |
|
trace.h
|
Merge branch 'tracing/hw-branch-tracing' into tracing/core
|
2009-05-07 13:36:22 +02:00 |
|
trace_boot.c
|
tracing: use macros to denote usec and nsec per second
|
2009-04-07 14:43:06 +02:00 |
|
trace_branch.c
|
Merge branch 'linus' into tracing/core
|
2009-05-07 11:17:34 +02:00 |
|
trace_clock.c
|
tracing: fix four sparse warnings
|
2009-03-22 18:16:54 +01:00 |
|
trace_event_profile.c
|
tracing/events: fix concurrent access to ftrace_events list
|
2009-05-06 10:38:19 +02:00 |
|
trace_event_types.h
|
tracing/filters: distinguish between signed and unsigned fields
|
2009-04-29 14:06:03 +02:00 |
|
trace_events.c
|
ftrace: clean up of using ftrace_event_enable_disable()
|
2009-05-26 03:30:31 +02:00 |
|
trace_events_filter.c
|
tracing/filters: fix off-by-one bug
|
2009-05-14 23:55:12 -04:00 |
|
trace_export.c
|
tracing/filters: distinguish between signed and unsigned fields
|
2009-04-29 14:06:03 +02:00 |
|
trace_functions.c
|
tracing/core: use appropriate waiting on trace_pipe
|
2009-02-18 01:40:20 +01:00 |
|
trace_functions_graph.c
|
function-graph: add option to calculate graph time or not
|
2009-03-24 23:41:11 -04:00 |
|
trace_hw_branches.c
|
Merge branch 'tracing/hw-branch-tracing' into tracing/core
|
2009-05-07 13:36:22 +02:00 |
|
trace_irqsoff.c
|
tracing: have latency tracers set the latency format
|
2009-03-04 22:15:30 -05:00 |
|
trace_mmiotrace.c
|
tracing: use macros to denote usec and nsec per second
|
2009-04-07 14:43:06 +02:00 |
|
trace_nop.c
|
tracing/ftrace: make nop-tracer use polling wait for events on pipe
|
2009-03-23 09:22:15 +01:00 |
|
trace_output.c
|
tracing: add __print_symbolic to trace events
|
2009-05-26 20:31:50 +02:00 |
|
trace_output.h
|
tracing: add trace_event_read_lock()
|
2009-05-25 23:53:41 +02:00 |
|
trace_power.c
|
Merge branch 'linus' into tracing/core
|
2009-05-07 11:17:34 +02:00 |
|
trace_printk.c
|
tracing/ftrace: factorize the tracing files creation
|
2009-04-07 14:43:07 +02:00 |
|
trace_sched_switch.c
|
tracing/events: move trace point headers into include/trace/events
|
2009-04-14 22:05:43 -04:00 |
|
trace_sched_wakeup.c
|
tracing/wakeup: move access to wakeup_cpu into spinlock
|
2009-04-23 23:01:36 -04:00 |
|
trace_selftest.c
|
x86, hw-branch-tracer: allocate selftest iterator on heap
|
2009-04-07 13:36:21 +02:00 |
|
trace_selftest_dynamic.c
|
|
|
|
trace_stack.c
|
tracing/ftrace: factorize the tracing files creation
|
2009-04-07 14:43:07 +02:00 |
|
trace_stat.c
|
Merge branch 'linus' into tracing/core
|
2009-04-07 13:47:45 +02:00 |
|
trace_stat.h
|
tracing: add handler to trace_stat
|
2009-03-24 23:22:58 -04:00 |
|
trace_syscalls.c
|
tracing/syscalls: use a dedicated file header
|
2009-04-09 05:43:32 +02:00 |
|
trace_sysprof.c
|
tracing/ftrace: factorize the tracing files creation
|
2009-04-07 14:43:07 +02:00 |
|
trace_workqueue.c
|
Merge branch 'linus' into tracing/core
|
2009-04-07 13:47:45 +02:00 |