Message ID | alpine.LRH.2.00.1107061751120.3509@sbhatewara-dev1.eng.vmware.com |
---|---|
State | Superseded, archived |
Delegated to: | David Miller |
Headers | show |
On Wednesday, July 06, 2011 05:58:51 PM Shreyas Bhatewara wrote: > > + if (!is_power_of_2(num_rx_queues)) > + num_rx_queues = rounddown_pow_of_two(num_rx_queues); > + No need to do the check, just do: num_rx_queues = rounddown_pow_of_two(num_rx_queues); Thanks, Dmitry -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
I just want to point out that rounddown_pow_of_two() returns 0 when (1) the input is 1; and (2) the __buildin_constant_p(n) path is taken. In the vmxnet3 case, even if num_rx_queues is 1, we are safe as its value is not known to be constant at compile time and 1 will be returned by taking the other path (1UL << (fls_long(n) - 1)). The original check of power_of_two is there just to be on the safe side. Related to this, I wonder if we should always return 1 when the input is 1 (1 is also a power of two as 2^0). I don't have the history of this API though and curious if there are any users of this API that depend on this behavior? Thanks, Yong > -----Original Message----- > From: Dmitry Torokhov [mailto:dtor@vmware.com] > Sent: Wednesday, July 06, 2011 6:09 PM > To: pv-drivers@vmware.com > Cc: Shreyas Bhatewara; netdev@vger.kernel.org; Yong Wang > Subject: Re: [Pv-drivers] [PATCH] vmxnet3: round down # of queues to power of > two > > On Wednesday, July 06, 2011 05:58:51 PM Shreyas Bhatewara wrote: > > > > > + if (!is_power_of_2(num_rx_queues)) > > + num_rx_queues = rounddown_pow_of_two(num_rx_queues); > > + > > No need to do the check, just do: > > num_rx_queues = rounddown_pow_of_two(num_rx_queues); > > Thanks, > Dmitry -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index fabcded..4ee7750 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c @@ -2898,12 +2898,18 @@ vmxnet3_probe_device(struct pci_dev *pdev, #endif num_rx_queues = 1; + if (!is_power_of_2(num_rx_queues)) + num_rx_queues = rounddown_pow_of_two(num_rx_queues); + if (enable_mq) num_tx_queues = min(VMXNET3_DEVICE_MAX_TX_QUEUES, (int)num_online_cpus()); else num_tx_queues = 1; + if (!is_power_of_2(num_tx_queues)) + num_tx_queues = rounddown_pow_of_two(num_tx_queues); + netdev = alloc_etherdev_mq(sizeof(struct vmxnet3_adapter), max(num_tx_queues, num_rx_queues)); printk(KERN_INFO "# of Tx queues : %d, # of Rx queues : %d\n", @@ -3089,6 +3095,9 @@ vmxnet3_remove_device(struct pci_dev *pdev) #endif num_rx_queues = 1; + if (!is_power_of_2(num_rx_queues)) + num_rx_queues = rounddown_pow_of_two(num_rx_queues); + cancel_work_sync(&adapter->work); unregister_netdev(netdev); diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h index a9cb3fa..b18eac1 100644 --- a/drivers/net/vmxnet3/vmxnet3_int.h +++ b/drivers/net/vmxnet3/vmxnet3_int.h @@ -56,6 +56,7 @@ #include <linux/if_vlan.h> #include <linux/if_arp.h> #include <linux/inetdevice.h> +#include <linux/log2.h> #include "vmxnet3_defs.h" @@ -69,10 +70,10 @@ /* * Version numbers */ -#define VMXNET3_DRIVER_VERSION_STRING "1.1.14.0-k" +#define VMXNET3_DRIVER_VERSION_STRING "1.1.18.0-k" /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ -#define VMXNET3_DRIVER_VERSION_NUM 0x01010E00 +#define VMXNET3_DRIVER_VERSION_NUM 0x01011200 #if defined(CONFIG_PCI_MSI) /* RSS only makes sense if MSI-X is supported. */