Skip to content

Commit b02e5a0

Browse files
Björn Töpelborkmann
authored andcommitted
xsk: Propagate napi_id to XDP socket Rx path
Add napi_id to the xdp_rxq_info structure, and make sure the XDP socket pick up the napi_id in the Rx path. The napi_id is used to find the corresponding NAPI structure for socket busy polling. Signed-off-by: Björn Töpel <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Acked-by: Ilias Apalodimas <[email protected]> Acked-by: Michael S. Tsirkin <[email protected]> Acked-by: Tariq Toukan <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent a073195 commit b02e5a0

File tree

29 files changed

+54
-36
lines changed

29 files changed

+54
-36
lines changed

drivers/net/ethernet/amazon/ena/ena_netdev.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ static int ena_xdp_register_rxq_info(struct ena_ring *rx_ring)
416416
{
417417
int rc;
418418

419-
rc = xdp_rxq_info_reg(&rx_ring->xdp_rxq, rx_ring->netdev, rx_ring->qid);
419+
rc = xdp_rxq_info_reg(&rx_ring->xdp_rxq, rx_ring->netdev, rx_ring->qid, 0);
420420

421421
if (rc) {
422422
netif_err(rx_ring->adapter, ifup, rx_ring->netdev,

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2884,7 +2884,7 @@ static int bnxt_alloc_rx_rings(struct bnxt *bp)
28842884
if (rc)
28852885
return rc;
28862886

2887-
rc = xdp_rxq_info_reg(&rxr->xdp_rxq, bp->dev, i);
2887+
rc = xdp_rxq_info_reg(&rxr->xdp_rxq, bp->dev, i, 0);
28882888
if (rc < 0)
28892889
return rc;
28902890

drivers/net/ethernet/cavium/thunder/nicvf_queues.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,7 @@ static void nicvf_rcv_queue_config(struct nicvf *nic, struct queue_set *qs,
770770
rq->caching = 1;
771771

772772
/* Driver have no proper error path for failed XDP RX-queue info reg */
773-
WARN_ON(xdp_rxq_info_reg(&rq->xdp_rxq, nic->netdev, qidx) < 0);
773+
WARN_ON(xdp_rxq_info_reg(&rq->xdp_rxq, nic->netdev, qidx, 0) < 0);
774774

775775
/* Send a mailbox msg to PF to config RQ */
776776
mbx.rq.msg = NIC_MBOX_MSG_RQ_CFG;

drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3334,7 +3334,7 @@ static int dpaa2_eth_setup_rx_flow(struct dpaa2_eth_priv *priv,
33343334
return 0;
33353335

33363336
err = xdp_rxq_info_reg(&fq->channel->xdp_rxq, priv->net_dev,
3337-
fq->flowid);
3337+
fq->flowid, 0);
33383338
if (err) {
33393339
dev_err(dev, "xdp_rxq_info_reg failed\n");
33403340
return err;

drivers/net/ethernet/intel/i40e/i40e_txrx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1447,7 +1447,7 @@ int i40e_setup_rx_descriptors(struct i40e_ring *rx_ring)
14471447
/* XDP RX-queue info only needed for RX rings exposed to XDP */
14481448
if (rx_ring->vsi->type == I40E_VSI_MAIN) {
14491449
err = xdp_rxq_info_reg(&rx_ring->xdp_rxq, rx_ring->netdev,
1450-
rx_ring->queue_index);
1450+
rx_ring->queue_index, rx_ring->q_vector->napi.napi_id);
14511451
if (err < 0)
14521452
return err;
14531453
}

drivers/net/ethernet/intel/ice/ice_base.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ int ice_setup_rx_ctx(struct ice_ring *ring)
306306
if (!xdp_rxq_info_is_reg(&ring->xdp_rxq))
307307
/* coverity[check_return] */
308308
xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
309-
ring->q_index);
309+
ring->q_index, ring->q_vector->napi.napi_id);
310310

311311
ring->xsk_pool = ice_xsk_pool(ring);
312312
if (ring->xsk_pool) {
@@ -333,7 +333,7 @@ int ice_setup_rx_ctx(struct ice_ring *ring)
333333
/* coverity[check_return] */
334334
xdp_rxq_info_reg(&ring->xdp_rxq,
335335
ring->netdev,
336-
ring->q_index);
336+
ring->q_index, ring->q_vector->napi.napi_id);
337337

338338
err = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
339339
MEM_TYPE_PAGE_SHARED,

drivers/net/ethernet/intel/ice/ice_txrx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ int ice_setup_rx_ring(struct ice_ring *rx_ring)
483483
if (rx_ring->vsi->type == ICE_VSI_PF &&
484484
!xdp_rxq_info_is_reg(&rx_ring->xdp_rxq))
485485
if (xdp_rxq_info_reg(&rx_ring->xdp_rxq, rx_ring->netdev,
486-
rx_ring->q_index))
486+
rx_ring->q_index, rx_ring->q_vector->napi.napi_id))
487487
goto err;
488488
return 0;
489489

