netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH] PATCH 1/2 [SCHED 2.6.24]: Check subqueue status before calling hard_start_xmit
@ 2007-11-14  6:04 Krishna Kumar
  2007-11-14  6:14 ` David Miller
  2007-11-15 20:57 ` Waskiewicz Jr, Peter P
  0 siblings, 2 replies; 7+ messages in thread
From: Krishna Kumar @ 2007-11-14  6:04 UTC (permalink / raw)
  To: PJ Waskiewicz; +Cc: netdev, davem, Krishna Kumar

Hi Peter,

Peter wrote on 11/13/2007 11:14:50 PM:
> @@ -134,7 +134,7 @@ static inline int qdisc_restart(struct net_device *dev)
>  {
>     struct Qdisc *q = dev->qdisc;
>     struct sk_buff *skb;
> -   int ret;
> +   int ret = NETDEV_TX_BUSY;
>  
>     /* Dequeue packet */
>     if (unlikely((skb = dev_dequeue_skb(dev, q)) == NULL))
> @@ -145,7 +145,8 @@ static inline int qdisc_restart(struct net_device *dev)
>     spin_unlock(&dev->queue_lock);
>  
>     HARD_TX_LOCK(dev, smp_processor_id());
> -   ret = dev_hard_start_xmit(skb, dev);
> +   if (!netif_subqueue_stopped(dev, skb))
> +      ret = dev_hard_start_xmit(skb, dev);
>     HARD_TX_UNLOCK(dev);

You could optimize this by getting HARD_TX_LOCK after the check. I
assume that netif_stop_subqueue (from another CPU) would always be
called by the driver xmit, and that is not possible since we hold
the __LINK_STATE_QDISC_RUNNING bit. Does that sound correct?

PATCH
------

diff -ruNp 1/net/sched/sch_generic.c 2/net/sched/sch_generic.c
--- 1/net/sched/sch_generic.c	2007-11-14 11:14:10.000000000 +0530
+++ 2/net/sched/sch_generic.c	2007-11-14 11:18:27.000000000 +0530
@@ -144,10 +144,11 @@ static inline int qdisc_restart(struct n
 	/* And release queue */
 	spin_unlock(&dev->queue_lock);
 
-	HARD_TX_LOCK(dev, smp_processor_id());
 	if (!netif_subqueue_stopped(dev, skb))
+		HARD_TX_LOCK(dev, smp_processor_id());
 		ret = dev_hard_start_xmit(skb, dev);
-	HARD_TX_UNLOCK(dev);
+		HARD_TX_UNLOCK(dev);
+	}
 
 	spin_lock(&dev->queue_lock);
 	q = dev->qdisc;

Thanks,

- KK

^ permalink raw reply	[flat|nested] 7+ messages in thread
* [PATCH] SCHED: Fix unnecesary driver entries when queue is stopped
@ 2007-11-13 17:44 PJ Waskiewicz
  2007-11-13 17:44 ` [PATCH] PATCH 1/2 [SCHED 2.6.24]: Check subqueue status before calling hard_start_xmit PJ Waskiewicz
  0 siblings, 1 reply; 7+ messages in thread
From: PJ Waskiewicz @ 2007-11-13 17:44 UTC (permalink / raw)
  To: davem; +Cc: netdev

Dave,

This patch addresses an issue with multiqueue devices and non-multiqueue
qdiscs which is causing performance issues.  This patch should be 
considered for both 2.6.23-stable and 2.6.24 upstream.  Basically, if
a driver is using the netif_*_subqueue() calls, then qdisc_restart() will
happily call hard_start_xmit() even if subqueue 0 is stopped, which is bad.
This re-adds the check for the subqueue state.

Note that this check was removed when qdisc_restart() was rewritten.  At that
time though, we didn't understand the full effect of multiqueue with respect
to the qdiscs and queue management from a driver to kernel perspective.  Since
the driver doesn't know what qdisc capabilities live above it, it needs to
decide to use the queue or subqueue functions ahead of time.  This patch is
just cleaning up a miss from that rewrite.

Patch 1 is for 2.6.24, patch 2 is for 2.6.23 stable.

Thanks,
-- 
PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2007-11-15 20:59 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-14  6:04 [PATCH] PATCH 1/2 [SCHED 2.6.24]: Check subqueue status before calling hard_start_xmit Krishna Kumar
2007-11-14  6:14 ` David Miller
2007-11-14  7:47   ` Krishna Kumar2
2007-11-14  8:28   ` Krishna Kumar2
2007-11-15 20:57 ` Waskiewicz Jr, Peter P
  -- strict thread matches above, loose matches on Subject: below --
2007-11-13 17:44 [PATCH] SCHED: Fix unnecesary driver entries when queue is stopped PJ Waskiewicz
2007-11-13 17:44 ` [PATCH] PATCH 1/2 [SCHED 2.6.24]: Check subqueue status before calling hard_start_xmit PJ Waskiewicz
2007-11-14  4:41   ` David Miller

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).