summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Lunn <andrew@lunn.ch>2016-06-03 17:03:25 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2016-06-29 16:59:24 -0400
commit64f2525ca4e76b1704b867458808ed6ffc58b803 (patch)
tree6ce9a89bd858c128e54130191b621b4fab6fba61
parent581e0c7df90b1a7f92e7ac3e69000b414319f161 (diff)
igb: Only DMA sync frame length
On some platforms, syncing a buffer for DMA is expensive. Rather than sync the whole 2K receive buffer, only synchronise the length of the frame, which will typically be the MTU, or a much smaller TCP ACK. For an IMX6Q, this gives around 6% increased TCP receive performance, which is cache operations bound and reduces CPU load for TCP transmit. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index a15f82600802..9bcba42abb91 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -6856,12 +6856,12 @@ static bool igb_can_reuse_rx_page(struct igb_rx_buffer *rx_buffer,
6856 **/ 6856 **/
6857static bool igb_add_rx_frag(struct igb_ring *rx_ring, 6857static bool igb_add_rx_frag(struct igb_ring *rx_ring,
6858 struct igb_rx_buffer *rx_buffer, 6858 struct igb_rx_buffer *rx_buffer,
6859 unsigned int size,
6859 union e1000_adv_rx_desc *rx_desc, 6860 union e1000_adv_rx_desc *rx_desc,
6860 struct sk_buff *skb) 6861 struct sk_buff *skb)
6861{ 6862{
6862 struct page *page = rx_buffer->page; 6863 struct page *page = rx_buffer->page;
6863 unsigned char *va = page_address(page) + rx_buffer->page_offset; 6864 unsigned char *va = page_address(page) + rx_buffer->page_offset;
6864 unsigned int size = le16_to_cpu(rx_desc->wb.upper.length);
6865#if (PAGE_SIZE < 8192) 6865#if (PAGE_SIZE < 8192)
6866 unsigned int truesize = IGB_RX_BUFSZ; 6866 unsigned int truesize = IGB_RX_BUFSZ;
6867#else 6867#else
@@ -6913,6 +6913,7 @@ static struct sk_buff *igb_fetch_rx_buffer(struct igb_ring *rx_ring,
6913 union e1000_adv_rx_desc *rx_desc, 6913 union e1000_adv_rx_desc *rx_desc,
6914 struct sk_buff *skb) 6914 struct sk_buff *skb)
6915{ 6915{
6916 unsigned int size = le16_to_cpu(rx_desc->wb.upper.length);
6916 struct igb_rx_buffer *rx_buffer; 6917 struct igb_rx_buffer *rx_buffer;
6917 struct page *page; 6918 struct page *page;
6918 6919
@@ -6948,11 +6949,11 @@ static struct sk_buff *igb_fetch_rx_buffer(struct igb_ring *rx_ring,
6948 dma_sync_single_range_for_cpu(rx_ring->dev, 6949 dma_sync_single_range_for_cpu(rx_ring->dev,
6949 rx_buffer->dma, 6950 rx_buffer->dma,
6950 rx_buffer->page_offset, 6951 rx_buffer->page_offset,
6951 IGB_RX_BUFSZ, 6952 size,
6952 DMA_FROM_DEVICE); 6953 DMA_FROM_DEVICE);
6953 6954
6954 /* pull page into skb */ 6955 /* pull page into skb */
6955 if (igb_add_rx_frag(rx_ring, rx_buffer, rx_desc, skb)) { 6956 if (igb_add_rx_frag(rx_ring, rx_buffer, size, rx_desc, skb)) {
6956 /* hand second half of page back to the ring */ 6957 /* hand second half of page back to the ring */
6957 igb_reuse_rx_page(rx_ring, rx_buffer); 6958 igb_reuse_rx_page(rx_ring, rx_buffer);
6958 } else { 6959 } else {