diff options
author | jhb <jhb@FreeBSD.org> | 2015-12-21 20:40:17 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2015-12-21 20:40:17 +0000 |
commit | 025d443e863330222cc814e2d660bb057a1d1650 (patch) | |
tree | c47474f5930340c9cbb36029a564a7b5b8b66c9b | |
parent | 37c817149ce074b219fcb5be17cf90cd0b3346d8 (diff) | |
download | FreeBSD-src-025d443e863330222cc814e2d660bb057a1d1650.zip FreeBSD-src-025d443e863330222cc814e2d660bb057a1d1650.tar.gz |
MFC 290948:
Only use a power of 2 for the number of receive and transmit queues.
Using other values causes VMXNET3_CMD_ENABLE to fail. The Linux
driver also enforces this restriction.
-rw-r--r-- | sys/dev/vmware/vmxnet3/if_vmx.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/sys/dev/vmware/vmxnet3/if_vmx.c b/sys/dev/vmware/vmxnet3/if_vmx.c index 202bc8e..e92cc00 100644 --- a/sys/dev/vmware/vmxnet3/if_vmx.c +++ b/sys/dev/vmware/vmxnet3/if_vmx.c @@ -511,6 +511,13 @@ vmxnet3_check_version(struct vmxnet3_softc *sc) return (0); } +static int +trunc_powerof2(int val) +{ + + return (1U << (fls(val) - 1)); +} + static void vmxnet3_initial_config(struct vmxnet3_softc *sc) { @@ -521,14 +528,14 @@ vmxnet3_initial_config(struct vmxnet3_softc *sc) nqueue = VMXNET3_DEF_TX_QUEUES; if (nqueue > mp_ncpus) nqueue = mp_ncpus; - sc->vmx_max_ntxqueues = nqueue; + sc->vmx_max_ntxqueues = trunc_powerof2(nqueue); nqueue = vmxnet3_tunable_int(sc, "rxnqueue", vmxnet3_default_rxnqueue); if (nqueue > VMXNET3_MAX_RX_QUEUES || nqueue < 1) nqueue = VMXNET3_DEF_RX_QUEUES; if (nqueue > mp_ncpus) nqueue = mp_ncpus; - sc->vmx_max_nrxqueues = nqueue; + sc->vmx_max_nrxqueues = trunc_powerof2(nqueue); if (vmxnet3_tunable_int(sc, "mq_disable", vmxnet3_mq_disable)) { sc->vmx_max_nrxqueues = 1; |