• Maciej Fijalkowski's avatar
    xsk: Fix l2fwd for copy mode + busy poll combo · 8de8b71b
    Maciej Fijalkowski authored
    While checking AF_XDP copy mode combined with busy poll, strange
    results were observed. rxdrop and txonly scenarios worked fine, but
    l2fwd broke immediately.
    
    After a deeper look, it turned out that for l2fwd, Tx side was exiting
    early due to xsk_no_wakeup() returning true and in the end
    xsk_generic_xmit() was never called. Note that AF_XDP Tx in copy mode
    is syscall steered, so the current behavior is broken.
    
    Txonly scenario only worked due to the fact that
    sk_mark_napi_id_once_xdp() was never called - since Rx side is not in
    the picture for this case and mentioned function is called in
    xsk_rcv_check(), sk::sk_napi_id was never set, which in turn meant that
    xsk_no_wakeup() was returning false (see the sk->sk_napi_id >=
    MIN_NAPI_ID check in there).
    
    To fix this, prefer busy poll in xsk_sendmsg() only when zero copy is
    enabled on a given AF_XDP socket. By doing so, busy poll in copy mode
    would not exit early on Tx side and eventually xsk_generic_xmit() will
    be called.
    
    Fixes: a0731952 ("xsk: Add busy-poll support for {recv,send}msg()")
    Signed-off-by: default avatarMaciej Fijalkowski <maciej.fijalkowski@intel.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/20220406155804.434493-1-maciej.fijalkowski@intel.com
    8de8b71b
xsk.c 32.5 KB