bnxt_en: setup xdp_rxq_info
authorJesper Dangaard Brouer <brouer@redhat.com>
Wed, 3 Jan 2018 10:25:44 +0000 (11:25 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 5 Jan 2018 23:21:21 +0000 (15:21 -0800)
Driver hook points for xdp_rxq_info:
 * reg  : bnxt_alloc_rx_rings
 * unreg: bnxt_free_rx_rings

This driver should be updated to re-register when changing
allocation mode of RX rings.

Tested on actual hardware.

Cc: Andy Gospodarek <andy@greyhouse.net>
Cc: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c

index 9efbdc6f1fcbb36c9bf1b93bc488db442805094a..89c3c8760a7822a53230b302cdd31e92688c8265 100644 (file)
@@ -2247,6 +2247,9 @@ static void bnxt_free_rx_rings(struct bnxt *bp)
                if (rxr->xdp_prog)
                        bpf_prog_put(rxr->xdp_prog);
 
+               if (xdp_rxq_info_is_reg(&rxr->xdp_rxq))
+                       xdp_rxq_info_unreg(&rxr->xdp_rxq);
+
                kfree(rxr->rx_tpa);
                rxr->rx_tpa = NULL;
 
@@ -2280,6 +2283,10 @@ static int bnxt_alloc_rx_rings(struct bnxt *bp)
 
                ring = &rxr->rx_ring_struct;
 
+               rc = xdp_rxq_info_reg(&rxr->xdp_rxq, bp->dev, i);
+               if (rc < 0)
+                       return rc;
+
                rc = bnxt_alloc_ring(bp, ring);
                if (rc)
                        return rc;
@@ -2834,6 +2841,9 @@ void bnxt_set_ring_params(struct bnxt *bp)
        bp->cp_ring_mask = bp->cp_bit - 1;
 }
 
+/* Changing allocation mode of RX rings.
+ * TODO: Update when extending xdp_rxq_info to support allocation modes.
+ */
 int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode)
 {
        if (page_mode) {
index 5359a1f0045f8b5d87e149d47ad1b083f6a6561e..2d268fc26f5efc4a7e225bb0ec40a3b692a77e44 100644 (file)
@@ -23,6 +23,7 @@
 #include <net/devlink.h>
 #include <net/dst_metadata.h>
 #include <net/switchdev.h>
+#include <net/xdp.h>
 
 struct tx_bd {
        __le32 tx_bd_len_flags_type;
@@ -664,6 +665,7 @@ struct bnxt_rx_ring_info {
 
        struct bnxt_ring_struct rx_ring_struct;
        struct bnxt_ring_struct rx_agg_ring_struct;
+       struct xdp_rxq_info     xdp_rxq;
 };
 
 struct bnxt_cp_ring_info {
index 261e5847557a9aff0865f1a8b174284e3b3c0dc9..1389ab5e05df6c0b49f624c3addd921592ee13e5 100644 (file)
@@ -96,6 +96,7 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
        xdp.data = *data_ptr;
        xdp_set_data_meta_invalid(&xdp);
        xdp.data_end = *data_ptr + *len;
+       xdp.rxq = &rxr->xdp_rxq;
        orig_data = xdp.data;
        mapping = rx_buf->mapping - bp->rx_dma_offset;