Commit 53831aa1 authored by Shrikrishna Khare's avatar Shrikrishna Khare Committed by David S. Miller

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: default avatarRamya Bolla <bollar@vmware.com>
Signed-off-by: default avatarShreyas Bhatewara <sbhatewara@vmware.com>
Signed-off-by: default avatarShrikrishna Khare <skhare@vmware.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7c8f1e78
...@@ -342,6 +342,7 @@ union Vmxnet3_GenericDesc { ...@@ -342,6 +342,7 @@ union Vmxnet3_GenericDesc {
#define VMXNET3_TX_RING_MAX_SIZE 4096 #define VMXNET3_TX_RING_MAX_SIZE 4096
#define VMXNET3_TC_RING_MAX_SIZE 4096 #define VMXNET3_TC_RING_MAX_SIZE 4096
#define VMXNET3_RX_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 #define VMXNET3_RC_RING_MAX_SIZE 8192
/* a list of reasons for queue stop */ /* a list of reasons for queue stop */
......
...@@ -2505,6 +2505,9 @@ vmxnet3_adjust_rx_ring_size(struct vmxnet3_adapter *adapter) ...@@ -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 / ring0_size = min_t(u32, ring0_size, VMXNET3_RX_RING_MAX_SIZE /
sz * sz); sz * sz);
ring1_size = adapter->rx_queue[0].rx_ring[1].size; 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; comp_size = ring0_size + ring1_size;
for (i = 0; i < adapter->num_rx_queues; i++) { for (i = 0; i < adapter->num_rx_queues; i++) {
...@@ -2585,7 +2588,7 @@ vmxnet3_open(struct net_device *netdev) ...@@ -2585,7 +2588,7 @@ vmxnet3_open(struct net_device *netdev)
err = vmxnet3_create_queues(adapter, adapter->tx_ring_size, err = vmxnet3_create_queues(adapter, adapter->tx_ring_size,
adapter->rx_ring_size, adapter->rx_ring_size,
VMXNET3_DEF_RX_RING_SIZE); adapter->rx_ring2_size);
if (err) if (err)
goto queue_err; goto queue_err;
...@@ -2964,6 +2967,7 @@ vmxnet3_probe_device(struct pci_dev *pdev, ...@@ -2964,6 +2967,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
adapter->tx_ring_size = VMXNET3_DEF_TX_RING_SIZE; adapter->tx_ring_size = VMXNET3_DEF_TX_RING_SIZE;
adapter->rx_ring_size = VMXNET3_DEF_RX_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); spin_lock_init(&adapter->cmd_lock);
adapter->adapter_pa = dma_map_single(&adapter->pdev->dev, adapter, adapter->adapter_pa = dma_map_single(&adapter->pdev->dev, adapter,
......
...@@ -447,12 +447,12 @@ vmxnet3_get_ringparam(struct net_device *netdev, ...@@ -447,12 +447,12 @@ vmxnet3_get_ringparam(struct net_device *netdev,
param->rx_max_pending = VMXNET3_RX_RING_MAX_SIZE; param->rx_max_pending = VMXNET3_RX_RING_MAX_SIZE;
param->tx_max_pending = VMXNET3_TX_RING_MAX_SIZE; param->tx_max_pending = VMXNET3_TX_RING_MAX_SIZE;
param->rx_mini_max_pending = 0; 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->rx_pending = adapter->rx_ring_size;
param->tx_pending = adapter->tx_ring_size; param->tx_pending = adapter->tx_ring_size;
param->rx_mini_pending = 0; 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, ...@@ -461,7 +461,7 @@ vmxnet3_set_ringparam(struct net_device *netdev,
struct ethtool_ringparam *param) struct ethtool_ringparam *param)
{ {
struct vmxnet3_adapter *adapter = netdev_priv(netdev); 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; u32 sz;
int err = 0; int err = 0;
...@@ -473,6 +473,10 @@ vmxnet3_set_ringparam(struct net_device *netdev, ...@@ -473,6 +473,10 @@ vmxnet3_set_ringparam(struct net_device *netdev,
VMXNET3_RX_RING_MAX_SIZE) VMXNET3_RX_RING_MAX_SIZE)
return -EINVAL; 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 not yet initialized, do nothing */
if (adapter->rx_buf_per_pkt == 0) { if (adapter->rx_buf_per_pkt == 0) {
netdev_err(netdev, "adapter not completely initialized, " netdev_err(netdev, "adapter not completely initialized, "
...@@ -500,8 +504,15 @@ vmxnet3_set_ringparam(struct net_device *netdev, ...@@ -500,8 +504,15 @@ vmxnet3_set_ringparam(struct net_device *netdev,
sz) != 0) sz) != 0)
return -EINVAL; return -EINVAL;
if (new_tx_ring_size == adapter->tx_queue[0].tx_ring.size && /* ring2 has to be a multiple of VMXNET3_RING_SIZE_ALIGN */
new_rx_ring_size == adapter->rx_queue[0].rx_ring[0].size) { 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; return 0;
} }
...@@ -522,7 +533,7 @@ vmxnet3_set_ringparam(struct net_device *netdev, ...@@ -522,7 +533,7 @@ vmxnet3_set_ringparam(struct net_device *netdev,
vmxnet3_rq_destroy_all(adapter); vmxnet3_rq_destroy_all(adapter);
err = vmxnet3_create_queues(adapter, new_tx_ring_size, 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) { if (err) {
/* failed, most likely because of OOM, try default /* failed, most likely because of OOM, try default
...@@ -530,11 +541,12 @@ vmxnet3_set_ringparam(struct net_device *netdev, ...@@ -530,11 +541,12 @@ vmxnet3_set_ringparam(struct net_device *netdev,
netdev_err(netdev, "failed to apply new sizes, " netdev_err(netdev, "failed to apply new sizes, "
"try the default ones\n"); "try the default ones\n");
new_rx_ring_size = VMXNET3_DEF_RX_RING_SIZE; 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; new_tx_ring_size = VMXNET3_DEF_TX_RING_SIZE;
err = vmxnet3_create_queues(adapter, err = vmxnet3_create_queues(adapter,
new_tx_ring_size, new_tx_ring_size,
new_rx_ring_size, new_rx_ring_size,
VMXNET3_DEF_RX_RING_SIZE); new_rx_ring2_size);
if (err) { if (err) {
netdev_err(netdev, "failed to create queues " netdev_err(netdev, "failed to create queues "
"with default sizes. Closing it\n"); "with default sizes. Closing it\n");
...@@ -549,6 +561,7 @@ vmxnet3_set_ringparam(struct net_device *netdev, ...@@ -549,6 +561,7 @@ vmxnet3_set_ringparam(struct net_device *netdev,
} }
adapter->tx_ring_size = new_tx_ring_size; adapter->tx_ring_size = new_tx_ring_size;
adapter->rx_ring_size = new_rx_ring_size; adapter->rx_ring_size = new_rx_ring_size;
adapter->rx_ring2_size = new_rx_ring2_size;
out: out:
clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state); clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state);
......
...@@ -69,10 +69,10 @@ ...@@ -69,10 +69,10 @@
/* /*
* Version numbers * 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 */ /* 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) #if defined(CONFIG_PCI_MSI)
/* RSS only makes sense if MSI-X is supported. */ /* RSS only makes sense if MSI-X is supported. */
...@@ -352,6 +352,7 @@ struct vmxnet3_adapter { ...@@ -352,6 +352,7 @@ struct vmxnet3_adapter {
/* Ring sizes */ /* Ring sizes */
u32 tx_ring_size; u32 tx_ring_size;
u32 rx_ring_size; u32 rx_ring_size;
u32 rx_ring2_size;
struct work_struct work; struct work_struct work;
...@@ -384,6 +385,7 @@ struct vmxnet3_adapter { ...@@ -384,6 +385,7 @@ struct vmxnet3_adapter {
/* must be a multiple of VMXNET3_RING_SIZE_ALIGN */ /* must be a multiple of VMXNET3_RING_SIZE_ALIGN */
#define VMXNET3_DEF_TX_RING_SIZE 512 #define VMXNET3_DEF_TX_RING_SIZE 512
#define VMXNET3_DEF_RX_RING_SIZE 256 #define VMXNET3_DEF_RX_RING_SIZE 256
#define VMXNET3_DEF_RX_RING2_SIZE 128
#define VMXNET3_MAX_ETH_HDR_SIZE 22 #define VMXNET3_MAX_ETH_HDR_SIZE 22
#define VMXNET3_MAX_SKB_BUF_SIZE (3*1024) #define VMXNET3_MAX_SKB_BUF_SIZE (3*1024)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment