Function ice_tx_xsk_pool() used to get XSK buffer pool associated with XDP Tx queue returns NULL when number of ordinary Tx queues is not equal to num_possible_cpus(). The function computes XDP Tx queue ID as an expression `ring->q_index - vsi->num_xdp_txq` but this is wrong because XDP Tx queues are placed after ordinary ones so the correct formula is `ring->q_index - vsi->alloc_txq`. Prior commit 792b2086584f ("ice: fix vsi->txq_map sizing") number of XDP Tx queues was equal to number of ordinary Tx queues so the bug in mentioned function was hidden. Reproducer: host# ethtool -L ens7f0 combined 1 host# ./xdpsock -i ens7f0 -q 0 -t -N samples/bpf/xdpsock_user.c:kick_tx:794: errno: 6/"No such device or address" sock0@ens7f0:0 txonly xdp-drv pps pkts 0.00 rx 0 0 tx 0 0 Fixes: 2d4238f55697 ("ice: Add support for AF_XDP") Fixes: 792b2086584f ("ice: fix vsi->txq_map sizing") Signed-off-by: Ivan Vecera <ivecera@xxxxxxxxxx> --- drivers/net/ethernet/intel/ice/ice.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h index b0b27bfcd7a2..d4f1874df7d0 100644 --- a/drivers/net/ethernet/intel/ice/ice.h +++ b/drivers/net/ethernet/intel/ice/ice.h @@ -710,7 +710,7 @@ static inline struct xsk_buff_pool *ice_tx_xsk_pool(struct ice_tx_ring *ring) struct ice_vsi *vsi = ring->vsi; u16 qid; - qid = ring->q_index - vsi->num_xdp_txq; + qid = ring->q_index - vsi->alloc_txq; if (!ice_is_xdp_ena_vsi(vsi) || !test_bit(qid, vsi->af_xdp_zc_qps)) return NULL; -- 2.34.1