aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2011-10-13 08:39:27 -0400
committerDavid S. Miller <davem@davemloft.net>2011-10-13 22:25:21 -0400
commite7e5a4033f765e2a37095cd0a73261c99840f77e (patch)
treed654c4973917e2b82263a5e4afb49ba0cada4fde /drivers/net/ethernet
parent5e6c355c47e75314fd2282d087616069d4093ecf (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.c12
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
3289static void niu_rx_skb_append(struct sk_buff *skb, struct page *page, 3289static 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
3303static unsigned int niu_hash_rxaddr(struct rx_ring_info *rp, u64 a) 3299static 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,