Commit ea11bbe0 authored by Benjamin LaHaise's avatar Benjamin LaHaise Committed by David S. Miller

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: default avatarBenjamin LaHaise <ben.lahaise@neterion.com>
Signed-off-by: default avatarSreenivasa Honnur <sreenivasa.honnur@neterion.com>
Signed-off-by: default avatarRamkrishna Vepa <ram.vepa@neterion.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3f23e436
...@@ -286,6 +286,7 @@ vxge_rx_alloc(void *dtrh, struct vxge_ring *ring, const int skb_size) ...@@ -286,6 +286,7 @@ vxge_rx_alloc(void *dtrh, struct vxge_ring *ring, const int skb_size)
skb_reserve(skb, VXGE_HW_HEADER_ETHERNET_II_802_3_ALIGN); skb_reserve(skb, VXGE_HW_HEADER_ETHERNET_II_802_3_ALIGN);
rx_priv->skb = skb; rx_priv->skb = skb;
rx_priv->skb_data = NULL;
rx_priv->data_size = skb_size; rx_priv->data_size = skb_size;
vxge_debug_entryexit(VXGE_TRACE, vxge_debug_entryexit(VXGE_TRACE,
"%s: %s:%d Exiting...", ring->ndev->name, __func__, __LINE__); "%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,7 +306,8 @@ static int vxge_rx_map(void *dtrh, struct vxge_ring *ring)
ring->ndev->name, __func__, __LINE__); ring->ndev->name, __func__, __LINE__);
rx_priv = vxge_hw_ring_rxd_private_get(dtrh); rx_priv = vxge_hw_ring_rxd_private_get(dtrh);
dma_addr = pci_map_single(ring->pdev, rx_priv->skb->data, rx_priv->skb_data = rx_priv->skb->data;
dma_addr = pci_map_single(ring->pdev, rx_priv->skb_data,
rx_priv->data_size, PCI_DMA_FROMDEVICE); rx_priv->data_size, PCI_DMA_FROMDEVICE);
if (dma_addr == 0) { if (dma_addr == 0) {
...@@ -450,6 +452,7 @@ vxge_rx_1b_compl(struct __vxge_hw_ring *ringh, void *dtr, ...@@ -450,6 +452,7 @@ vxge_rx_1b_compl(struct __vxge_hw_ring *ringh, void *dtr,
skb = rx_priv->skb; skb = rx_priv->skb;
data_size = rx_priv->data_size; data_size = rx_priv->data_size;
data_dma = rx_priv->data_dma; data_dma = rx_priv->data_dma;
prefetch(rx_priv->skb_data);
vxge_debug_rx(VXGE_TRACE, vxge_debug_rx(VXGE_TRACE,
"%s: %s:%d skb = 0x%p", "%s: %s:%d skb = 0x%p",
...@@ -1056,6 +1059,7 @@ vxge_rx_term(void *dtrh, enum vxge_hw_rxd_state state, void *userdata) ...@@ -1056,6 +1059,7 @@ vxge_rx_term(void *dtrh, enum vxge_hw_rxd_state state, void *userdata)
rx_priv->data_size, PCI_DMA_FROMDEVICE); rx_priv->data_size, PCI_DMA_FROMDEVICE);
dev_kfree_skb(rx_priv->skb); dev_kfree_skb(rx_priv->skb);
rx_priv->skb_data = NULL;
vxge_debug_entryexit(VXGE_TRACE, vxge_debug_entryexit(VXGE_TRACE,
"%s: %s:%d Exiting...", "%s: %s:%d Exiting...",
......
...@@ -378,6 +378,7 @@ struct vxgedev { ...@@ -378,6 +378,7 @@ struct vxgedev {
struct vxge_rx_priv { struct vxge_rx_priv {
struct sk_buff *skb; struct sk_buff *skb;
unsigned char *skb_data;
dma_addr_t data_dma; dma_addr_t data_dma;
dma_addr_t data_size; dma_addr_t data_size;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment