From patchwork Fri Sep 19 14:44:50 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jarek Poplawski X-Patchwork-Id: 629 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id 328C1DE00C for ; Sat, 20 Sep 2008 00:44:52 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750977AbYISOos (ORCPT ); Fri, 19 Sep 2008 10:44:48 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1750987AbYISOos (ORCPT ); Fri, 19 Sep 2008 10:44:48 -0400 Received: from ey-out-2122.google.com ([74.125.78.24]:8718 "EHLO ey-out-2122.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750927AbYISOor (ORCPT ); Fri, 19 Sep 2008 10:44:47 -0400 Received: by ey-out-2122.google.com with SMTP id 6so143977eyi.37 for ; Fri, 19 Sep 2008 07:44:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:date:from:to:cc:subject :message-id:mime-version:content-type:content-disposition :in-reply-to:user-agent; bh=+iWI+v2sN7Zw0lRDFD2iLMWKlD81p4M3IEpR0lArcfo=; b=Zj638sMw16i14jKp3OP995tEVZ24mIKiGnrtx5+VIByeC0tYnt0NAy5In9Tb8ZioIL EYuGQWzFHqkqPBoCrhYUbNHspqWB0l+pm4ijgGUEjwQsUvTApudGnyVXLCj79LOFa/Qp JO/ecdkfY4ZzifZL3qnS6/kzxPEsiQraHyRRE= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=date:from:to:cc:subject:message-id:mime-version:content-type :content-disposition:in-reply-to:user-agent; b=n4wVEDJyc6ADmVx2nn6WxlQAlzMcdMLUQ2Qc2mS3XBSsHqyInAh/EYbOb1fgNKQBAE gHY7zmORKqNyW7d+20UBNGoAQdx7Ng/yEVsYyfl+m52zfw2tdcmKMUz1Y/ie961Q8uzX sdSVzaVybGQaaborC15UUZDpv2PIlDMZiVRGA= Received: by 10.103.213.19 with SMTP id p19mr143241muq.70.1221835484886; Fri, 19 Sep 2008 07:44:44 -0700 (PDT) Received: from ami.dom.local ( [83.27.43.118]) by mx.google.com with ESMTPS id y2sm5379193mug.2.2008.09.19.07.44.41 (version=SSLv3 cipher=RC4-MD5); Fri, 19 Sep 2008 07:44:44 -0700 (PDT) Date: Fri, 19 Sep 2008 16:44:50 +0200 From: Jarek Poplawski To: David Miller Cc: Alexander Duyck , Alexander Duyck , netdev@vger.kernel.org, herbert@gondor.apana.org.au, kaber@trash.net Subject: [PATCH take2] pkt_sched: Fix TX state checking in qdisc_run() Message-ID: <20080919144450.GA2646@ami.dom.local> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20080919103225.GB9135@ff.dom.local> User-Agent: Mutt/1.5.18 (2008-05-17) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Alas this time the changelog needs more details. Sorry, Jarek P. -----------------> (take 2) pkt_sched: Fix TX state checking in qdisc_run() Current check wrongly uses the state of the first tx queue for all tx queues in case of non-default qdiscs. This patch brings back per dev __LINK_STATE_XOFF flag, which is set when all tx queues are stopped. This check is needed in qdisc_run() to avoid useless __netif_schedule() calls. The wrongness of this check was first noticed by Herbert Xu. Signed-off-by: Jarek Poplawski diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 488c56e..dc76e4b 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -271,6 +271,7 @@ struct header_ops { enum netdev_state_t { + __LINK_STATE_XOFF, __LINK_STATE_START, __LINK_STATE_PRESENT, __LINK_STATE_NOCARRIER, @@ -1043,6 +1044,7 @@ static inline void netif_tx_wake_queue(struct netdev_queue *dev_queue) static inline void netif_wake_queue(struct net_device *dev) { netif_tx_wake_queue(netdev_get_tx_queue(dev, 0)); + clear_bit(__LINK_STATE_XOFF, &dev->state); } static inline void netif_tx_wake_all_queues(struct net_device *dev) @@ -1053,6 +1055,7 @@ static inline void netif_tx_wake_all_queues(struct net_device *dev) struct netdev_queue *txq = netdev_get_tx_queue(dev, i); netif_tx_wake_queue(txq); } + clear_bit(__LINK_STATE_XOFF, &dev->state); } static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) @@ -1069,6 +1072,7 @@ static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) */ static inline void netif_stop_queue(struct net_device *dev) { + set_bit(__LINK_STATE_XOFF, &dev->state); netif_tx_stop_queue(netdev_get_tx_queue(dev, 0)); } @@ -1076,6 +1080,7 @@ static inline void netif_tx_stop_all_queues(struct net_device *dev) { unsigned int i; + set_bit(__LINK_STATE_XOFF, &dev->state); for (i = 0; i < dev->num_tx_queues; i++) { struct netdev_queue *txq = netdev_get_tx_queue(dev, i); netif_tx_stop_queue(txq); @@ -1095,7 +1100,7 @@ static inline int netif_tx_queue_stopped(const struct netdev_queue *dev_queue) */ static inline int netif_queue_stopped(const struct net_device *dev) { - return netif_tx_queue_stopped(netdev_get_tx_queue(dev, 0)); + return test_bit(__LINK_STATE_XOFF, &dev->state); } static inline int netif_tx_queue_frozen(const struct netdev_queue *dev_queue) diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index b786a5b..1718a60 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h @@ -90,9 +90,7 @@ extern void __qdisc_run(struct Qdisc *q); static inline void qdisc_run(struct Qdisc *q) { - struct netdev_queue *txq = q->dev_queue; - - if (!netif_tx_queue_stopped(txq) && + if (!netif_queue_stopped(qdisc_dev(q)) && !test_and_set_bit(__QDISC_STATE_RUNNING, &q->state)) __qdisc_run(q); }