• Alexander Lobakin's avatar
    ice: Fix XDP Tx ring overrun · 0bd939b6
    Alexander Lobakin authored
    Sometimes, under heavy XDP Tx traffic, e.g. when using XDP traffic
    generator (%BPF_F_TEST_XDP_LIVE_FRAMES), the machine can catch OOM due
    to the driver not freeing all of the pages passed to it by
    .ndo_xdp_xmit().
    Turned out that during the development of the tagged commit, the check,
    which ensures that we have a free descriptor to queue a frame, moved
    into the branch happening only when a buffer has frags. Otherwise, we
    only run a cleaning cycle, but don't check anything.
    ATST, there can be situations when the driver gets new frames to send,
    but there are no buffers that can be cleaned/completed and the ring has
    no free slots. It's very rare, but still possible (> 6.5 Mpps per ring).
    The driver then fills the next buffer/descriptor, effectively
    overwriting the data, which still needs to be freed.
    
    Restore the check after the cleaning routine to make sure there is a
    slot to queue a new frame. When there are frags, there still will be a
    separate check that we can place all of them, but if the ring is full,
    there's no point in wasting any more time.
    
    (minor: make `!ready_frames` unlikely since it happens ~1-2 times per
     billion of frames)
    
    Fixes: 3246a107 ("ice: Add support for XDP multi-buffer on Tx side")
    Signed-off-by: default avatarAlexander Lobakin <alexandr.lobakin@intel.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarMaciej Fijalkowski <maciej.fijalkowski@intel.com>
    Link: https://lore.kernel.org/bpf/20230210170618.1973430-3-alexandr.lobakin@intel.com
    0bd939b6
ice_txrx_lib.c 12 KB