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/igb | |
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/igb')
-rw-r--r-- | drivers/net/igb/igb_main.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index 958b2879da48..ea17319624aa 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
@@ -3139,8 +3139,7 @@ static inline int igb_tx_map_adv(struct igb_adapter *adapter, | |||
3139 | /* set time_stamp *before* dma to help avoid a possible race */ | 3139 | /* set time_stamp *before* dma to help avoid a possible race */ |
3140 | buffer_info->time_stamp = jiffies; | 3140 | buffer_info->time_stamp = jiffies; |
3141 | buffer_info->next_to_watch = i; | 3141 | buffer_info->next_to_watch = i; |
3142 | buffer_info->dma = map[count]; | 3142 | buffer_info->dma = skb_shinfo(skb)->dma_head; |
3143 | count++; | ||
3144 | 3143 | ||
3145 | for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) { | 3144 | for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) { |
3146 | struct skb_frag_struct *frag; | 3145 | struct skb_frag_struct *frag; |
@@ -3164,7 +3163,7 @@ static inline int igb_tx_map_adv(struct igb_adapter *adapter, | |||
3164 | tx_ring->buffer_info[i].skb = skb; | 3163 | tx_ring->buffer_info[i].skb = skb; |
3165 | tx_ring->buffer_info[first].next_to_watch = i; | 3164 | tx_ring->buffer_info[first].next_to_watch = i; |
3166 | 3165 | ||
3167 | return count; | 3166 | return count + 1; |
3168 | } | 3167 | } |
3169 | 3168 | ||
3170 | static inline void igb_tx_queue_adv(struct igb_adapter *adapter, | 3169 | static inline void igb_tx_queue_adv(struct igb_adapter *adapter, |