All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matt Mackall <mpm@selenic.com>
To: "David S. Miller" <davem@davemloft.net>
Cc: Colin Leroy <colin@colino.net>, akpm@osdl.org, netdev@oss.sgi.com
Subject: Re: [PATCH] Prevent netpoll hanging when link is down
Date: Thu, 7 Oct 2004 13:41:41 -0500	[thread overview]
Message-ID: <20041007184141.GL31237@waste.org> (raw)
In-Reply-To: <20041007112846.5c85b2d9.davem@davemloft.net>

On Thu, Oct 07, 2004 at 11:28:46AM -0700, David S. Miller wrote:
> 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()

Colin, feeling adventurous enough to take a stab at this? It looks
pretty straightforward but I'm going to be even more useless than
usual for the next two weeks.

> 
> 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;
> 		}

-- 
Mathematics is the supreme nostalgia of our time.

  reply	other threads:[~2004-10-07 18:41 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
2004-10-07 18:41           ` Matt Mackall [this message]
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=20041007184141.GL31237@waste.org \
    --to=mpm@selenic.com \
    --cc=akpm@osdl.org \
    --cc=colin@colino.net \
    --cc=davem@davemloft.net \
    --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.