Skip to content

Commit 7f1c684

Browse files
netoptimizerAlexei Starovoitov
authored andcommitted
nfp: setup xdp_rxq_info
Driver hook points for xdp_rxq_info: * reg : nfp_net_rx_ring_alloc * unreg: nfp_net_rx_ring_free In struct nfp_net_rx_ring moved member @SiZe into a hole on 64-bit. Thus, the size remaines the same after adding member @xdp_rxq. Cc: [email protected] Cc: Jakub Kicinski <[email protected]> Cc: Simon Horman <[email protected]> Signed-off-by: Jesper Dangaard Brouer <[email protected]> Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent 96a8604 commit 7f1c684

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

drivers/net/ethernet/netronome/nfp/nfp_net.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include <linux/netdevice.h>
4848
#include <linux/pci.h>
4949
#include <linux/io-64-nonatomic-hi-lo.h>
50+
#include <net/xdp.h>
5051

5152
#include "nfp_net_ctrl.h"
5253

@@ -350,6 +351,7 @@ struct nfp_net_rx_buf {
350351
* @rxds: Virtual address of FL/RX ring in host memory
351352
* @dma: DMA address of the FL/RX ring
352353
* @size: Size, in bytes, of the FL/RX ring (needed to free)
354+
* @xdp_rxq: RX-ring info avail for XDP
353355
*/
354356
struct nfp_net_rx_ring {
355357
struct nfp_net_r_vector *r_vec;
@@ -361,13 +363,14 @@ struct nfp_net_rx_ring {
361363
u32 idx;
362364

363365
int fl_qcidx;
366+
unsigned int size;
364367
u8 __iomem *qcp_fl;
365368

366369
struct nfp_net_rx_buf *rxbufs;
367370
struct nfp_net_rx_desc *rxds;
368371

369372
dma_addr_t dma;
370-
unsigned int size;
373+
struct xdp_rxq_info xdp_rxq;
371374
} ____cacheline_aligned;
372375

373376
/**

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1608,11 +1608,13 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
16081608
unsigned int true_bufsz;
16091609
struct sk_buff *skb;
16101610
int pkts_polled = 0;
1611+
struct xdp_buff xdp;
16111612
int idx;
16121613

16131614
rcu_read_lock();
16141615
xdp_prog = READ_ONCE(dp->xdp_prog);
16151616
true_bufsz = xdp_prog ? PAGE_SIZE : dp->fl_bufsz;
1617+
xdp.rxq = &rx_ring->xdp_rxq;
16161618
tx_ring = r_vec->xdp_ring;
16171619

16181620
while (pkts_polled < budget) {
@@ -1703,7 +1705,6 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
17031705
dp->bpf_offload_xdp) && !meta.portid) {
17041706
void *orig_data = rxbuf->frag + pkt_off;
17051707
unsigned int dma_off;
1706-
struct xdp_buff xdp;
17071708
int act;
17081709

17091710
xdp.data_hard_start = rxbuf->frag + NFP_NET_RX_BUF_HEADROOM;
@@ -2252,6 +2253,7 @@ static void nfp_net_rx_ring_free(struct nfp_net_rx_ring *rx_ring)
22522253
struct nfp_net_r_vector *r_vec = rx_ring->r_vec;
22532254
struct nfp_net_dp *dp = &r_vec->nfp_net->dp;
22542255

2256+
xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
22552257
kfree(rx_ring->rxbufs);
22562258

22572259
if (rx_ring->rxds)
@@ -2275,7 +2277,11 @@ static void nfp_net_rx_ring_free(struct nfp_net_rx_ring *rx_ring)
22752277
static int
22762278
nfp_net_rx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring)
22772279
{
2278-
int sz;
2280+
int sz, err;
2281+
2282+
err = xdp_rxq_info_reg(&rx_ring->xdp_rxq, dp->netdev, rx_ring->idx);
2283+
if (err < 0)
2284+
return err;
22792285

22802286
rx_ring->cnt = dp->rxd_cnt;
22812287
rx_ring->size = sizeof(*rx_ring->rxds) * rx_ring->cnt;

0 commit comments

Comments
 (0)