X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Fpatches%2Fsuse-2.6.27.25%2Fpatches.drivers%2Fixgbe_pagesize_fix.patch;fp=src%2Fpatches%2Fsuse-2.6.27.25%2Fpatches.drivers%2Fixgbe_pagesize_fix.patch;h=44ff3d18c0a79474b2a8cb6951a0bd8f251a2144;hb=00e5a55c3c58b7320050d37ca15d98fd48acbf2f;hp=0000000000000000000000000000000000000000;hpb=4935eb8b91cbff9f3a05de77a40b16e980815e77;p=people%2Fpmueller%2Fipfire-2.x.git diff --git a/src/patches/suse-2.6.27.25/patches.drivers/ixgbe_pagesize_fix.patch b/src/patches/suse-2.6.27.25/patches.drivers/ixgbe_pagesize_fix.patch new file mode 100644 index 0000000000..44ff3d18c0 --- /dev/null +++ b/src/patches/suse-2.6.27.25/patches.drivers/ixgbe_pagesize_fix.patch @@ -0,0 +1,54 @@ +From: Jesse Brandeburg +Subject: ixgbe bad performance with 64kB pages and large MTU +Acked-by: Karsten Keil +Reference: bnc#480109 + +it was pointed out on the list that ixgbe was failing when using 64kB pages +and large 16kB MTU. + +since with a 64kB PAGE_SIZE MAX_SKB_FRAGS = 3, the way the driver was +configuring page usage was assuming 2kB is half a page, and was only +ever dmaing that much data to a half page. + +(16kB - header size) / 2048 = 7 or 8 pages, which would far exceed 3 + +adjust the driver to account for these large pages, the hardware can +support DMA to up to 16kB for each descriptor. + +Signed-off-by: Jesse Brandeburg +CC: Breno Leitao +Signed-off-by: Jeff Kirsher +--- + + drivers/net/ixgbe/ixgbe.h | 1 + + drivers/net/ixgbe/ixgbe_main.c | 9 ++++++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +--- a/drivers/net/ixgbe/ixgbe.h ++++ b/drivers/net/ixgbe/ixgbe.h +@@ -77,6 +77,7 @@ + #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_MAX_RXBUFFER 16384 /* largest size for a single descriptor */ + + #define IXGBE_RX_HDR_SIZE IXGBE_RXBUFFER_256 + +--- a/drivers/net/ixgbe/ixgbe_main.c ++++ b/drivers/net/ixgbe/ixgbe_main.c +@@ -1537,7 +1537,14 @@ static void ixgbe_configure_srrctl(struc + srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK; + + if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { +- srrctl |= IXGBE_RXBUFFER_2048 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT; ++ u16 bufsz = IXGBE_RXBUFFER_2048; ++ /* grow the amount we can receive on large page machines */ ++ if (bufsz < (PAGE_SIZE / 2)) ++ bufsz = (PAGE_SIZE / 2); ++ /* cap the bufsz at our largest descriptor size */ ++ bufsz = min((u16)IXGBE_MAX_RXBUFFER, bufsz); ++ ++ srrctl |= bufsz >> IXGBE_SRRCTL_BSIZEPKT_SHIFT; + srrctl |= IXGBE_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS; + srrctl |= ((IXGBE_RX_HDR_SIZE << + IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) &