diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-11-15 02:30:05 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-11-18 02:04:47 -0500 |
commit | dd2bc8e9c0685d8eaaaf06e65919e31d60478411 (patch) | |
tree | 228e68ebf3f4f8012be3f8c48a4172c9201d59dd /drivers/net/ethernet/broadcom/bnx2.h | |
parent | adc9300e78e6091a7eaa1821213836379d4dbaa8 (diff) |
bnx2: switch to build_skb() infrastructure
This is very similar to bnx2x conversion, but bnx2 only requires 16bytes
alignement at start of the received frame to store its l2_fhdr, so goal
was not to reduce skb truesize (in fact it should not change after this
patch)
Using build_skb() reduces cache line misses in the driver, since we
use cache hot skb instead of cold ones. Number of in-flight sk_buff
structures is lower, they are more likely recycled in SLUB caches
while still hot.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Michael Chan <mchan@broadcom.com>
CC: Eilon Greenstein <eilong@broadcom.com>
Reviewed-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnx2.h')
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2.h | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2.h b/drivers/net/ethernet/broadcom/bnx2.h index 99d31a7d6aaa..1db2d51ba3f1 100644 --- a/drivers/net/ethernet/broadcom/bnx2.h +++ b/drivers/net/ethernet/broadcom/bnx2.h | |||
@@ -6563,12 +6563,25 @@ struct l2_fhdr { | |||
6563 | #define MB_TX_CID_ADDR MB_GET_CID_ADDR(TX_CID) | 6563 | #define MB_TX_CID_ADDR MB_GET_CID_ADDR(TX_CID) |
6564 | #define MB_RX_CID_ADDR MB_GET_CID_ADDR(RX_CID) | 6564 | #define MB_RX_CID_ADDR MB_GET_CID_ADDR(RX_CID) |
6565 | 6565 | ||
6566 | /* | ||
6567 | * This driver uses new build_skb() API : | ||
6568 | * RX ring buffer contains pointer to kmalloc() data only, | ||
6569 | * skb are built only after Hardware filled the frame. | ||
6570 | */ | ||
6566 | struct sw_bd { | 6571 | struct sw_bd { |
6567 | struct sk_buff *skb; | 6572 | u8 *data; |
6568 | struct l2_fhdr *desc; | ||
6569 | DEFINE_DMA_UNMAP_ADDR(mapping); | 6573 | DEFINE_DMA_UNMAP_ADDR(mapping); |
6570 | }; | 6574 | }; |
6571 | 6575 | ||
6576 | /* Its faster to compute this from data than storing it in sw_bd | ||
6577 | * (less cache misses) | ||
6578 | */ | ||
6579 | static inline struct l2_fhdr *get_l2_fhdr(u8 *data) | ||
6580 | { | ||
6581 | return (struct l2_fhdr *)(PTR_ALIGN(data, BNX2_RX_ALIGN) + NET_SKB_PAD); | ||
6582 | } | ||
6583 | |||
6584 | |||
6572 | struct sw_pg { | 6585 | struct sw_pg { |
6573 | struct page *page; | 6586 | struct page *page; |
6574 | DEFINE_DMA_UNMAP_ADDR(mapping); | 6587 | DEFINE_DMA_UNMAP_ADDR(mapping); |