]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.25/patches.drivers/ixgbe_pagesize_fix.patch
Updated xen patches taken from suse.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.drivers / ixgbe_pagesize_fix.patch
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 (file)
index 0000000..44ff3d1
--- /dev/null
@@ -0,0 +1,54 @@
+From: Jesse Brandeburg <jesse.brandeburg@intel.com>
+Subject: ixgbe bad performance with 64kB pages and large MTU
+Acked-by: Karsten Keil <kkeil@suse.de>
+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 <jesse.brandeburg@intel.com>
+CC: Breno Leitao <leitao@linux.vnet.ibm.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
+---
+
+ 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) &