|
@@ -86,17 +86,62 @@
|
|
|
|
|
|
/* Supported Rx Buffer Sizes */
|
|
|
#define IXGBE_RXBUFFER_256 256 /* Used for skb receive header */
|
|
|
+#define IXGBE_RXBUFFER_1536 1536
|
|
|
#define IXGBE_RXBUFFER_2K 2048
|
|
|
#define IXGBE_RXBUFFER_3K 3072
|
|
|
#define IXGBE_RXBUFFER_4K 4096
|
|
|
#define IXGBE_MAX_RXBUFFER 16384 /* largest size for a single descriptor */
|
|
|
|
|
|
-#define IXGBE_SKB_PAD (NET_SKB_PAD + NET_IP_ALIGN)
|
|
|
+/* Attempt to maximize the headroom available for incoming frames. We
|
|
|
+ * use a 2K buffer for receives and need 1536/1534 to store the data for
|
|
|
+ * the frame. This leaves us with 512 bytes of room. From that we need
|
|
|
+ * to deduct the space needed for the shared info and the padding needed
|
|
|
+ * to IP align the frame.
|
|
|
+ *
|
|
|
+ * Note: For cache line sizes 256 or larger this value is going to end
|
|
|
+ * up negative. In these cases we should fall back to the 3K
|
|
|
+ * buffers.
|
|
|
+ */
|
|
|
#if (PAGE_SIZE < 8192)
|
|
|
-#define IXGBE_MAX_FRAME_BUILD_SKB \
|
|
|
- (SKB_WITH_OVERHEAD(IXGBE_RXBUFFER_2K) - IXGBE_SKB_PAD)
|
|
|
+#define IXGBE_MAX_2K_FRAME_BUILD_SKB (IXGBE_RXBUFFER_1536 - NET_IP_ALIGN)
|
|
|
+#define IXGBE_2K_TOO_SMALL_WITH_PADDING \
|
|
|
+((NET_SKB_PAD + IXGBE_RXBUFFER_1536) > SKB_WITH_OVERHEAD(IXGBE_RXBUFFER_2K))
|
|
|
+
|
|
|
+static inline int ixgbe_compute_pad(int rx_buf_len)
|
|
|
+{
|
|
|
+ int page_size, pad_size;
|
|
|
+
|
|
|
+ page_size = ALIGN(rx_buf_len, PAGE_SIZE / 2);
|
|
|
+ pad_size = SKB_WITH_OVERHEAD(page_size) - rx_buf_len;
|
|
|
+
|
|
|
+ return pad_size;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int ixgbe_skb_pad(void)
|
|
|
+{
|
|
|
+ int rx_buf_len;
|
|
|
+
|
|
|
+ /* If a 2K buffer cannot handle a standard Ethernet frame then
|
|
|
+ * optimize padding for a 3K buffer instead of a 1.5K buffer.
|
|
|
+ *
|
|
|
+ * For a 3K buffer we need to add enough padding to allow for
|
|
|
+ * tailroom due to NET_IP_ALIGN possibly shifting us out of
|
|
|
+ * cache-line alignment.
|
|
|
+ */
|
|
|
+ if (IXGBE_2K_TOO_SMALL_WITH_PADDING)
|
|
|
+ rx_buf_len = IXGBE_RXBUFFER_3K + SKB_DATA_ALIGN(NET_IP_ALIGN);
|
|
|
+ else
|
|
|
+ rx_buf_len = IXGBE_RXBUFFER_1536;
|
|
|
+
|
|
|
+ /* if needed make room for NET_IP_ALIGN */
|
|
|
+ rx_buf_len -= NET_IP_ALIGN;
|
|
|
+
|
|
|
+ return ixgbe_compute_pad(rx_buf_len);
|
|
|
+}
|
|
|
+
|
|
|
+#define IXGBE_SKB_PAD ixgbe_skb_pad()
|
|
|
#else
|
|
|
-#define IXGBE_MAX_FRAME_BUILD_SKB IXGBE_RXBUFFER_2K
|
|
|
+#define IXGBE_SKB_PAD (NET_SKB_PAD + NET_IP_ALIGN)
|
|
|
#endif
|
|
|
|
|
|
/*
|
|
@@ -361,7 +406,7 @@ static inline unsigned int ixgbe_rx_bufsz(struct ixgbe_ring *ring)
|
|
|
return IXGBE_RXBUFFER_3K;
|
|
|
#if (PAGE_SIZE < 8192)
|
|
|
if (ring_uses_build_skb(ring))
|
|
|
- return IXGBE_MAX_FRAME_BUILD_SKB;
|
|
|
+ return IXGBE_MAX_2K_FRAME_BUILD_SKB;
|
|
|
#endif
|
|
|
return IXGBE_RXBUFFER_2K;
|
|
|
}
|