From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from fk-out-0910.google.com ([209.85.128.187]:32455 "EHLO fk-out-0910.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752761AbYGNLoU (ORCPT ); Mon, 14 Jul 2008 07:44:20 -0400 Received: by fk-out-0910.google.com with SMTP id 18so2834382fkq.5 for ; Mon, 14 Jul 2008 04:44:19 -0700 (PDT) Date: Mon, 14 Jul 2008 11:49:13 +0000 From: Jarek Poplawski To: David Miller Cc: netdev@vger.kernel.org, vinay@linux.vnet.ibm.com, krkumar2@in.ibm.com, mchan@broadcom.com, Matheos.Worku@Sun.COM, linux-wireless@vger.kernel.org Subject: Re: [PATCH 11/39]: netdev: Move next_sched into struct netdev_queue. Message-ID: <20080714114913.GA4504@ff.dom.local> (sfid-20080714_134425_033452_E445713F) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <20080703.000333.199735542.davem@davemloft.net> Sender: linux-wireless-owner@vger.kernel.org List-ID: On 03-07-2008 09:03, David Miller wrote: > We schedule queues, not the device, for output queue > processing in BH. > ... > diff --git a/net/core/dev.c b/net/core/dev.c > index 8e38948..c5e3532 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -1323,13 +1323,14 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev) > void __netif_schedule(struct net_device *dev) > { > if (!test_and_set_bit(__LINK_STATE_SCHED, &dev->state)) { Isn't this bit supposed to be set/tested per queue as well, or do I miss something? Jarek P. > + struct netdev_queue *txq = &dev->tx_queue; > unsigned long flags; > struct softnet_data *sd; > > local_irq_save(flags); > sd = &__get_cpu_var(softnet_data); > - dev->next_sched = sd->output_queue; > - sd->output_queue = dev; > + txq->next_sched = sd->output_queue; > + sd->output_queue = txq; > raise_softirq_irqoff(NET_TX_SOFTIRQ); > local_irq_restore(flags); > } > @@ -1912,7 +1913,7 @@ static void net_tx_action(struct softirq_action *h) > } > > if (sd->output_queue) { > - struct net_device *head; > + struct netdev_queue *head; > > local_irq_disable(); > head = sd->output_queue; > @@ -1920,12 +1921,10 @@ static void net_tx_action(struct softirq_action *h) > local_irq_enable(); > > while (head) { > - struct net_device *dev = head; > - struct netdev_queue *txq; > + struct netdev_queue *txq = head; > + struct net_device *dev = txq->dev; > head = head->next_sched; > > - txq = &dev->tx_queue; > - > smp_mb__before_clear_bit(); > clear_bit(__LINK_STATE_SCHED, &dev->state); > > @@ -4346,7 +4345,7 @@ static int dev_cpu_callback(struct notifier_block *nfb, > void *ocpu) > { > struct sk_buff **list_skb; > - struct net_device **list_net; > + struct netdev_queue **list_net; > struct sk_buff *skb; > unsigned int cpu, oldcpu = (unsigned long)ocpu; > struct softnet_data *sd, *oldsd;