diff options
| author | Jesper Dangaard Brouer <brouer@redhat.com> | 2018-01-03 05:25:49 -0500 |
|---|---|---|
| committer | Alexei Starovoitov <ast@kernel.org> | 2018-01-05 18:21:21 -0500 |
| commit | 7f1c684a8966d19177a0440113a39007f95af38d (patch) | |
| tree | 294b3e1ae909393b4f42292eedad6fd42e47ae40 | |
| parent | 96a8604f95fa216b9ddfd15c687eed42a2f56901 (diff) | |
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: oss-drivers@netronome.com
Cc: Jakub Kicinski <jakub.kicinski@netronome.com>
Cc: Simon Horman <simon.horman@netronome.com>
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
| -rw-r--r-- | drivers/net/ethernet/netronome/nfp/nfp_net.h | 5 | ||||
| -rw-r--r-- | drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 10 |
2 files changed, 12 insertions, 3 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net.h b/drivers/net/ethernet/netronome/nfp/nfp_net.h index 3801c52098d5..0e564cfabe7e 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_net.h | |||
| @@ -47,6 +47,7 @@ | |||
| 47 | #include <linux/netdevice.h> | 47 | #include <linux/netdevice.h> |
| 48 | #include <linux/pci.h> | 48 | #include <linux/pci.h> |
| 49 | #include <linux/io-64-nonatomic-hi-lo.h> | 49 | #include <linux/io-64-nonatomic-hi-lo.h> |
| 50 | #include <net/xdp.h> | ||
| 50 | 51 | ||
| 51 | #include "nfp_net_ctrl.h" | 52 | #include "nfp_net_ctrl.h" |
| 52 | 53 | ||
| @@ -350,6 +351,7 @@ struct nfp_net_rx_buf { | |||
| 350 | * @rxds: Virtual address of FL/RX ring in host memory | 351 | * @rxds: Virtual address of FL/RX ring in host memory |
| 351 | * @dma: DMA address of the FL/RX ring | 352 | * @dma: DMA address of the FL/RX ring |
| 352 | * @size: Size, in bytes, of the FL/RX ring (needed to free) | 353 | * @size: Size, in bytes, of the FL/RX ring (needed to free) |
| 354 | * @xdp_rxq: RX-ring info avail for XDP | ||
| 353 | */ | 355 | */ |
| 354 | struct nfp_net_rx_ring { | 356 | struct nfp_net_rx_ring { |
| 355 | struct nfp_net_r_vector *r_vec; | 357 | struct nfp_net_r_vector *r_vec; |
| @@ -361,13 +363,14 @@ struct nfp_net_rx_ring { | |||
| 361 | u32 idx; | 363 | u32 idx; |
| 362 | 364 | ||
| 363 | int fl_qcidx; | 365 | int fl_qcidx; |
| 366 | unsigned int size; | ||
| 364 | u8 __iomem *qcp_fl; | 367 | u8 __iomem *qcp_fl; |
| 365 | 368 | ||
| 366 | struct nfp_net_rx_buf *rxbufs; | 369 | struct nfp_net_rx_buf *rxbufs; |
| 367 | struct nfp_net_rx_desc *rxds; | 370 | struct nfp_net_rx_desc *rxds; |
| 368 | 371 | ||
| 369 | dma_addr_t dma; | 372 | dma_addr_t dma; |
| 370 | unsigned int size; | 373 | struct xdp_rxq_info xdp_rxq; |
| 371 | } ____cacheline_aligned; | 374 | } ____cacheline_aligned; |
| 372 | 375 | ||
| 373 | /** | 376 | /** |
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index 0add4870ce2e..45b8cae937be 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c | |||
| @@ -1608,11 +1608,13 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget) | |||
| 1608 | unsigned int true_bufsz; | 1608 | unsigned int true_bufsz; |
| 1609 | struct sk_buff *skb; | 1609 | struct sk_buff *skb; |
| 1610 | int pkts_polled = 0; | 1610 | int pkts_polled = 0; |
| 1611 | struct xdp_buff xdp; | ||
| 1611 | int idx; | 1612 | int idx; |
| 1612 | 1613 | ||
| 1613 | rcu_read_lock(); | 1614 | rcu_read_lock(); |
| 1614 | xdp_prog = READ_ONCE(dp->xdp_prog); | 1615 | xdp_prog = READ_ONCE(dp->xdp_prog); |
| 1615 | true_bufsz = xdp_prog ? PAGE_SIZE : dp->fl_bufsz; | 1616 | true_bufsz = xdp_prog ? PAGE_SIZE : dp->fl_bufsz; |
| 1617 | xdp.rxq = &rx_ring->xdp_rxq; | ||
| 1616 | tx_ring = r_vec->xdp_ring; | 1618 | tx_ring = r_vec->xdp_ring; |
| 1617 | 1619 | ||
| 1618 | while (pkts_polled < budget) { | 1620 | while (pkts_polled < budget) { |
| @@ -1703,7 +1705,6 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget) | |||
| 1703 | dp->bpf_offload_xdp) && !meta.portid) { | 1705 | dp->bpf_offload_xdp) && !meta.portid) { |
| 1704 | void *orig_data = rxbuf->frag + pkt_off; | 1706 | void *orig_data = rxbuf->frag + pkt_off; |
| 1705 | unsigned int dma_off; | 1707 | unsigned int dma_off; |
| 1706 | struct xdp_buff xdp; | ||
| 1707 | int act; | 1708 | int act; |
| 1708 | 1709 | ||
| 1709 | xdp.data_hard_start = rxbuf->frag + NFP_NET_RX_BUF_HEADROOM; | 1710 | 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) | |||
| 2252 | struct nfp_net_r_vector *r_vec = rx_ring->r_vec; | 2253 | struct nfp_net_r_vector *r_vec = rx_ring->r_vec; |
| 2253 | struct nfp_net_dp *dp = &r_vec->nfp_net->dp; | 2254 | struct nfp_net_dp *dp = &r_vec->nfp_net->dp; |
| 2254 | 2255 | ||
| 2256 | xdp_rxq_info_unreg(&rx_ring->xdp_rxq); | ||
| 2255 | kfree(rx_ring->rxbufs); | 2257 | kfree(rx_ring->rxbufs); |
| 2256 | 2258 | ||
| 2257 | if (rx_ring->rxds) | 2259 | if (rx_ring->rxds) |
| @@ -2275,7 +2277,11 @@ static void nfp_net_rx_ring_free(struct nfp_net_rx_ring *rx_ring) | |||
| 2275 | static int | 2277 | static int |
| 2276 | nfp_net_rx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring) | 2278 | nfp_net_rx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring) |
| 2277 | { | 2279 | { |
| 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; | ||
| 2279 | 2285 | ||
| 2280 | rx_ring->cnt = dp->rxd_cnt; | 2286 | rx_ring->cnt = dp->rxd_cnt; |
| 2281 | rx_ring->size = sizeof(*rx_ring->rxds) * rx_ring->cnt; | 2287 | rx_ring->size = sizeof(*rx_ring->rxds) * rx_ring->cnt; |