drivers/net/ethernet/intel/igb/igb_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4352,7 +4352,7 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring)
43524352

43534353
/* XDP RX-queue info */
43544354
if (xdp_rxq_info_reg(&rx_ring->xdp_rxq, rx_ring->netdev,
4355-
rx_ring->queue_index) < 0)
4355+
rx_ring->queue_index, 0) < 0)
43564356
goto err;
43574357

43584358
return 0;

drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6577,7 +6577,7 @@ int ixgbe_setup_rx_resources(struct ixgbe_adapter *adapter,
65776577

65786578
/* XDP RX-queue info */
65796579
if (xdp_rxq_info_reg(&rx_ring->xdp_rxq, adapter->netdev,
6580-
rx_ring->queue_index) < 0)
6580+
rx_ring->queue_index, rx_ring->q_vector->napi.napi_id) < 0)
65816581
goto err;
65826582

65836583
rx_ring->xdp_prog = adapter->xdp_prog;

drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3493,7 +3493,7 @@ int ixgbevf_setup_rx_resources(struct ixgbevf_adapter *adapter,
34933493

34943494
/* XDP RX-queue info */
34953495
if (xdp_rxq_info_reg(&rx_ring->xdp_rxq, adapter->netdev,
3496-
rx_ring->queue_index) < 0)
3496+
rx_ring->queue_index, 0) < 0)
34973497
goto err;
34983498

34993499
rx_ring->xdp_prog = adapter->xdp_prog;

drivers/net/ethernet/marvell/mvneta.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3227,7 +3227,7 @@ static int mvneta_create_page_pool(struct mvneta_port *pp,
32273227
return err;
32283228
}
32293229

3230-
err = xdp_rxq_info_reg(&rxq->xdp_rxq, pp->dev, rxq->id);
3230+
err = xdp_rxq_info_reg(&rxq->xdp_rxq, pp->dev, rxq->id, 0);
32313231
if (err < 0)
32323232
goto err_free_pp;
32333233

drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2614,11 +2614,11 @@ static int mvpp2_rxq_init(struct mvpp2_port *port,
26142614
mvpp2_rxq_status_update(port, rxq->id, 0, rxq->size);
26152615

26162616
if (priv->percpu_pools) {
2617-
err = xdp_rxq_info_reg(&rxq->xdp_rxq_short, port->dev, rxq->id);
2617+
err = xdp_rxq_info_reg(&rxq->xdp_rxq_short, port->dev, rxq->id, 0);
26182618
if (err < 0)
26192619
goto err_free_dma;
26202620

2621-
err = xdp_rxq_info_reg(&rxq->xdp_rxq_long, port->dev, rxq->id);
2621+
err = xdp_rxq_info_reg(&rxq->xdp_rxq_long, port->dev, rxq->id, 0);
26222622
if (err < 0)
26232623
goto err_unregister_rxq_short;
26242624

drivers/net/ethernet/mellanox/mlx4/en_rx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
283283
ring->log_stride = ffs(ring->stride) - 1;
284284
ring->buf_size = ring->size * ring->stride + TXBB_SIZE;
285285

286-
if (xdp_rxq_info_reg(&ring->xdp_rxq, priv->dev, queue_index) < 0)
286+
if (xdp_rxq_info_reg(&ring->xdp_rxq, priv->dev, queue_index, 0) < 0)
287287
goto err_ring;
288288

289289
tmp = size * roundup_pow_of_two(MLX4_EN_MAX_RX_FRAGS *

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ static int mlx5e_alloc_rq(struct mlx5e_channel *c,
434434
rq_xdp_ix = rq->ix;
435435
if (xsk)
436436
rq_xdp_ix += params->num_channels * MLX5E_RQ_GROUP_XSK;
437-
err = xdp_rxq_info_reg(&rq->xdp_rxq, rq->netdev, rq_xdp_ix);
437+
err = xdp_rxq_info_reg(&rq->xdp_rxq, rq->netdev, rq_xdp_ix, 0);
438438
if (err < 0)
439439
goto err_rq_xdp_prog;
440440

drivers/net/ethernet/netronome/nfp/nfp_net_common.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2533,7 +2533,7 @@ nfp_net_rx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring)
25332533

25342534
if (dp->netdev) {
25352535
err = xdp_rxq_info_reg(&rx_ring->xdp_rxq, dp->netdev,
2536-
rx_ring->idx);
2536+
rx_ring->idx, rx_ring->r_vec->napi.napi_id);
25372537
if (err < 0)
25382538
return err;
25392539
}

drivers/net/ethernet/qlogic/qede/qede_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1762,7 +1762,7 @@ static void qede_init_fp(struct qede_dev *edev)
17621762

17631763
/* Driver have no error path from here */
17641764
WARN_ON(xdp_rxq_info_reg(&fp->rxq->xdp_rxq, edev->ndev,
1765-
fp->rxq->rxq_id) < 0);
1765+
fp->rxq->rxq_id, 0) < 0);
17661766

