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

Commit e76678dd authored by Alexander Duyck's avatar Alexander Duyck Committed by David S. Miller
Browse files

ixgbe: set max desc to prevent total RSC packet size of 64K



The performance of hardware RSC is greatly reduced if the total for max rsc
descriptors multiplied by the buffer size is greater than 65535.  To
prevent this we need to adjust the max rsc descriptors appropriately.

Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 82d04818
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -75,6 +75,8 @@
#define IXGBE_RXBUFFER_128   128    /* Used for packet split */
#define IXGBE_RXBUFFER_256   256    /* Used for packet split */
#define IXGBE_RXBUFFER_2048  2048
#define IXGBE_RXBUFFER_4096  4096
#define IXGBE_RXBUFFER_8192  8192
#define IXGBE_MAX_RXBUFFER   16384  /* largest size for a single descriptor */

#define IXGBE_RX_HDR_SIZE IXGBE_RXBUFFER_256
+18 −11
Original line number Diff line number Diff line
@@ -1995,21 +1995,28 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
			rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(j));
			rscctrl |= IXGBE_RSCCTL_RSCEN;
			/*
			 *  if packet split is enabled we can only support up
			 *  to max frags + 1 descriptors.
			 * we must limit the number of descriptors so that the
			 * total size of max desc * buf_len is not greater
			 * than 65535
			 */
			if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED)
#if (MAX_SKB_FRAGS < 3)
				rscctrl |= IXGBE_RSCCTL_MAXDESC_1;
#elif (MAX_SKB_FRAGS < 7)
				rscctrl |= IXGBE_RSCCTL_MAXDESC_4;
#elif (MAX_SKB_FRAGS < 15)
			if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
#if (MAX_SKB_FRAGS > 16)
				rscctrl |= IXGBE_RSCCTL_MAXDESC_16;
#elif (MAX_SKB_FRAGS > 8)
				rscctrl |= IXGBE_RSCCTL_MAXDESC_8;
#elif (MAX_SKB_FRAGS > 4)
				rscctrl |= IXGBE_RSCCTL_MAXDESC_4;
#else
				rscctrl |= IXGBE_RSCCTL_MAXDESC_16;
				rscctrl |= IXGBE_RSCCTL_MAXDESC_1;
#endif
			else
			} else {
				if (rx_buf_len < IXGBE_RXBUFFER_4096)
					rscctrl |= IXGBE_RSCCTL_MAXDESC_16;
				else if (rx_buf_len < IXGBE_RXBUFFER_8192)
					rscctrl |= IXGBE_RSCCTL_MAXDESC_8;
				else
					rscctrl |= IXGBE_RSCCTL_MAXDESC_4;
			}
			IXGBE_WRITE_REG(hw, IXGBE_RSCCTL(j), rscctrl);
		}
		/* Disable RSC for ACK packets */