• Maciej Fijalkowski's avatar
    ice: xsk: use Rx ring's XDP ring when picking NAPI context · 9ead7e74
    Maciej Fijalkowski authored
    Ice driver allocates per cpu XDP queues so that redirect path can safely
    use smp_processor_id() as an index to the array. At the same time
    though, XDP rings are used to pick NAPI context to call napi_schedule()
    or set NAPIF_STATE_MISSED. When user reduces queue count, say to 8, and
    num_possible_cpus() of underlying platform is 44, then this means queue
    vectors with correlated NAPI contexts will carry several XDP queues.
    
    This in turn can result in a broken behavior where NAPI context of
    interest will never be scheduled and AF_XDP socket will not process any
    traffic.
    
    To fix this, let us change the way how XDP rings are assigned to Rx
    rings and use this information later on when setting
    ice_tx_ring::xsk_pool pointer. For each Rx ring, grab the associated
    queue vector and walk through Tx ring's linked list. Once we stumble
    upon XDP ring in it, assign this ring to ice_rx_ring::xdp_ring.
    
    Previous [0] approach of fixing this issue was for txonly scenario
    because of the described grouping of XDP rings across queue vectors. So,
    relying on Rx ring meant that NAPI context could be scheduled with a
    queue vector without XDP ring with associated XSK pool.
    
    [0]: https://lore.kernel.org/netdev/20220707161128.54215-1-maciej.fijalkowski@intel.com/
    
    Fixes: 2d4238f5 ("ice: Add support for AF_XDP")
    Fixes: 22bf877e ("ice: introduce XDP_TX fallback path")
    Signed-off-by: default avatarMaciej Fijalkowski <maciej.fijalkowski@intel.com>
    Tested-by: default avatarGeorge Kuruvinakunnel <george.kuruvinakunnel@intel.com>
    Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
    9ead7e74
ice_xsk.c 26.4 KB