]> git.ipfire.org Git - ipfire-2.x.git/blob - src/patches/suse-2.6.27.39/patches.drivers/ixgbe_pagesize_fix.patch
Fix oinkmaster patch.
[ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.drivers / ixgbe_pagesize_fix.patch
1 From: Jesse Brandeburg <jesse.brandeburg@intel.com>
2 Subject: ixgbe bad performance with 64kB pages and large MTU
3 Acked-by: Karsten Keil <kkeil@suse.de>
4 Reference: bnc#480109
5
6 it was pointed out on the list that ixgbe was failing when using 64kB pages
7 and large 16kB MTU.
8
9 since with a 64kB PAGE_SIZE MAX_SKB_FRAGS = 3, the way the driver was
10 configuring page usage was assuming 2kB is half a page, and was only
11 ever dmaing that much data to a half page.
12
13 (16kB - header size) / 2048 = 7 or 8 pages, which would far exceed 3
14
15 adjust the driver to account for these large pages, the hardware can
16 support DMA to up to 16kB for each descriptor.
17
18 Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
19 CC: Breno Leitao <leitao@linux.vnet.ibm.com>
20 Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
21 ---
22
23 drivers/net/ixgbe/ixgbe.h | 1 +
24 drivers/net/ixgbe/ixgbe_main.c | 9 ++++++++-
25 2 files changed, 9 insertions(+), 1 deletion(-)
26
27 --- a/drivers/net/ixgbe/ixgbe.h
28 +++ b/drivers/net/ixgbe/ixgbe.h
29 @@ -77,6 +77,7 @@
30 #define IXGBE_RXBUFFER_128 128 /* Used for packet split */
31 #define IXGBE_RXBUFFER_256 256 /* Used for packet split */
32 #define IXGBE_RXBUFFER_2048 2048
33 +#define IXGBE_MAX_RXBUFFER 16384 /* largest size for a single descriptor */
34
35 #define IXGBE_RX_HDR_SIZE IXGBE_RXBUFFER_256
36
37 --- a/drivers/net/ixgbe/ixgbe_main.c
38 +++ b/drivers/net/ixgbe/ixgbe_main.c
39 @@ -1537,7 +1537,14 @@ static void ixgbe_configure_srrctl(struc
40 srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
41
42 if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
43 - srrctl |= IXGBE_RXBUFFER_2048 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
44 + u16 bufsz = IXGBE_RXBUFFER_2048;
45 + /* grow the amount we can receive on large page machines */
46 + if (bufsz < (PAGE_SIZE / 2))
47 + bufsz = (PAGE_SIZE / 2);
48 + /* cap the bufsz at our largest descriptor size */
49 + bufsz = min((u16)IXGBE_MAX_RXBUFFER, bufsz);
50 +
51 + srrctl |= bufsz >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
52 srrctl |= IXGBE_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS;
53 srrctl |= ((IXGBE_RX_HDR_SIZE <<
54 IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) &