]> git.baikalelectronics.ru Git - kernel.git/commit
ice: xsk: use Rx ring's XDP ring when picking NAPI context
authorMaciej Fijalkowski <maciej.fijalkowski@intel.com>
Thu, 11 Aug 2022 18:21:49 +0000 (20:21 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Mon, 22 Aug 2022 15:47:26 +0000 (08:47 -0700)
commitf7802b2aca0ae92dbf20d61b0761d3d8b5cad8dd
treedbb1678bbf2737449a5aa10f1d48e993cf61291c
parente2fb783e7ff9a20f29d7337f90059e2d9991bce3
ice: xsk: use Rx ring's XDP ring when picking NAPI context

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: c0e590e847b4 ("ice: Add support for AF_XDP")
Fixes: db0ba47f7e66 ("ice: introduce XDP_TX fallback path")
Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Tested-by: George Kuruvinakunnel <george.kuruvinakunnel@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice.h
drivers/net/ethernet/intel/ice/ice_lib.c
drivers/net/ethernet/intel/ice/ice_main.c
drivers/net/ethernet/intel/ice/ice_xsk.c