Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 25141580 authored by Dmitry Kravkov's avatar Dmitry Kravkov Committed by David S. Miller
Browse files

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: default avatarEric Dumazet <eric.dumazet@gmail.com>

Signed-off-by: default avatarDmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: default avatarEilon Greenstein <eilong@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 441993da
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -20,8 +20,8 @@
 * (you will need to reboot afterwards) */
 * (you will need to reboot afterwards) */
/* #define BNX2X_STOP_ON_ERROR */
/* #define BNX2X_STOP_ON_ERROR */


#define DRV_MODULE_VERSION      "1.52.53-6"
#define DRV_MODULE_VERSION      "1.52.53-7"
#define DRV_MODULE_RELDATE      "2010/09/07"
#define DRV_MODULE_RELDATE      "2010/09/12"
#define BNX2X_BC_VER            0x040200
#define BNX2X_BC_VER            0x040200


#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
@@ -369,6 +369,7 @@ struct bnx2x_fastpath {
#define NUM_RX_BD			(RX_DESC_CNT * NUM_RX_RINGS)
#define NUM_RX_BD			(RX_DESC_CNT * NUM_RX_RINGS)
#define MAX_RX_BD			(NUM_RX_BD - 1)
#define MAX_RX_BD			(NUM_RX_BD - 1)
#define MAX_RX_AVAIL			(MAX_RX_DESC_CNT * NUM_RX_RINGS - 2)
#define MAX_RX_AVAIL			(MAX_RX_DESC_CNT * NUM_RX_RINGS - 2)
#define MIN_RX_AVAIL			128
#define NEXT_RX_IDX(x)		((((x) & RX_DESC_MASK) == \
#define NEXT_RX_IDX(x)		((((x) & RX_DESC_MASK) == \
				  (MAX_RX_DESC_CNT - 1)) ? (x) + 3 : (x) + 1)
				  (MAX_RX_DESC_CNT - 1)) ? (x) + 3 : (x) + 1)
#define RX_BD(x)			((x) & MAX_RX_BD)
#define RX_BD(x)			((x) & MAX_RX_BD)
+5 −1
Original line number Original line Diff line number Diff line
@@ -781,6 +781,10 @@ void bnx2x_init_rx_rings(struct bnx2x *bp)
					      ETH_MAX_AGGREGATION_QUEUES_E1H;
					      ETH_MAX_AGGREGATION_QUEUES_E1H;
	u16 ring_prod, cqe_ring_prod;
	u16 ring_prod, cqe_ring_prod;
	int i, j;
	int i, j;
	int rx_ring_size = bp->rx_ring_size ? bp->rx_ring_size :
					      MAX_RX_AVAIL/bp->num_queues;

	rx_ring_size = max_t(int, MIN_RX_AVAIL, rx_ring_size);


	bp->rx_buf_size = bp->dev->mtu + ETH_OVREHEAD + BNX2X_RX_ALIGN;
	bp->rx_buf_size = bp->dev->mtu + ETH_OVREHEAD + BNX2X_RX_ALIGN;
	DP(NETIF_MSG_IFUP,
	DP(NETIF_MSG_IFUP,
@@ -883,7 +887,7 @@ void bnx2x_init_rx_rings(struct bnx2x *bp)
		/* Allocate BDs and initialize BD ring */
		/* Allocate BDs and initialize BD ring */
		fp->rx_comp_cons = 0;
		fp->rx_comp_cons = 0;
		cqe_ring_prod = ring_prod = 0;
		cqe_ring_prod = ring_prod = 0;
		for (i = 0; i < bp->rx_ring_size; i++) {
		for (i = 0; i < rx_ring_size; i++) {
			if (bnx2x_alloc_rx_skb(bp, fp, ring_prod) < 0) {
			if (bnx2x_alloc_rx_skb(bp, fp, ring_prod) < 0) {
				BNX2X_ERR("was only able to allocate "
				BNX2X_ERR("was only able to allocate "
					  "%d rx skbs on queue[%d]\n", i, j);
					  "%d rx skbs on queue[%d]\n", i, j);
+9 −1
Original line number Original line Diff line number Diff line
@@ -961,7 +961,14 @@ static void bnx2x_get_ringparam(struct net_device *dev,
	ering->rx_mini_max_pending = 0;
	ering->rx_mini_max_pending = 0;
	ering->rx_jumbo_max_pending = 0;
	ering->rx_jumbo_max_pending = 0;


	if (bp->rx_ring_size)
		ering->rx_pending = bp->rx_ring_size;
		ering->rx_pending = bp->rx_ring_size;
	else
		if (bp->state == BNX2X_STATE_OPEN && bp->num_queues)
			ering->rx_pending = MAX_RX_AVAIL/bp->num_queues;
		else
			ering->rx_pending = MAX_RX_AVAIL;

	ering->rx_mini_pending = 0;
	ering->rx_mini_pending = 0;
	ering->rx_jumbo_pending = 0;
	ering->rx_jumbo_pending = 0;


@@ -981,6 +988,7 @@ static int bnx2x_set_ringparam(struct net_device *dev,
	}
	}


	if ((ering->rx_pending > MAX_RX_AVAIL) ||
	if ((ering->rx_pending > MAX_RX_AVAIL) ||
	    (ering->rx_pending < MIN_RX_AVAIL) ||
	    (ering->tx_pending > MAX_TX_AVAIL) ||
	    (ering->tx_pending > MAX_TX_AVAIL) ||
	    (ering->tx_pending <= MAX_SKB_FRAGS + 4))
	    (ering->tx_pending <= MAX_SKB_FRAGS + 4))
		return -EINVAL;
		return -EINVAL;
+0 −1
Original line number Original line Diff line number Diff line
@@ -6619,7 +6619,6 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)
	bp->mrrs = mrrs;
	bp->mrrs = mrrs;


	bp->tx_ring_size = MAX_TX_AVAIL;
	bp->tx_ring_size = MAX_TX_AVAIL;
	bp->rx_ring_size = MAX_RX_AVAIL;


	bp->rx_csum = 1;
	bp->rx_csum = 1;