From: "David S. Miller" <davem@davemloft.net>
To: Colin Leroy <colin@colino.net>
Cc: mpm@selenic.com, akpm@osdl.org, netdev@oss.sgi.com
Subject: Re: [PATCH] Prevent netpoll hanging when link is down
Date: Thu, 7 Oct 2004 11:28:46 -0700 [thread overview]
Message-ID: <20041007112846.5c85b2d9.davem@davemloft.net> (raw)
In-Reply-To: <20041007160532.60c3f26b@pirandello>
On Thu, 7 Oct 2004 16:05:32 +0200
Colin Leroy <colin@colino.net> wrote:
> First, my newbie question: is it possible to deadlock a spinlock on a
> Uniprocessor kernel ? For example, there's something I find suspect in
> netpoll/sungem interaction:
>
Oh yes, it appears that netpoll doesn't support NETIF_F_LLTX locking,
crap :(
When a device has NETIF_F_LLTX set, it means that the driver's
dev->hard_start_xmit() routine is what takes the xmit_lock, not
the caller one level up.
Andi Kleen didn't fix up netpoll when he did his LLTX changes, oops.
So, netpoll needs to have the NETIF_F_LLTX stuff added to it.
Basically:
1) If NETIF_F_LLTX is clear, same as before
2) If NETIF_F_LLTX is set:
a) Do not take xmit_lock
b) Check ->hard_start_xmit() return value,
if it is NETDEV_TX_LOCKED, then
spin_trylock(&dev->xmit_lock) failed
in ->hard_start_xmit()
The best example is in net/sched/sch_generic.c:qdisc_restart()
unsigned nolock = (dev->features & NETIF_F_LLTX);
/*
* When the driver has LLTX set it does its own locking
* in start_xmit. No need to add additional overhead by
* locking again. These checks are worth it because
* even uncongested locks can be quite expensive.
* The driver can do trylock like here too, in case
* of lock congestion it should return -1 and the packet
* will be requeued.
*/
if (!nolock) {
if (!spin_trylock(&dev->xmit_lock)) {
collision:
/* So, someone grabbed the driver. */
/* It may be transient configuration error,
when hard_start_xmit() recurses. We detect
it by checking xmit owner and drop the
packet when deadloop is detected.
*/
if (dev->xmit_lock_owner == smp_processor_id()) {
kfree_skb(skb);
if (net_ratelimit())
printk(KERN_DEBUG "Dead loop on netdevice %s, fix it urgently!\n", dev->name);
return -1;
}
__get_cpu_var(netdev_rx_stat).cpu_collision++;
goto requeue;
}
/* Remember that the driver is grabbed by us. */
dev->xmit_lock_owner = smp_processor_id();
}
{
/* And release queue */
spin_unlock(&dev->queue_lock);
if (!netif_queue_stopped(dev)) {
int ret;
if (netdev_nit)
dev_queue_xmit_nit(skb, dev);
ret = dev->hard_start_xmit(skb, dev);
if (ret == NETDEV_TX_OK) {
if (!nolock) {
dev->xmit_lock_owner = -1;
spin_unlock(&dev->xmit_lock);
}
spin_lock(&dev->queue_lock);
return -1;
}
if (ret == NETDEV_TX_LOCKED && nolock) {
spin_lock(&dev->queue_lock);
goto collision;
}
}
/* NETDEV_TX_BUSY - we need to requeue */
/* Release the driver */
if (!nolock) {
dev->xmit_lock_owner = -1;
spin_unlock(&dev->xmit_lock);
}
spin_lock(&dev->queue_lock);
q = dev->qdisc;
}
next prev parent reply other threads:[~2004-10-07 18:28 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20041006232544.53615761@jack.colino.net>
2004-10-06 21:43 ` [PATCH] Prevent netpoll hanging when link is down Matt Mackall
2004-10-07 5:53 ` Colin Leroy
2004-10-07 6:49 ` David S. Miller
2004-10-07 8:33 ` Colin Leroy
2004-10-07 8:45 ` Colin Leroy
2004-10-07 14:05 ` Colin Leroy
2004-10-07 18:28 ` David S. Miller [this message]
2004-10-07 18:41 ` Matt Mackall
2004-10-07 20:00 ` Colin Leroy
2004-10-07 18:43 ` Andi Kleen
2004-10-07 20:44 ` Colin Leroy
2004-10-07 21:45 ` Andi Kleen
2004-10-07 21:50 ` Matt Mackall
2004-10-07 22:07 ` David S. Miller
2004-10-07 23:43 ` Matt Mackall
2004-10-07 23:50 ` Andi Kleen
2004-10-08 6:46 ` Colin Leroy
2004-10-08 21:53 ` Matt Mackall
2004-10-08 7:06 ` Colin Leroy
2004-10-08 22:00 ` Matt Mackall
2004-10-08 22:18 ` Andrew Morton
2004-10-11 3:59 ` David S. Miller
2004-10-11 15:40 ` Andi Kleen
2004-10-11 16:22 ` Matt Mackall
2004-10-11 16:32 ` Andi Kleen
2004-10-11 16:36 ` Matt Mackall
2004-10-11 16:43 ` Andi Kleen
2004-10-11 16:58 ` Matt Mackall
2004-10-11 17:41 ` Andi Kleen
2004-10-11 20:45 ` Colin Leroy
[not found] ` <5cac192f0410181443303379e2@mail.gmail.com>
[not found] ` <5cac192f041018145824acce5a@mail.gmail.com>
[not found] ` <20041020161119.6e30efe5@pirandello>
[not found] ` <5cac192f0410200848179ccc81@mail.gmail.com>
2004-10-21 16:36 ` Colin Leroy
2004-10-24 15:22 ` Eric Lemoine
2004-10-07 22:08 ` David S. Miller
2004-10-08 6:54 ` Colin Leroy
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=20041007112846.5c85b2d9.davem@davemloft.net \
--to=davem@davemloft.net \
--cc=akpm@osdl.org \
--cc=colin@colino.net \
--cc=mpm@selenic.com \
--cc=netdev@oss.sgi.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.