From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Fastabend Subject: Re: [PATCH 3/3] net: allocate tx queues in register_netdevice Date: Mon, 18 Oct 2010 17:12:30 -0700 Message-ID: <4CBCE26E.4020405@intel.com> References: <1287438080.2252.792.camel@achroite.uk.solarflarecom.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Cc: Tom Herbert , "davem@davemloft.net" , "netdev@vger.kernel.org" , "eric.dumazet@gmail.com" To: Ben Hutchings Return-path: Received: from mga09.intel.com ([134.134.136.24]:11696 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753910Ab0JSAMb (ORCPT ); Mon, 18 Oct 2010 20:12:31 -0400 In-Reply-To: <1287438080.2252.792.camel@achroite.uk.solarflarecom.com> Sender: netdev-owner@vger.kernel.org List-ID: On 10/18/2010 2:41 PM, Ben Hutchings wrote: > On Mon, 2010-10-18 at 11:02 -0700, Tom Herbert wrote: >> This patch introduces netif_alloc_netdev_queues which is called from >> register_device instead of alloc_netdev_mq. This makes TX queue >> allocation symmetric with RX allocation similarly allows drivers to >> change dev->num_tx_queues after allocating netdev and before >> registering it. > > Changing num_tx_queues is probably *not* desirable, same as for > num_rx_queues. > Right, this will break ixgbe and other drivers that may call netif_set_real_num_{rx|tx}_queues() to increase the number of queues. Returning an error code seems like a good idea though. John. > [...] >> --- a/net/core/dev.c >> +++ b/net/core/dev.c >> @@ -1553,18 +1553,24 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev) >> * Routine to help set real_num_tx_queues. To avoid skbs mapped to queues >> * greater then real_num_tx_queues stale skbs on the qdisc must be flushed. >> */ >> -void netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq) >> +int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq) >> { >> - unsigned int real_num = dev->real_num_tx_queues; >> + if (txq < 1) >> + return -EINVAL; >> >> - if (unlikely(txq > dev->num_tx_queues)) >> - ; >> - else if (txq > real_num) >> - dev->real_num_tx_queues = txq; >> - else if (txq < real_num) { >> - dev->real_num_tx_queues = txq; >> - qdisc_reset_all_tx_gt(dev, txq); >> - } >> + if (dev->reg_state == NETREG_REGISTERED) { >> + ASSERT_RTNL(); >> + >> + if (txq > dev->num_tx_queues) >> + return -EINVAL; >> + >> + if (txq < dev->real_num_tx_queues) >> + qdisc_reset_all_tx_gt(dev, txq); >> + } else >> + dev->num_tx_queues = txq; > [...] > > The kernel-doc comment should be updated to reflect the locking > requirement and the possibility of failure when called after > registration. > > Ben. >