LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* bug: ftrace & lockdep badness
@ 2008-11-05 12:37 Heiko Carstens
2008-11-05 13:07 ` Steven Rostedt
2008-11-05 16:04 ` Steven Rostedt
0 siblings, 2 replies; 8+ messages in thread
From: Heiko Carstens @ 2008-11-05 12:37 UTC (permalink / raw)
To: Steven Rostedt; +Cc: Ingo Molnar, Peter Zijlstra, linux-kernel
Hi Steven,
enabling preemptirqsoff tracing gives me this on a lockdep enabled kernel:
Badness at kernel/lockdep.c:2894
Modules linked in:
CPU: 0 Not tainted 2.6.28-rc3-00031-ga75952b-dirty #72
Process sshd (pid: 2542, task: 000000003397d7a8, ksp: 0000000033abb618)
Krnl PSW : 0404c00180000000 0000000000078770 (check_flags+0x12c/0x160)
R:0 T:1 IO:0 EX:0 Key:0 M:1 W:0 P:0 AS:3 CC:0 PM:0 EA:3
Krnl GPRS: 0000000000000000 0000000000dcda88 0000000000000000 000000000000000f
0000000000000000 0000000000000000 0000000000000002 0000000000000000
0000000000000000 0000000000000000 000000003fe7d428 0000000033abb170
0000000000557fb8 000000000038b210 0000000000078758 0000000033abb170
Krnl Code: 0000000000078764: bf2f1000 icm %r2,15,0(%r1)
0000000000078768: a774ffa7 brc 7,786b6
000000000007876c: a7f40001 brc 15,7876e
>0000000000078770: a7f4ffa3 brc 15,786b6
0000000000078774: c0e5000a53ea brasl %r14,1c2f48
000000000007877a: 1222 ltr %r2,%r2
000000000007877c: a784000b brc 8,78792
0000000000078780: c010006aa984 larl %r1,dcda88
Call Trace:
([<0000000033abb188>] 0x33abb188)
[<000000000007e76a>] lock_acquire+0x52/0xbc
[<000000000037618c>] _spin_lock_irqsave+0x6c/0xb0
[<000000000009d52e>] ring_buffer_reset_cpu+0x6e/0x114
[<00000000000a46c0>] tracing_reset+0x84/0xe8
[<00000000000a5632>] trace_preempt_off+0x112/0x178
[<0000000000378888>] add_preempt_count+0xa4/0x130
[<00000000000539e0>] __local_bh_disable+0x54/0xcc
[<0000000000053a82>] local_bh_disable+0x2a/0x38
[<0000000000376002>] _spin_lock_bh+0x2e/0xa4
[<00000000002a1baa>] lock_sock_nested+0x4a/0x118
[<00000000002e9e86>] tcp_sendmsg+0x42/0xdc0
[<000000000029cd3c>] sock_aio_write+0x130/0x180
[<00000000000ea36c>] do_sync_write+0xdc/0x134
[<00000000000eafe8>] vfs_write+0x154/0x15c
[<00000000000eb106>] sys_write+0x52/0xa8
[<000000000002a950>] sys32_write+0x2c/0x4c
[<0000000000026f80>] sysc_noemu+0x10/0x16
[<0000000077c5c186>] 0x77c5c186
INFO: lockdep is turned off.
Seems to be that the following happens:
__local_bh_disable() calls add_preempt_count() which adds something to
preempt_count().
After this addition softirq_count() will return something != 0.
However current->softirqs_enabled is still 1 since we haven't called
trace_softirqs_off() yet.
But we call trace_preempt_off() instead which will grab a lock in the
ringbuffer code and that will trigger this check in lockdep.c:
if (!hardirq_count()) {
if (softirq_count())
DEBUG_LOCKS_WARN_ON(current->softirqs_enabled);
I assume this is a known bug. Is there any fix available?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: bug: ftrace & lockdep badness
2008-11-05 12:37 bug: ftrace & lockdep badness Heiko Carstens
@ 2008-11-05 13:07 ` Steven Rostedt
2008-11-05 16:04 ` Steven Rostedt
1 sibling, 0 replies; 8+ messages in thread
From: Steven Rostedt @ 2008-11-05 13:07 UTC (permalink / raw)
To: Heiko Carstens; +Cc: Ingo Molnar, Peter Zijlstra, linux-kernel
On Wed, 5 Nov 2008, Heiko Carstens wrote:
> enabling preemptirqsoff tracing gives me this on a lockdep enabled kernel:
>
> Badness at kernel/lockdep.c:2894
> Modules linked in:
> CPU: 0 Not tainted 2.6.28-rc3-00031-ga75952b-dirty #72
> Process sshd (pid: 2542, task: 000000003397d7a8, ksp: 0000000033abb618)
> Krnl PSW : 0404c00180000000 0000000000078770 (check_flags+0x12c/0x160)
> R:0 T:1 IO:0 EX:0 Key:0 M:1 W:0 P:0 AS:3 CC:0 PM:0 EA:3
> Krnl GPRS: 0000000000000000 0000000000dcda88 0000000000000000 000000000000000f
> 0000000000000000 0000000000000000 0000000000000002 0000000000000000
> 0000000000000000 0000000000000000 000000003fe7d428 0000000033abb170
> 0000000000557fb8 000000000038b210 0000000000078758 0000000033abb170
> Krnl Code: 0000000000078764: bf2f1000 icm %r2,15,0(%r1)
> 0000000000078768: a774ffa7 brc 7,786b6
> 000000000007876c: a7f40001 brc 15,7876e
> >0000000000078770: a7f4ffa3 brc 15,786b6
> 0000000000078774: c0e5000a53ea brasl %r14,1c2f48
> 000000000007877a: 1222 ltr %r2,%r2
> 000000000007877c: a784000b brc 8,78792
> 0000000000078780: c010006aa984 larl %r1,dcda88
> Call Trace:
> ([<0000000033abb188>] 0x33abb188)
> [<000000000007e76a>] lock_acquire+0x52/0xbc
> [<000000000037618c>] _spin_lock_irqsave+0x6c/0xb0
> [<000000000009d52e>] ring_buffer_reset_cpu+0x6e/0x114
> [<00000000000a46c0>] tracing_reset+0x84/0xe8
> [<00000000000a5632>] trace_preempt_off+0x112/0x178
> [<0000000000378888>] add_preempt_count+0xa4/0x130
> [<00000000000539e0>] __local_bh_disable+0x54/0xcc
> [<0000000000053a82>] local_bh_disable+0x2a/0x38
> [<0000000000376002>] _spin_lock_bh+0x2e/0xa4
> [<00000000002a1baa>] lock_sock_nested+0x4a/0x118
> [<00000000002e9e86>] tcp_sendmsg+0x42/0xdc0
> [<000000000029cd3c>] sock_aio_write+0x130/0x180
> [<00000000000ea36c>] do_sync_write+0xdc/0x134
> [<00000000000eafe8>] vfs_write+0x154/0x15c
> [<00000000000eb106>] sys_write+0x52/0xa8
> [<000000000002a950>] sys32_write+0x2c/0x4c
> [<0000000000026f80>] sysc_noemu+0x10/0x16
> [<0000000077c5c186>] 0x77c5c186
> INFO: lockdep is turned off.
>
> Seems to be that the following happens:
>
> __local_bh_disable() calls add_preempt_count() which adds something to
> preempt_count().
> After this addition softirq_count() will return something != 0.
> However current->softirqs_enabled is still 1 since we haven't called
> trace_softirqs_off() yet.
> But we call trace_preempt_off() instead which will grab a lock in the
> ringbuffer code and that will trigger this check in lockdep.c:
>
> if (!hardirq_count()) {
> if (softirq_count())
> DEBUG_LOCKS_WARN_ON(current->softirqs_enabled);
>
> I assume this is a known bug. Is there any fix available?
Actually this is the first time that I've seen this. I'm off to school,
and will look at this when I get back (around 10:30 EST).
-- Steve
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: bug: ftrace & lockdep badness
2008-11-05 12:37 bug: ftrace & lockdep badness Heiko Carstens
2008-11-05 13:07 ` Steven Rostedt
@ 2008-11-05 16:04 ` Steven Rostedt
2008-11-05 16:30 ` Ingo Molnar
1 sibling, 1 reply; 8+ messages in thread
From: Steven Rostedt @ 2008-11-05 16:04 UTC (permalink / raw)
To: Heiko Carstens; +Cc: Ingo Molnar, Peter Zijlstra, linux-kernel
On Wed, 5 Nov 2008, Heiko Carstens wrote:
> Hi Steven,
>
> enabling preemptirqsoff tracing gives me this on a lockdep enabled kernel:
>
> Badness at kernel/lockdep.c:2894
[...]
> Call Trace:
> ([<0000000033abb188>] 0x33abb188)
> [<000000000007e76a>] lock_acquire+0x52/0xbc
> [<000000000037618c>] _spin_lock_irqsave+0x6c/0xb0
> [<000000000009d52e>] ring_buffer_reset_cpu+0x6e/0x114
> [<00000000000a46c0>] tracing_reset+0x84/0xe8
> [<00000000000a5632>] trace_preempt_off+0x112/0x178
> [<0000000000378888>] add_preempt_count+0xa4/0x130
> [<00000000000539e0>] __local_bh_disable+0x54/0xcc
> [<0000000000053a82>] local_bh_disable+0x2a/0x38
[...]
> Seems to be that the following happens:
>
> __local_bh_disable() calls add_preempt_count() which adds something to
> preempt_count().
> After this addition softirq_count() will return something != 0.
> However current->softirqs_enabled is still 1 since we haven't called
> trace_softirqs_off() yet.
> But we call trace_preempt_off() instead which will grab a lock in the
> ringbuffer code and that will trigger this check in lockdep.c:
>
> if (!hardirq_count()) {
> if (softirq_count())
> DEBUG_LOCKS_WARN_ON(current->softirqs_enabled);
>
> I assume this is a known bug. Is there any fix available?
Yes, this does seem to be the case.
Perhaps Peter or Ingo can come up with some ideas on how to solve this.
Let me try to rephrase the problem.
In __local_bh_disable() we call add_preempt_count(SOFTIRQ_OFFSET)
in add_preempt_count (in sched.c)
preempt_count() += val;
if (preempt_count() == val)
trace_preempt_off(...)
in trace_preempt_off we record into the ring buffer. But the ring buffer
will call spin_lock_irqsave (it use to be raw_spin_lock, where this was
not an issue). Note, there is development to make the ring buffer
lockless, but until that time, we need to come up with a real solution.
Now we enter the lockdep code, but we are not in a full state transition
and we get a WARN_ON triggered by the lockdep code (have SOFTIRQ_OFFSET
set but we did not yet tell lockdep we are in a softirq).
This is the type of problems we deal with when we have the tracer tracing
lockdep code at the same time the lockdep code is checking the tracer.
-- Steve
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: bug: ftrace & lockdep badness
2008-11-05 16:04 ` Steven Rostedt
@ 2008-11-05 16:30 ` Ingo Molnar
2008-11-05 16:47 ` Steven Rostedt
0 siblings, 1 reply; 8+ messages in thread
From: Ingo Molnar @ 2008-11-05 16:30 UTC (permalink / raw)
To: Steven Rostedt; +Cc: Heiko Carstens, Peter Zijlstra, linux-kernel
* Steven Rostedt <rostedt@goodmis.org> wrote:
> This is the type of problems we deal with when we have the tracer
> tracing lockdep code at the same time the lockdep code is checking
> the tracer.
ok ... you are right, i guess we need to go back to raw locks after
all?
Ingo
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: bug: ftrace & lockdep badness
2008-11-05 16:30 ` Ingo Molnar
@ 2008-11-05 16:47 ` Steven Rostedt
2008-11-05 17:01 ` Frédéric Weisbecker
2008-11-05 17:08 ` Ingo Molnar
0 siblings, 2 replies; 8+ messages in thread
From: Steven Rostedt @ 2008-11-05 16:47 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Heiko Carstens, Peter Zijlstra, linux-kernel
On Wed, 5 Nov 2008, Ingo Molnar wrote:
>
> * Steven Rostedt <rostedt@goodmis.org> wrote:
>
> > This is the type of problems we deal with when we have the tracer
> > tracing lockdep code at the same time the lockdep code is checking
> > the tracer.
>
> ok ... you are right, i guess we need to go back to raw locks after
> all?
I do like the fact that lockdep checks it too. But there's times that we
can not do that.
Perhaps we can do something in between.
Make a rb_spin_lock macro inside ring_buffer.c that can be either a
spin_lock or a raw_spin_lock. There are some tracers that must have this
as a raw (function trace, irqsoff and preemptoff), but the rest should be
fine. We can make it where the rb_spin_lock is a raw lock when any of
those three tracers are configured, and make it into a normal lock when
they are not.
This way we can still test the integrity of the ring_buffer for other
tracers. We just need to be careful when we are using function tracing or
irqs/preempt off tracing. But we need to be careful with those anyway.
-- Steve
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: bug: ftrace & lockdep badness
2008-11-05 16:47 ` Steven Rostedt
@ 2008-11-05 17:01 ` Frédéric Weisbecker
2008-11-05 17:08 ` Ingo Molnar
1 sibling, 0 replies; 8+ messages in thread
From: Frédéric Weisbecker @ 2008-11-05 17:01 UTC (permalink / raw)
To: Steven Rostedt; +Cc: Ingo Molnar, Heiko Carstens, Peter Zijlstra, linux-kernel
2008/11/5 Steven Rostedt <rostedt@goodmis.org>:
> I do like the fact that lockdep checks it too. But there's times that we
> can not do that.
>
> Perhaps we can do something in between.
>
> Make a rb_spin_lock macro inside ring_buffer.c that can be either a
> spin_lock or a raw_spin_lock. There are some tracers that must have this
> as a raw (function trace, irqsoff and preemptoff), but the rest should be
> fine. We can make it where the rb_spin_lock is a raw lock when any of
> those three tracers are configured, and make it into a normal lock when
> they are not.
But this way we won't be able to have lockdep checks when only one of
those "raw-need" tracers are
configured. Wouldn't it better to set it as a function pointer? It
would dynamically reference spin_lock or
raw_spin_lock functions depending on what tracer is currently
selected. I think that wouldn't hardly impact
the performances....
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: bug: ftrace & lockdep badness
2008-11-05 16:47 ` Steven Rostedt
2008-11-05 17:01 ` Frédéric Weisbecker
@ 2008-11-05 17:08 ` Ingo Molnar
2008-11-05 17:13 ` Steven Rostedt
1 sibling, 1 reply; 8+ messages in thread
From: Ingo Molnar @ 2008-11-05 17:08 UTC (permalink / raw)
To: Steven Rostedt; +Cc: Heiko Carstens, Peter Zijlstra, linux-kernel
* Steven Rostedt <rostedt@goodmis.org> wrote:
>
> On Wed, 5 Nov 2008, Ingo Molnar wrote:
>
> >
> > * Steven Rostedt <rostedt@goodmis.org> wrote:
> >
> > > This is the type of problems we deal with when we have the tracer
> > > tracing lockdep code at the same time the lockdep code is checking
> > > the tracer.
> >
> > ok ... you are right, i guess we need to go back to raw locks after
> > all?
>
> I do like the fact that lockdep checks it too. But there's times
> that we can not do that.
>
> Perhaps we can do something in between.
>
> Make a rb_spin_lock macro inside ring_buffer.c that can be either a
> spin_lock or a raw_spin_lock. There are some tracers that must have
> this as a raw (function trace, irqsoff and preemptoff), but the rest
> should be fine. We can make it where the rb_spin_lock is a raw lock
> when any of those three tracers are configured, and make it into a
> normal lock when they are not.
>
> This way we can still test the integrity of the ring_buffer for
> other tracers. We just need to be careful when we are using function
> tracing or irqs/preempt off tracing. But we need to be careful with
> those anyway.
i'd rather we not complicate this anymore and just go for raw locks
unconditionally - or no raw locks unconditionally.
Ingo
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: bug: ftrace & lockdep badness
2008-11-05 17:08 ` Ingo Molnar
@ 2008-11-05 17:13 ` Steven Rostedt
0 siblings, 0 replies; 8+ messages in thread
From: Steven Rostedt @ 2008-11-05 17:13 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Heiko Carstens, Peter Zijlstra, linux-kernel
On Wed, 5 Nov 2008, Ingo Molnar wrote:
> > >
> > > > This is the type of problems we deal with when we have the tracer
> > > > tracing lockdep code at the same time the lockdep code is checking
> > > > the tracer.
> > >
> > > ok ... you are right, i guess we need to go back to raw locks after
> > > all?
> >
> > I do like the fact that lockdep checks it too. But there's times
> > that we can not do that.
> >
> > Perhaps we can do something in between.
> >
> > Make a rb_spin_lock macro inside ring_buffer.c that can be either a
> > spin_lock or a raw_spin_lock. There are some tracers that must have
> > this as a raw (function trace, irqsoff and preemptoff), but the rest
> > should be fine. We can make it where the rb_spin_lock is a raw lock
> > when any of those three tracers are configured, and make it into a
> > normal lock when they are not.
> >
> > This way we can still test the integrity of the ring_buffer for
> > other tracers. We just need to be careful when we are using function
> > tracing or irqs/preempt off tracing. But we need to be careful with
> > those anyway.
>
> i'd rather we not complicate this anymore and just go for raw locks
> unconditionally - or no raw locks unconditionally.
OK, agree. We can have a debug patch that converts it back to normal
spinlocks that we can apply when we want to test it. But for release, we
just keep the raw_spin_locks.
-- Steve
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2008-11-05 17:13 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-11-05 12:37 bug: ftrace & lockdep badness Heiko Carstens
2008-11-05 13:07 ` Steven Rostedt
2008-11-05 16:04 ` Steven Rostedt
2008-11-05 16:30 ` Ingo Molnar
2008-11-05 16:47 ` Steven Rostedt
2008-11-05 17:01 ` Frédéric Weisbecker
2008-11-05 17:08 ` Ingo Molnar
2008-11-05 17:13 ` Steven Rostedt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).