17671767
if (xdp_rxq_info_reg_mem_model(&fp->rxq->xdp_rxq,
17681768
MEM_TYPE_PAGE_ORDER0,

drivers/net/ethernet/sfc/rx_common.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ void efx_init_rx_queue(struct efx_rx_queue *rx_queue)
262262

263263
/* Initialise XDP queue information */
264264
rc = xdp_rxq_info_reg(&rx_queue->xdp_rxq_info, efx->net_dev,
265-
rx_queue->core_index);
265+
rx_queue->core_index, 0);
266266

267267
if (rc) {
268268
netif_err(efx, rx_err, efx->net_dev,

drivers/net/ethernet/socionext/netsec.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1304,7 +1304,7 @@ static int netsec_setup_rx_dring(struct netsec_priv *priv)
13041304
goto err_out;
13051305
}
13061306

1307-
err = xdp_rxq_info_reg(&dring->xdp_rxq, priv->ndev, 0);
1307+
err = xdp_rxq_info_reg(&dring->xdp_rxq, priv->ndev, 0, priv->napi.napi_id);
13081308
if (err)
13091309
goto err_out;
13101310

drivers/net/ethernet/ti/cpsw_priv.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1186,7 +1186,7 @@ static int cpsw_ndev_create_xdp_rxq(struct cpsw_priv *priv, int ch)
11861186
pool = cpsw->page_pool[ch];
11871187
rxq = &priv->xdp_rxq[ch];
11881188

1189-
ret = xdp_rxq_info_reg(rxq, priv->ndev, ch);
1189+
ret = xdp_rxq_info_reg(rxq, priv->ndev, ch, 0);
11901190
if (ret)
11911191
return ret;
11921192

drivers/net/hyperv/netvsc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1499,7 +1499,7 @@ struct netvsc_device *netvsc_device_add(struct hv_device *device,
14991499
u64_stats_init(&nvchan->tx_stats.syncp);
15001500
u64_stats_init(&nvchan->rx_stats.syncp);
15011501

1502-
ret = xdp_rxq_info_reg(&nvchan->xdp_rxq, ndev, i);
1502+
ret = xdp_rxq_info_reg(&nvchan->xdp_rxq, ndev, i, 0);
15031503

15041504
if (ret) {
15051505
netdev_err(ndev, "xdp_rxq_info_reg fail: %d\n", ret);

drivers/net/tun.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@ static int tun_attach(struct tun_struct *tun, struct file *file,
780780
} else {
781781
/* Setup XDP RX-queue info, for new tfile getting attached */
782782
err = xdp_rxq_info_reg(&tfile->xdp_rxq,
783-
tun->dev, tfile->queue_index);
783+
tun->dev, tfile->queue_index, 0);
784784
if (err < 0)
785785
goto out;
786786
err = xdp_rxq_info_reg_mem_model(&tfile->xdp_rxq,

drivers/net/veth.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,6 @@ static int veth_napi_add(struct net_device *dev)
884884
for (i = 0; i < dev->real_num_rx_queues; i++) {
885885
struct veth_rq *rq = &priv->rq[i];
886886

887-
netif_napi_add(dev, &rq->xdp_napi, veth_poll, NAPI_POLL_WEIGHT);
888887
napi_enable(&rq->xdp_napi);
889888
}
890889

@@ -926,7 +925,8 @@ static int veth_enable_xdp(struct net_device *dev)
926925
for (i = 0; i < dev->real_num_rx_queues; i++) {
927926
struct veth_rq *rq = &priv->rq[i];
928927

929-
err = xdp_rxq_info_reg(&rq->xdp_rxq, dev, i);
928+
netif_napi_add(dev, &rq->xdp_napi, veth_poll, NAPI_POLL_WEIGHT);
929+
err = xdp_rxq_info_reg(&rq->xdp_rxq, dev, i, rq->xdp_napi.napi_id);
930930
if (err < 0)
931931
goto err_rxq_reg;
932932

@@ -952,8 +952,12 @@ static int veth_enable_xdp(struct net_device *dev)
952952
err_reg_mem:
953953
xdp_rxq_info_unreg(&priv->rq[i].xdp_rxq);
954954
err_rxq_reg:
955-
for (i--; i >= 0; i--)
956-
xdp_rxq_info_unreg(&priv->rq[i].xdp_rxq);
955+
for (i--; i >= 0; i--) {
956+
struct veth_rq *rq = &priv->rq[i];
957+
958+
xdp_rxq_info_unreg(&rq->xdp_rxq);
959+
netif_napi_del(&rq->xdp_napi);
960+
}
957961

958962
return err;
959963
}

drivers/net/virtio_net.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1485,7 +1485,7 @@ static int virtnet_open(struct net_device *dev)
14851485
if (!try_fill_recv(vi, &vi->rq[i], GFP_KERNEL))
14861486
schedule_delayed_work(&vi->refill, 0);
14871487

1488-
err = xdp_rxq_info_reg(&vi->rq[i].xdp_rxq, dev, i);
1488+
err = xdp_rxq_info_reg(&vi->rq[i].xdp_rxq, dev, i, vi->rq[i].napi.napi_id);
14891489
if (err < 0)
14901490
return err;
14911491

drivers/net/xen-netfront.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2014,7 +2014,7 @@ static int xennet_create_page_pool(struct netfront_queue *queue)
20142014
}
20152015

20162016
err = xdp_rxq_info_reg(&queue->xdp_rxq, queue->info->netdev,
2017-
queue->id);
2017+
queue->id, 0);
20182018
if (err) {
20192019
netdev_err(queue->info->netdev, "xdp_rxq_info_reg failed\n");
20202020
goto err_free_pp;

include/net/busy_poll.h

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,25 @@ static inline void sk_mark_napi_id(struct sock *sk, const struct sk_buff *skb)
135135
sk_rx_queue_set(sk, skb);
136136
}
137137

138-
/* variant used for unconnected sockets */
139-
static inline void sk_mark_napi_id_once(struct sock *sk,
140-
const struct sk_buff *skb)
138+
static inline void __sk_mark_napi_id_once_xdp(struct sock *sk, unsigned int napi_id)
141139
{
142140
#ifdef CONFIG_NET_RX_BUSY_POLL
143141
if (!READ_ONCE(sk->sk_napi_id))
144-
WRITE_ONCE(sk->sk_napi_id, skb->napi_id);
142+
WRITE_ONCE(sk->sk_napi_id, napi_id);
145143
#endif
146144
}
147145

146+
/* variant used for unconnected sockets */
147+
static inline void sk_mark_napi_id_once(struct sock *sk,
148+
const struct sk_buff *skb)
149+
{
150+
__sk_mark_napi_id_once_xdp(sk, skb->napi_id);
151+
}
152+
153+
static inline void sk_mark_napi_id_once_xdp(struct sock *sk,
154+
const struct xdp_buff *xdp)
155+
{
156+
__sk_mark_napi_id_once_xdp(sk, xdp->rxq->napi_id);
157+
}
158+
148159
#endif /* _LINUX_NET_BUSY_POLL_H */

include/net/xdp.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ struct xdp_rxq_info {
5959
u32 queue_index;
6060
u32 reg_state;
6161
struct xdp_mem_info mem;
62+
unsigned int napi_id;
6263
} ____cacheline_aligned; /* perf critical, avoid false-sharing */
6364

6465
struct xdp_txq_info {
@@ -226,7 +227,7 @@ static inline void xdp_release_frame(struct xdp_frame *xdpf)
226227
}
227228

228229
int xdp_rxq_info_reg(struct xdp_rxq_info *xdp_rxq,
229-
struct net_device *dev, u32 queue_index);
230+
struct net_device *dev, u32 queue_index, unsigned int napi_id);
230231
void xdp_rxq_info_unreg(struct xdp_rxq_info *xdp_rxq);
231232
void xdp_rxq_info_unused(struct xdp_rxq_info *xdp_rxq);
232233
bool xdp_rxq_info_is_reg(struct xdp_rxq_info *xdp_rxq);

net/core/dev.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9810,7 +9810,7 @@ static int netif_alloc_rx_queues(struct net_device *dev)
98109810
rx[i].dev = dev;
98119811

98129812
/* XDP RX-queue setup */
9813-
err = xdp_rxq_info_reg(&rx[i].xdp_rxq, dev, i);
9813+
err = xdp_rxq_info_reg(&rx[i].xdp_rxq, dev, i, 0);
98149814
if (err < 0)
98159815
goto err_rxq_info;
98169816
}

net/core/xdp.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ static void xdp_rxq_info_init(struct xdp_rxq_info *xdp_rxq)
158158

159159
/* Returns 0 on success, negative on failure */
160160
int xdp_rxq_info_reg(struct xdp_rxq_info *xdp_rxq,
161-
struct net_device *dev, u32 queue_index)
161+
struct net_device *dev, u32 queue_index, unsigned int napi_id)
162162
{
163163
if (xdp_rxq->reg_state == REG_STATE_UNUSED) {
164164
WARN(1, "Driver promised not to register this");
@@ -179,6 +179,7 @@ int xdp_rxq_info_reg(struct xdp_rxq_info *xdp_rxq,
179179
xdp_rxq_info_init(xdp_rxq);
180180
xdp_rxq->dev = dev;
181181
xdp_rxq->queue_index = queue_index;
182+
xdp_rxq->napi_id = napi_id;
182183

183184
xdp_rxq->reg_state = REG_STATE_REGISTERED;
184185
return 0;

net/xdp/xsk.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ static int xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp,
233233
if (xs->dev != xdp->rxq->dev || xs->queue_id != xdp->rxq->queue_index)
234234
return -EINVAL;
235235

236+
sk_mark_napi_id_once_xdp(&xs->sk, xdp);
236237
len = xdp->data_end - xdp->data;
237238

238239
return xdp->rxq->mem.type == MEM_TYPE_XSK_BUFF_POOL ?

0 commit comments

Comments
 (0)