Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bnx2x: Spread rx buffers between allocated queues

Default number of rx buffers will be divided equally
between allocated queues. This will decrease amount of
pre-allocated buffers on systems with multiple CPUs.
User can override this behavior with ethtool -G.
Minimum amount of rx buffers per queue set to 128.

Reported-by: Eric Dumazet <eric.dumazet@gmail.com>

Signed-off-by: Dmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Dmitry Kravkov and committed by
David S. Miller
25141580 441993da

+17 -5
+3 -2
drivers/net/bnx2x/bnx2x.h
··· 20 20 * (you will need to reboot afterwards) */ 21 21 /* #define BNX2X_STOP_ON_ERROR */ 22 22 23 - #define DRV_MODULE_VERSION "1.52.53-6" 24 - #define DRV_MODULE_RELDATE "2010/09/07" 23 + #define DRV_MODULE_VERSION "1.52.53-7" 24 + #define DRV_MODULE_RELDATE "2010/09/12" 25 25 #define BNX2X_BC_VER 0x040200 26 26 27 27 #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) ··· 369 369 #define NUM_RX_BD (RX_DESC_CNT * NUM_RX_RINGS) 370 370 #define MAX_RX_BD (NUM_RX_BD - 1) 371 371 #define MAX_RX_AVAIL (MAX_RX_DESC_CNT * NUM_RX_RINGS - 2) 372 + #define MIN_RX_AVAIL 128 372 373 #define NEXT_RX_IDX(x) ((((x) & RX_DESC_MASK) == \ 373 374 (MAX_RX_DESC_CNT - 1)) ? (x) + 3 : (x) + 1) 374 375 #define RX_BD(x) ((x) & MAX_RX_BD)
+5 -1
drivers/net/bnx2x/bnx2x_cmn.c
··· 781 781 ETH_MAX_AGGREGATION_QUEUES_E1H; 782 782 u16 ring_prod, cqe_ring_prod; 783 783 int i, j; 784 + int rx_ring_size = bp->rx_ring_size ? bp->rx_ring_size : 785 + MAX_RX_AVAIL/bp->num_queues; 786 + 787 + rx_ring_size = max_t(int, MIN_RX_AVAIL, rx_ring_size); 784 788 785 789 bp->rx_buf_size = bp->dev->mtu + ETH_OVREHEAD + BNX2X_RX_ALIGN; 786 790 DP(NETIF_MSG_IFUP, ··· 887 883 /* Allocate BDs and initialize BD ring */ 888 884 fp->rx_comp_cons = 0; 889 885 cqe_ring_prod = ring_prod = 0; 890 - for (i = 0; i < bp->rx_ring_size; i++) { 886 + for (i = 0; i < rx_ring_size; i++) { 891 887 if (bnx2x_alloc_rx_skb(bp, fp, ring_prod) < 0) { 892 888 BNX2X_ERR("was only able to allocate " 893 889 "%d rx skbs on queue[%d]\n", i, j);
+9 -1
drivers/net/bnx2x/bnx2x_ethtool.c
··· 961 961 ering->rx_mini_max_pending = 0; 962 962 ering->rx_jumbo_max_pending = 0; 963 963 964 - ering->rx_pending = bp->rx_ring_size; 964 + if (bp->rx_ring_size) 965 + ering->rx_pending = bp->rx_ring_size; 966 + else 967 + if (bp->state == BNX2X_STATE_OPEN && bp->num_queues) 968 + ering->rx_pending = MAX_RX_AVAIL/bp->num_queues; 969 + else 970 + ering->rx_pending = MAX_RX_AVAIL; 971 + 965 972 ering->rx_mini_pending = 0; 966 973 ering->rx_jumbo_pending = 0; 967 974 ··· 988 981 } 989 982 990 983 if ((ering->rx_pending > MAX_RX_AVAIL) || 984 + (ering->rx_pending < MIN_RX_AVAIL) || 991 985 (ering->tx_pending > MAX_TX_AVAIL) || 992 986 (ering->tx_pending <= MAX_SKB_FRAGS + 4)) 993 987 return -EINVAL;
-1
drivers/net/bnx2x/bnx2x_main.c
··· 6619 6619 bp->mrrs = mrrs; 6620 6620 6621 6621 bp->tx_ring_size = MAX_TX_AVAIL; 6622 - bp->rx_ring_size = MAX_RX_AVAIL; 6623 6622 6624 6623 bp->rx_csum = 1; 6625 6624