• Jan Beulich's avatar
    xen-netfront: pull on receive skb may need to happen earlier · 093b9c71
    Jan Beulich authored
    Due to commit 3683243b ("xen-netfront: use __pskb_pull_tail to ensure
    linear area is big enough on RX") xennet_fill_frags() may end up
    filling MAX_SKB_FRAGS + 1 fragments in a receive skb, and only reduce
    the fragment count subsequently via __pskb_pull_tail(). That's a
    result of xennet_get_responses() allowing a maximum of one more slot to
    be consumed (and intermediately transformed into a fragment) if the
    head slot has a size less than or equal to RX_COPY_THRESHOLD.
    
    Hence we need to adjust xennet_fill_frags() to pull earlier if we
    reached the maximum fragment count - due to the described behavior of
    xennet_get_responses() this guarantees that at least the first fragment
    will get completely consumed, and hence the fragment count reduced.
    
    In order to not needlessly call __pskb_pull_tail() twice, make the
    original call conditional upon the pull target not having been reached
    yet, and defer the newly added one as much as possible (an alternative
    would have been to always call the function right before the call to
    xennet_fill_frags(), but that would imply more frequent cases of
    needing to call it twice).
    Signed-off-by: default avatarJan Beulich <jbeulich@suse.com>
    Acked-by: default avatarWei Liu <wei.liu2@citrix.com>
    Cc: Ian Campbell <ian.campbell@citrix.com>
    Cc: stable@vger.kernel.org (3.6 onwards)
    Acked-by: default avatarIan Campbell <ian.campbell@citrix.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    093b9c71
xen-netfront.c 52.1 KB