提交 30320be8 编写于 作者: J Jeff Kirsher 提交者: root

e1000: Added a performance enhancement - prefetch

- this implementation of prefetch was tested on new and old hardware
Signed-off-by: NJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: NJesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: NJohn Ronciak <john.ronciak@intel.com>
上级 dc7c6add
...@@ -3569,10 +3569,15 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, ...@@ -3569,10 +3569,15 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
skb = buffer_info->skb; skb = buffer_info->skb;
buffer_info->skb = NULL; buffer_info->skb = NULL;
prefetch(skb->data - NET_IP_ALIGN);
if (++i == rx_ring->count) i = 0; if (++i == rx_ring->count) i = 0;
next_rxd = E1000_RX_DESC(*rx_ring, i); next_rxd = E1000_RX_DESC(*rx_ring, i);
prefetch(next_rxd);
next_buffer = &rx_ring->buffer_info[i]; next_buffer = &rx_ring->buffer_info[i];
next_skb = next_buffer->skb; next_skb = next_buffer->skb;
prefetch(next_skb->data - NET_IP_ALIGN);
cleaned = TRUE; cleaned = TRUE;
cleaned_count++; cleaned_count++;
...@@ -3668,6 +3673,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, ...@@ -3668,6 +3673,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
cleaned_count = 0; cleaned_count = 0;
} }
/* use prefetched values */
rx_desc = next_rxd; rx_desc = next_rxd;
buffer_info = next_buffer; buffer_info = next_buffer;
} }
...@@ -3710,9 +3716,9 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, ...@@ -3710,9 +3716,9 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
i = rx_ring->next_to_clean; i = rx_ring->next_to_clean;
rx_desc = E1000_RX_DESC_PS(*rx_ring, i); rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
staterr = le32_to_cpu(rx_desc->wb.middle.status_error); staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
buffer_info = &rx_ring->buffer_info[i];
while (staterr & E1000_RXD_STAT_DD) { while (staterr & E1000_RXD_STAT_DD) {
buffer_info = &rx_ring->buffer_info[i];
ps_page = &rx_ring->ps_page[i]; ps_page = &rx_ring->ps_page[i];
ps_page_dma = &rx_ring->ps_page_dma[i]; ps_page_dma = &rx_ring->ps_page_dma[i];
#ifdef CONFIG_E1000_NAPI #ifdef CONFIG_E1000_NAPI
...@@ -3722,10 +3728,16 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, ...@@ -3722,10 +3728,16 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
#endif #endif
skb = buffer_info->skb; skb = buffer_info->skb;
/* in the packet split case this is header only */
prefetch(skb->data - NET_IP_ALIGN);
if (++i == rx_ring->count) i = 0; if (++i == rx_ring->count) i = 0;
next_rxd = E1000_RX_DESC_PS(*rx_ring, i); next_rxd = E1000_RX_DESC_PS(*rx_ring, i);
prefetch(next_rxd);
next_buffer = &rx_ring->buffer_info[i]; next_buffer = &rx_ring->buffer_info[i];
next_skb = next_buffer->skb; next_skb = next_buffer->skb;
prefetch(next_skb->data - NET_IP_ALIGN);
cleaned = TRUE; cleaned = TRUE;
cleaned_count++; cleaned_count++;
...@@ -3787,9 +3799,8 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, ...@@ -3787,9 +3799,8 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
} }
for (j = 0; j < adapter->rx_ps_pages; j++) { for (j = 0; j < adapter->rx_ps_pages; j++) {
if (!(length = le16_to_cpu(rx_desc->wb.upper.length[j]))) if (!(length= le16_to_cpu(rx_desc->wb.upper.length[j])))
break; break;
pci_unmap_page(pdev, ps_page_dma->ps_page_dma[j], pci_unmap_page(pdev, ps_page_dma->ps_page_dma[j],
PAGE_SIZE, PCI_DMA_FROMDEVICE); PAGE_SIZE, PCI_DMA_FROMDEVICE);
ps_page_dma->ps_page_dma[j] = 0; ps_page_dma->ps_page_dma[j] = 0;
...@@ -3837,6 +3848,7 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, ...@@ -3837,6 +3848,7 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
cleaned_count = 0; cleaned_count = 0;
} }
/* use prefetched values */
rx_desc = next_rxd; rx_desc = next_rxd;
buffer_info = next_buffer; buffer_info = next_buffer;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册