xen/netfront: improve truesize tracking
Using RX_COPY_THRESHOLD is incorrect if the SKB is actually smaller than that. We have already accounted for this in NETFRONT_SKB_CB(skb)->pull_to so use that instead. Fixes WARN_ON from skb_try_coalesce. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Cc: Sander Eikelenboom <linux@eikelenboom.it> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Cc: annie li <annie.li@oracle.com> Cc: xen-devel@lists.xen.org Cc: netdev@vger.kernel.org Cc: stable@kernel.org # 3.7.x only Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
32fa10b24e
Коммит
d9a58a782e
|
@ -1015,29 +1015,10 @@ err:
|
|||
i = xennet_fill_frags(np, skb, &tmpq);
|
||||
|
||||
/*
|
||||
* Truesize approximates the size of true data plus
|
||||
* any supervisor overheads. Adding hypervisor
|
||||
* overheads has been shown to significantly reduce
|
||||
* achievable bandwidth with the default receive
|
||||
* buffer size. It is therefore not wise to account
|
||||
* for it here.
|
||||
*
|
||||
* After alloc_skb(RX_COPY_THRESHOLD), truesize is set
|
||||
* to RX_COPY_THRESHOLD + the supervisor
|
||||
* overheads. Here, we add the size of the data pulled
|
||||
* in xennet_fill_frags().
|
||||
*
|
||||
* We also adjust for any unused space in the main
|
||||
* data area by subtracting (RX_COPY_THRESHOLD -
|
||||
* len). This is especially important with drivers
|
||||
* which split incoming packets into header and data,
|
||||
* using only 66 bytes of the main data area (see the
|
||||
* e1000 driver for example.) On such systems,
|
||||
* without this last adjustement, our achievable
|
||||
* receive throughout using the standard receive
|
||||
* buffer size was cut by 25%(!!!).
|
||||
*/
|
||||
skb->truesize += skb->data_len - RX_COPY_THRESHOLD;
|
||||
* Truesize is the actual allocation size, even if the
|
||||
* allocation is only partially used.
|
||||
*/
|
||||
skb->truesize += PAGE_SIZE * skb_shinfo(skb)->nr_frags;
|
||||
skb->len += skb->data_len;
|
||||
|
||||
if (rx->flags & XEN_NETRXF_csum_blank)
|
||||
|
|
Загрузка…
Ссылка в новой задаче