• Zoltan Kiss's avatar
    xen-netfront: Fix handling packets on compound pages with skb_linearize · 97a6d1bb
    Zoltan Kiss authored
    There is a long known problem with the netfront/netback interface: if the guest
    tries to send a packet which constitues more than MAX_SKB_FRAGS + 1 ring slots,
    it gets dropped. The reason is that netback maps these slots to a frag in the
    frags array, which is limited by size. Having so many slots can occur since
    compound pages were introduced, as the ring protocol slice them up into
    individual (non-compound) page aligned slots. The theoretical worst case
    scenario looks like this (note, skbs are limited to 64 Kb here):
    linear buffer: at most PAGE_SIZE - 17 * 2 bytes, overlapping page boundary,
    using 2 slots
    first 15 frags: 1 + PAGE_SIZE + 1 bytes long, first and last bytes are at the
    end and the beginning of a page, therefore they use 3 * 15 = 45 slots
    last 2 frags: 1 + 1 bytes, overlapping page boundary, 2 * 2 = 4 slots
    Although I don't think this 51 slots skb can really happen, we need a solution
    which can deal with every scenario. In real life there is only a few slots
    overdue, but usually it causes the TCP stream to be blocked, as the retry will
    most likely have the same buffer layout.
    This patch solves this problem by linearizing the packet. This is not the
    fastest way, and it can fail much easier as it tries to allocate a big linear
    area for the whole packet, but probably easier by an order of magnitude than
    anything else. Probably this code path is not touched very frequently anyway.
    Signed-off-by: default avatarZoltan Kiss <zoltan.kiss@citrix.com>
    Cc: Wei Liu <wei.liu2@citrix.com>
    Cc: Ian Campbell <Ian.Campbell@citrix.com>
    Cc: Paul Durrant <paul.durrant@citrix.com>
    Cc: netdev@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Cc: xen-devel@lists.xenproject.org
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    97a6d1bb
xen-netfront.c 59 KB