diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-10-13 08:39:27 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-10-13 22:25:21 -0400 |
commit | e7e5a4033f765e2a37095cd0a73261c99840f77e (patch) | |
tree | d654c4973917e2b82263a5e4afb49ba0cada4fde /drivers/net/ethernet | |
parent | 5e6c355c47e75314fd2282d087616069d4093ecf (diff) |
niu: fix skb truesize underestimation
Add a 'truesize' argument to niu_rx_skb_append(), filled with rcr_size
by the caller to properly account frag sizes in skb->truesize
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r-- | drivers/net/ethernet/sun/niu.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c index d1338885dc8b..23740e848ac9 100644 --- a/drivers/net/ethernet/sun/niu.c +++ b/drivers/net/ethernet/sun/niu.c | |||
@@ -3287,17 +3287,13 @@ static u16 tcam_get_valid_entry_cnt(struct niu *np) | |||
3287 | } | 3287 | } |
3288 | 3288 | ||
3289 | static void niu_rx_skb_append(struct sk_buff *skb, struct page *page, | 3289 | static void niu_rx_skb_append(struct sk_buff *skb, struct page *page, |
3290 | u32 offset, u32 size) | 3290 | u32 offset, u32 size, u32 truesize) |
3291 | { | 3291 | { |
3292 | int i = skb_shinfo(skb)->nr_frags; | 3292 | skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page, offset, size); |
3293 | |||
3294 | __skb_fill_page_desc(skb, i, page, offset, size); | ||
3295 | 3293 | ||
3296 | skb->len += size; | 3294 | skb->len += size; |
3297 | skb->data_len += size; | 3295 | skb->data_len += size; |
3298 | skb->truesize += size; | 3296 | skb->truesize += truesize; |
3299 | |||
3300 | skb_shinfo(skb)->nr_frags = i + 1; | ||
3301 | } | 3297 | } |
3302 | 3298 | ||
3303 | static unsigned int niu_hash_rxaddr(struct rx_ring_info *rp, u64 a) | 3299 | static unsigned int niu_hash_rxaddr(struct rx_ring_info *rp, u64 a) |
@@ -3480,7 +3476,7 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, | |||
3480 | } else if (!(val & RCR_ENTRY_MULTI)) | 3476 | } else if (!(val & RCR_ENTRY_MULTI)) |
3481 | append_size = len - skb->len; | 3477 | append_size = len - skb->len; |
3482 | 3478 | ||
3483 | niu_rx_skb_append(skb, page, off, append_size); | 3479 | niu_rx_skb_append(skb, page, off, append_size, rcr_size); |
3484 | if ((page->index + rp->rbr_block_size) - rcr_size == addr) { | 3480 | if ((page->index + rp->rbr_block_size) - rcr_size == addr) { |
3485 | *link = (struct page *) page->mapping; | 3481 | *link = (struct page *) page->mapping; |
3486 | np->ops->unmap_page(np->device, page->index, | 3482 | np->ops->unmap_page(np->device, page->index, |