• Maxim Mikityanskiy's avatar
    xsk: Add rcu_read_lock around the XSK wakeup · 06870682
    Maxim Mikityanskiy authored
    The XSK wakeup callback in drivers makes some sanity checks before
    triggering NAPI. However, some configuration changes may occur during
    this function that affect the result of those checks. For example, the
    interface can go down, and all the resources will be destroyed after the
    checks in the wakeup function, but before it attempts to use these
    resources. Wrap this callback in rcu_read_lock to allow driver to
    synchronize_rcu before actually destroying the resources.
    
    xsk_wakeup is a new function that encapsulates calling ndo_xsk_wakeup
    wrapped into the RCU lock. After this commit, xsk_poll starts using
    xsk_wakeup and checks xs->zc instead of ndo_xsk_wakeup != NULL to decide
    ndo_xsk_wakeup should be called. It also fixes a bug introduced with the
    need_wakeup feature: a non-zero-copy socket may be used with a driver
    supporting zero-copy, and in this case ndo_xsk_wakeup should not be
    called, so the xs->zc check is the correct one.
    
    Fixes: 77cd0d7b ("xsk: add support for need_wakeup flag in AF_XDP rings")
    Signed-off-by: default avatarMaxim Mikityanskiy <maximmi@mellanox.com>
    Signed-off-by: default avatarBjörn Töpel <bjorn.topel@intel.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/20191217162023.16011-2-maximmi@mellanox.com
    06870682
xsk.c 26.6 KB