Driver: Vmxnet3: Make Rx ring 2 size configurable
Subsystems (3)
PATCH 1/1 Driver: Vmxnet3: Make Rx ring 2 size configurable
Rx ring 2 size can be configured by adjusting rx-jumbo parameter of ethtool -G.
Signed-off-by Ramya Bolla <[email protected]>
Signed-off-by Shreyas Bhatewara <[email protected]>
Signed-off-by Shrikrishna Khare <[email protected]>
--- drivers/net/vmxnet3/vmxnet3_defs.h | 1 + drivers/net/vmxnet3/vmxnet3_drv.c | 6 +++++- drivers/net/vmxnet3/vmxnet3_ethtool.c | 27 ++++++++++++++++++++------- drivers/net/vmxnet3/vmxnet3_int.h | 6 ++++-- 4 files changed, 30 insertions(+), 10 deletions(-)
drivers/net/vmxnet3/vmxnet3_defs.h +1 -0
@@ -342,6 +342,7 @@ union Vmxnet3_GenericDesc {#define VMXNET3_TX_RING_MAX_SIZE 4096#define VMXNET3_TC_RING_MAX_SIZE 4096#define VMXNET3_RX_RING_MAX_SIZE 4096 +#define VMXNET3_RX_RING2_MAX_SIZE 2048#define VMXNET3_RC_RING_MAX_SIZE 8192/* a list of reasons for queue stop */
drivers/net/vmxnet3/vmxnet3_drv.c +5 -1
@@ -2505,6 +2505,9 @@ vmxnet3_adjust_rx_ring_size(struct vmxnet3_adapter *adapter) ring0_size =min_t (u32, ring0_size,VMXNET3_RX_RING_MAX_SIZE / sz * sz); ring1_size = adapter->rx_queue[0 ].rx_ring[1 ].size; + ring1_size = (ring1_size + sz -1 ) / sz * sz; + ring1_size =min_t (u32, ring1_size,VMXNET3_RX_RING2_MAX_SIZE / + sz * sz); comp_size = ring0_size + ring1_size;for (i =0 ; i < adapter->num_rx_queues; i++) {
@@ -2585,7 +2588,7 @@ vmxnet3_open(struct net_device *netdev) err =vmxnet3_create_queues (adapter, adapter->tx_ring_size, adapter->rx_ring_size, -VMXNET3_DEF_RX_RING_SIZE ); + adapter->rx_ring2_size);if (err) goto queue_err;
@@ -2964,6 +2967,7 @@ vmxnet3_probe_device(struct pci_dev *pdev, adapter->tx_ring_size =VMXNET3_DEF_TX_RING_SIZE ; adapter->rx_ring_size =VMXNET3_DEF_RX_RING_SIZE ; + adapter->rx_ring2_size =VMXNET3_DEF_RX_RING2_SIZE ;spin_lock_init (&adapter->cmd_lock); adapter->adapter_pa = dma_map_single(&adapter->pdev->dev, adapter,
drivers/net/vmxnet3/vmxnet3_ethtool.c +20 -7
@@ -447,12 +447,12 @@ vmxnet3_get_ringparam(struct net_device *netdev, param->rx_max_pending =VMXNET3_RX_RING_MAX_SIZE ; param->tx_max_pending =VMXNET3_TX_RING_MAX_SIZE ; param->rx_mini_max_pending =0 ; - param->rx_jumbo_max_pending =0 ; + param->rx_jumbo_max_pending =VMXNET3_RX_RING2_MAX_SIZE ; param->rx_pending = adapter->rx_ring_size; param->tx_pending = adapter->tx_ring_size; param->rx_mini_pending =0 ; - param->rx_jumbo_pending =0 ; + param->rx_jumbo_pending = adapter->rx_ring2_size; }
@@ -461,7 +461,7 @@ vmxnet3_set_ringparam(struct net_device *netdev, struct ethtool_ringparam *param) {struct vmxnet3_adapter *adapter =netdev_priv (netdev); -u32 new_tx_ring_size, new_rx_ring_size; +u32 new_tx_ring_size, new_rx_ring_size, new_rx_ring2_size;u32 sz;int err =0 ;
@@ -473,6 +473,10 @@ vmxnet3_set_ringparam(struct net_device *netdev, VMXNET3_RX_RING_MAX_SIZE)return -EINVAL ; +if (param->rx_jumbo_pending ==0 || + param->rx_jumbo_pending >VMXNET3_RX_RING2_MAX_SIZE ) +return -EINVAL ; +/* if adapter not yet initialized, do nothing */ if (adapter->rx_buf_per_pkt ==0 ) { netdev_err(netdev, "adapter not completely initialized, "
@@ -500,8 +504,15 @@ vmxnet3_set_ringparam(struct net_device *netdev, sz) != 0)return -EINVAL ; -if (new_tx_ring_size == adapter->tx_queue[0 ].tx_ring.size && - new_rx_ring_size == adapter->rx_queue[0 ].rx_ring[0 ].size) { +/* ring2 has to be a multiple of VMXNET3_RING_SIZE_ALIGN */ + new_rx_ring2_size = (param->rx_jumbo_pending +VMXNET3_RING_SIZE_MASK ) & + ~VMXNET3_RING_SIZE_MASK ; + new_rx_ring2_size =min_t (u32, new_rx_ring2_size, +VMXNET3_RX_RING2_MAX_SIZE ); + +if (new_tx_ring_size == adapter->tx_ring_size && + new_rx_ring_size == adapter->rx_ring_size && + new_rx_ring2_size == adapter->rx_ring2_size) {return 0 ; }
@@ -522,7 +533,7 @@ vmxnet3_set_ringparam(struct net_device *netdev,vmxnet3_rq_destroy_all (adapter); err =vmxnet3_create_queues (adapter, new_tx_ring_size, - new_rx_ring_size,VMXNET3_DEF_RX_RING_SIZE ); + new_rx_ring_size, new_rx_ring2_size);if (err) {/* failed, most likely because of OOM, try default
@@ -530,11 +541,12 @@ vmxnet3_set_ringparam(struct net_device *netdev,netdev_err (netdev,"failed to apply new sizes, " "try the default ones\n" ); new_rx_ring_size =VMXNET3_DEF_RX_RING_SIZE ; + new_rx_ring2_size =VMXNET3_DEF_RX_RING2_SIZE ; new_tx_ring_size =VMXNET3_DEF_TX_RING_SIZE ; err =vmxnet3_create_queues (adapter, new_tx_ring_size, new_rx_ring_size, -VMXNET3_DEF_RX_RING_SIZE ); + new_rx_ring2_size);if (err) {netdev_err (netdev,"failed to create queues " "with default sizes. Closing it\n" );
@@ -549,6 +561,7 @@ vmxnet3_set_ringparam(struct net_device *netdev, } adapter->tx_ring_size = new_tx_ring_size; adapter->rx_ring_size = new_rx_ring_size; + adapter->rx_ring2_size = new_rx_ring2_size; out:clear_bit (VMXNET3_STATE_BIT_RESETTING , &adapter->state);
drivers/net/vmxnet3/vmxnet3_int.h +4 -2
@@ -69,10 +69,10 @@/* * Version numbers */ -#define VMXNET3_DRIVER_VERSION_STRING "1.2.1.0-k" +#define VMXNET3_DRIVER_VERSION_STRING "1.3.1.0-k"/* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ -#define VMXNET3_DRIVER_VERSION_NUM 0x01020100 +#define VMXNET3_DRIVER_VERSION_NUM 0x01030100#if defined(CONFIG_PCI_MSI )/* RSS only makes sense if MSI-X is supported. */
@@ -352,6 +352,7 @@ struct vmxnet3_adapter {/* Ring sizes */ u32 tx_ring_size;u32 rx_ring_size; +u32 rx_ring2_size;struct work_struct work;
@@ -384,6 +385,7 @@ struct vmxnet3_adapter {/* must be a multiple of VMXNET3_RING_SIZE_ALIGN */ #define VMXNET3_DEF_TX_RING_SIZE 512#define VMXNET3_DEF_RX_RING_SIZE 256 +#define VMXNET3_DEF_RX_RING2_SIZE 128#define VMXNET3_MAX_ETH_HDR_SIZE 22#define VMXNET3_MAX_SKB_BUF_SIZE (3*1024)
Signature · 1 line
1.7.4.1
From: Shrikrishna Khare <[email protected]>
Date: Tue, 6 Jan 2015 09:20:15 -0800
Quoted 6 lines
Rx ring 2 size can be configured by adjusting rx-jumbo parameter of ethtool -G.
Signed-off-by Ramya Bolla <[email protected]>Signed-off-by Shreyas Bhatewara <[email protected]>Signed-off-by Shrikrishna Khare <[email protected]>
Applied, thanks.