diff options
| author | Eric Dumazet <eric.dumazet@gmail.com> | 2009-06-05 00:04:16 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-06-08 03:21:48 -0400 |
| commit | 042a53a9e437feaf2230dd2cadcecfae9c7bfe05 (patch) | |
| tree | ae9078f61e390a3014aecb3fe80d3438ab25ee51 /drivers/net/tg3.c | |
| parent | eae3f29cc73f83cc3f1891d3ad40021b5172c630 (diff) | |
net: skb_shared_info optimization
skb_dma_unmap() is quite expensive for small packets,
because we use two different cache lines from skb_shared_info.
One to access nr_frags, one to access dma_maps[0]
Instead of dma_maps being an array of MAX_SKB_FRAGS + 1 elements,
let dma_head alone in a new dma_head field, close to nr_frags,
to reduce cache lines misses.
Tested on my dev machine (bnx2 & tg3 adapters), nice speedup !
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/tg3.c')
| -rw-r--r-- | drivers/net/tg3.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index a39b534fb43..46a3f86125b 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -5021,7 +5021,7 @@ static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb, | |||
| 5021 | /* New SKB is guaranteed to be linear. */ | 5021 | /* New SKB is guaranteed to be linear. */ |
| 5022 | entry = *start; | 5022 | entry = *start; |
| 5023 | ret = skb_dma_map(&tp->pdev->dev, new_skb, DMA_TO_DEVICE); | 5023 | ret = skb_dma_map(&tp->pdev->dev, new_skb, DMA_TO_DEVICE); |
| 5024 | new_addr = skb_shinfo(new_skb)->dma_maps[0]; | 5024 | new_addr = skb_shinfo(new_skb)->dma_head; |
| 5025 | 5025 | ||
| 5026 | /* Make sure new skb does not cross any 4G boundaries. | 5026 | /* Make sure new skb does not cross any 4G boundaries. |
| 5027 | * Drop the packet if it does. | 5027 | * Drop the packet if it does. |
| @@ -5155,7 +5155,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 5155 | 5155 | ||
| 5156 | sp = skb_shinfo(skb); | 5156 | sp = skb_shinfo(skb); |
| 5157 | 5157 | ||
| 5158 | mapping = sp->dma_maps[0]; | 5158 | mapping = sp->dma_head; |
| 5159 | 5159 | ||
| 5160 | tp->tx_buffers[entry].skb = skb; | 5160 | tp->tx_buffers[entry].skb = skb; |
| 5161 | 5161 | ||
| @@ -5173,7 +5173,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 5173 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | 5173 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
| 5174 | 5174 | ||
| 5175 | len = frag->size; | 5175 | len = frag->size; |
| 5176 | mapping = sp->dma_maps[i + 1]; | 5176 | mapping = sp->dma_maps[i]; |
| 5177 | tp->tx_buffers[entry].skb = NULL; | 5177 | tp->tx_buffers[entry].skb = NULL; |
| 5178 | 5178 | ||
| 5179 | tg3_set_txd(tp, entry, mapping, len, | 5179 | tg3_set_txd(tp, entry, mapping, len, |
| @@ -5331,7 +5331,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) | |||
| 5331 | 5331 | ||
| 5332 | sp = skb_shinfo(skb); | 5332 | sp = skb_shinfo(skb); |
| 5333 | 5333 | ||
| 5334 | mapping = sp->dma_maps[0]; | 5334 | mapping = sp->dma_head; |
| 5335 | 5335 | ||
| 5336 | tp->tx_buffers[entry].skb = skb; | 5336 | tp->tx_buffers[entry].skb = skb; |
| 5337 | 5337 | ||
| @@ -5356,7 +5356,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) | |||
| 5356 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | 5356 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
| 5357 | 5357 | ||
| 5358 | len = frag->size; | 5358 | len = frag->size; |
| 5359 | mapping = sp->dma_maps[i + 1]; | 5359 | mapping = sp->dma_maps[i]; |
| 5360 | 5360 | ||
| 5361 | tp->tx_buffers[entry].skb = NULL; | 5361 | tp->tx_buffers[entry].skb = NULL; |
| 5362 | 5362 | ||
