diff options
author | Andrew Lunn <andrew@lunn.ch> | 2016-06-03 17:03:25 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2016-06-29 16:59:24 -0400 |
commit | 64f2525ca4e76b1704b867458808ed6ffc58b803 (patch) | |
tree | 6ce9a89bd858c128e54130191b621b4fab6fba61 | |
parent | 581e0c7df90b1a7f92e7ac3e69000b414319f161 (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.c | 7 |
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 | **/ |
6857 | static bool igb_add_rx_frag(struct igb_ring *rx_ring, | 6857 | static 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 { |