]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
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) & |