From: "Vegard Nossum" <vegard.nossum@gmail.com>
To: "Alexey Dobriyan" <adobriyan@gmail.com>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
"Jeff Garzik" <jgarzik@pobox.com>
Subject: Re: [RFC][PATCH] netconsole: avoid deadlock on printk from driver code
Date: Wed, 13 Aug 2008 12:21:38 +0200 [thread overview]
Message-ID: <19f34abd0808130321y1596a455qfffb49b0a039d2d6@mail.gmail.com> (raw)
In-Reply-To: <20080813095942.GA9145@martell.zuzino.mipt.ru>
(Hm, did my original e-mail not make it to the lists?)
>> The least invasive fix is to detect that we're trying to re-enter the
>> driver code. We provide a netdev_busy() function which can be used to
>> determine whether a deadlock can occur if we try to transmit another
>> packet.
>>
>> Note that this may lead to lost messages if the driver is active on
>> another CPU while we try to use the same device for netconsole.
>
> This sucks.
Indeed. What can be done about it?
>> It would probably be best to set a "lost messages" flag in this case and
>> add it to the stream when the device becomes ready again.
With such a flag, we can at least avoid silent loss of messages. But
what is the likelihood of this happening in the first place? I have no
idea.
I still think that this is better than a possible deadlock, which
gives NO CLUE as to what happened (because it jams the other
consoles). Hopefully the interface will not be used for other traffic.
But I agree. This possibly penalizes all the other cases where people
*don't* pull out their netconsole-device cables.
We could simply not print out the "link up/down" message if the device
is running netconsole. But it feels like papering over the design
error. Because there are other functions in there which may cause
additional messages to be printed, not just the very visible printk().
Can we detect if the lock was taken on the same CPU or not?
Maybe it is possible to postpone the packet instead of discarding it?
>> +static bool rtl8139_busy (struct net_device *dev)
>> +{
>> + struct rtl8139_private *tp = netdev_priv(dev);
>> + return spin_is_locked(&tp->lock);
>> +}
>
> How do I know if my driver is suspectible to this sort of deadlock?
if the ->hard_start_xmit() takes any locks which can be taken from any
code that calls (also indirectly!) printk(), in this case the
interrupt handler that is invoked when I replace the cable. My guess
is that _all_ drivers need to take some sort of lock in
hard_start_xmit().
It's a bit fragile, I agree. But the completely silent deadlock is nasty too!
Vegard
--
"The animistic metaphor of the bug that maliciously sneaked in while
the programmer was not looking is intellectually dishonest as it
disguises that the error is the programmer's own creation."
-- E. W. Dijkstra, EWD1036
next prev parent reply other threads:[~2008-08-13 10:22 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-13 9:53 Vegard Nossum
2008-08-13 9:59 ` Alexey Dobriyan
2008-08-13 10:21 ` Vegard Nossum [this message]
2008-08-13 10:29 ` David Miller
2008-08-13 10:44 ` Vegard Nossum
2008-08-13 10:56 ` David Miller
2008-08-13 10:37 ` David Miller
2008-08-14 13:28 ` Pekka Enberg
2008-08-14 13:44 ` Pekka J Enberg
2008-08-14 22:15 ` David Miller
2008-08-20 17:54 ` Pekka J Enberg
2008-08-20 19:56 ` Vegard Nossum
2008-08-20 20:58 ` David Miller
2008-08-14 22:13 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=19f34abd0808130321y1596a455qfffb49b0a039d2d6@mail.gmail.com \
--to=vegard.nossum@gmail.com \
--cc=adobriyan@gmail.com \
--cc=jgarzik@pobox.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®