diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-10-13 12:39:27 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-10-13 22:25:21 -0400 |
commit | e7e5a4033f765e2a37095cd0a73261c99840f77e (patch) | |
tree | d654c4973917e2b82263a5e4afb49ba0cada4fde /drivers/net/ethernet/sun/niu.c | |
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/sun/niu.c')
-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) } static void niu_rx_skb_append(struct sk_buff *skb, struct page *page, - u32 offset, u32 size) + u32 offset, u32 size, u32 truesize) { - int i = skb_shinfo(skb)->nr_frags; - - __skb_fill_page_desc(skb, i, page, offset, size); + skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page, offset, size); skb->len += size; skb->data_len += size; - skb->truesize += size; - - skb_shinfo(skb)->nr_frags = i + 1; + skb->truesize += truesize; } 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, } else if (!(val & RCR_ENTRY_MULTI)) append_size = len - skb->len; - niu_rx_skb_append(skb, page, off, append_size); + niu_rx_skb_append(skb, page, off, append_size, rcr_size); if ((page->index + rp->rbr_block_size) - rcr_size == addr) { *link = (struct page *) page->mapping; np->ops->unmap_page(np->device, page->index, |