diff options
author | Benjamin LaHaise <ben.lahaise@neterion.com> | 2009-08-04 06:21:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-08-05 16:10:45 -0400 |
commit | ea11bbe0c94b045fdefc05476b69a2eef999a9c4 (patch) | |
tree | 17e6ba82dbfd3e90f7728fa6b08fb01d1613168b /drivers/net/vxge | |
parent | 3f23e436d241ac1cf50a659228a5a0e1e6572c1a (diff) |
vxge: prefetch skb->data
This patch implements prefetching of skb->data from a copy of the pointer
in the descriptor (which is already in the L1 cache at this point). This
improves netperf rx performance (netperf -L 0,0 -c -H 192.168.254.2 -- -M
131072 -m 131072) by 4.9% on a P4 Xeon host.
Signed-off-by: Benjamin LaHaise <ben.lahaise@neterion.com>
Signed-off-by: Sreenivasa Honnur <sreenivasa.honnur@neterion.com>
Signed-off-by: Ramkrishna Vepa <ram.vepa@neterion.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/vxge')
-rw-r--r-- | drivers/net/vxge/vxge-main.c | 6 | ||||
-rw-r--r-- | drivers/net/vxge/vxge-main.h | 1 |
2 files changed, 6 insertions, 1 deletions
diff --git a/drivers/net/vxge/vxge-main.c b/drivers/net/vxge/vxge-main.c index e93651c19f59..094d15548a2b 100644 --- a/drivers/net/vxge/vxge-main.c +++ b/drivers/net/vxge/vxge-main.c | |||
@@ -286,6 +286,7 @@ vxge_rx_alloc(void *dtrh, struct vxge_ring *ring, const int skb_size) | |||
286 | skb_reserve(skb, VXGE_HW_HEADER_ETHERNET_II_802_3_ALIGN); | 286 | skb_reserve(skb, VXGE_HW_HEADER_ETHERNET_II_802_3_ALIGN); |
287 | 287 | ||
288 | rx_priv->skb = skb; | 288 | rx_priv->skb = skb; |
289 | rx_priv->skb_data = NULL; | ||
289 | rx_priv->data_size = skb_size; | 290 | rx_priv->data_size = skb_size; |
290 | vxge_debug_entryexit(VXGE_TRACE, | 291 | vxge_debug_entryexit(VXGE_TRACE, |
291 | "%s: %s:%d Exiting...", ring->ndev->name, __func__, __LINE__); | 292 | "%s: %s:%d Exiting...", ring->ndev->name, __func__, __LINE__); |
@@ -305,7 +306,8 @@ static int vxge_rx_map(void *dtrh, struct vxge_ring *ring) | |||
305 | ring->ndev->name, __func__, __LINE__); | 306 | ring->ndev->name, __func__, __LINE__); |
306 | rx_priv = vxge_hw_ring_rxd_private_get(dtrh); | 307 | rx_priv = vxge_hw_ring_rxd_private_get(dtrh); |
307 | 308 | ||
308 | dma_addr = pci_map_single(ring->pdev, rx_priv->skb->data, | 309 | rx_priv->skb_data = rx_priv->skb->data; |
310 | dma_addr = pci_map_single(ring->pdev, rx_priv->skb_data, | ||
309 | rx_priv->data_size, PCI_DMA_FROMDEVICE); | 311 | rx_priv->data_size, PCI_DMA_FROMDEVICE); |
310 | 312 | ||
311 | if (dma_addr == 0) { | 313 | if (dma_addr == 0) { |
@@ -450,6 +452,7 @@ vxge_rx_1b_compl(struct __vxge_hw_ring *ringh, void *dtr, | |||
450 | skb = rx_priv->skb; | 452 | skb = rx_priv->skb; |
451 | data_size = rx_priv->data_size; | 453 | data_size = rx_priv->data_size; |
452 | data_dma = rx_priv->data_dma; | 454 | data_dma = rx_priv->data_dma; |
455 | prefetch(rx_priv->skb_data); | ||
453 | 456 | ||
454 | vxge_debug_rx(VXGE_TRACE, | 457 | vxge_debug_rx(VXGE_TRACE, |
455 | "%s: %s:%d skb = 0x%p", | 458 | "%s: %s:%d skb = 0x%p", |
@@ -1056,6 +1059,7 @@ vxge_rx_term(void *dtrh, enum vxge_hw_rxd_state state, void *userdata) | |||
1056 | rx_priv->data_size, PCI_DMA_FROMDEVICE); | 1059 | rx_priv->data_size, PCI_DMA_FROMDEVICE); |
1057 | 1060 | ||
1058 | dev_kfree_skb(rx_priv->skb); | 1061 | dev_kfree_skb(rx_priv->skb); |
1062 | rx_priv->skb_data = NULL; | ||
1059 | 1063 | ||
1060 | vxge_debug_entryexit(VXGE_TRACE, | 1064 | vxge_debug_entryexit(VXGE_TRACE, |
1061 | "%s: %s:%d Exiting...", | 1065 | "%s: %s:%d Exiting...", |
diff --git a/drivers/net/vxge/vxge-main.h b/drivers/net/vxge/vxge-main.h index 8b3989bc707f..9c36b3a9a63d 100644 --- a/drivers/net/vxge/vxge-main.h +++ b/drivers/net/vxge/vxge-main.h | |||
@@ -378,6 +378,7 @@ struct vxgedev { | |||
378 | 378 | ||
379 | struct vxge_rx_priv { | 379 | struct vxge_rx_priv { |
380 | struct sk_buff *skb; | 380 | struct sk_buff *skb; |
381 | unsigned char *skb_data; | ||
381 | dma_addr_t data_dma; | 382 | dma_addr_t data_dma; |
382 | dma_addr_t data_size; | 383 | dma_addr_t data_size; |
383 | }; | 384 | }; |