• Maciej Fijalkowski's avatar
    ice: xsk: Fix indexing in ice_tx_xsk_pool() · 1ac2524d
    Maciej Fijalkowski authored
    Ice driver tries to always create XDP rings array to be
    num_possible_cpus() sized, regardless of user's queue count setting that
    can be changed via ethtool -L for example.
    
    Currently, ice_tx_xsk_pool() calculates the qid by decrementing the
    ring->q_index by the count of XDP queues, but ring->q_index is set to 'i
    + vsi->alloc_txq'.
    
    When user did ethtool -L $IFACE combined 1, alloc_txq is 1, but
    vsi->num_xdp_txq is still num_possible_cpus(). Then, ice_tx_xsk_pool()
    will do OOB access and in the final result ring would not get xsk_pool
    pointer assigned. Then, each ice_xsk_wakeup() call will fail with error
    and it will not be possible to get into NAPI and do the processing from
    driver side.
    
    Fix this by decrementing vsi->alloc_txq instead of vsi->num_xdp_txq from
    ring-q_index in ice_tx_xsk_pool() so the calculation is reflected to the
    setting of ring->q_index.
    
    Fixes: 22bf877e ("ice: introduce XDP_TX fallback path")
    Signed-off-by: default avatarMaciej Fijalkowski <maciej.fijalkowski@intel.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20220328142123.170157-5-maciej.fijalkowski@intel.com
    1ac2524d
ice.h 26.9 KB