bnxt_en: Fix XDP RX path
authorMichael Chan <michael.chan@broadcom.com>
Tue, 27 Dec 2022 03:19:38 +0000 (22:19 -0500)
committerDavid S. Miller <davem@davemloft.net>
Wed, 28 Dec 2022 10:16:57 +0000 (10:16 +0000)
The XDP program can change the starting address of the RX data buffer and
this information needs to be passed back from bnxt_rx_xdp() to
bnxt_rx_pkt() for the XDP_PASS case so that the SKB can point correctly
to the modified buffer address.  Add back the data_ptr parameter to
bnxt_rx_xdp() to make this work.

Fixes: b231c3f3414c ("bnxt: refactor bnxt_rx_xdp to separate xdp_init_buff/xdp_prepare_buff")
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h

index b8639b7e6b2b369c9ee18eb7fc73ae1f15eb1cef..1acabfe26db1822067b15c56449b181dc6afb21d 100644 (file)
@@ -1940,7 +1940,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
        }
 
        if (xdp_active) {
-               if (bnxt_rx_xdp(bp, rxr, cons, xdp, data, &len, event)) {
+               if (bnxt_rx_xdp(bp, rxr, cons, xdp, data, &data_ptr, &len, event)) {
                        rc = 1;
                        goto next_rx;
                }
index 1847f191577d1ea20606f4440fc809554b0c17da..2ceeaa818c1c63b567494d6f11dbb281d82886cb 100644 (file)
@@ -222,7 +222,8 @@ void bnxt_xdp_buff_frags_free(struct bnxt_rx_ring_info *rxr,
  * false   - packet should be passed to the stack.
  */
 bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
-                struct xdp_buff xdp, struct page *page, unsigned int *len, u8 *event)
+                struct xdp_buff xdp, struct page *page, u8 **data_ptr,
+                unsigned int *len, u8 *event)
 {
        struct bpf_prog *xdp_prog = READ_ONCE(rxr->xdp_prog);
        struct bnxt_tx_ring_info *txr;
@@ -255,8 +256,10 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
                *event &= ~BNXT_RX_EVENT;
 
        *len = xdp.data_end - xdp.data;
-       if (orig_data != xdp.data)
+       if (orig_data != xdp.data) {
                offset = xdp.data - xdp.data_hard_start;
+               *data_ptr = xdp.data_hard_start + offset;
+       }
 
        switch (act) {
        case XDP_PASS:
index 2bbdb8e7c506b93b8705ef8c7fac0cb2343846dd..ea430d6961df32abba20ac867fa0acf44fec9233 100644 (file)
@@ -18,8 +18,8 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp,
                                   struct xdp_buff *xdp);
 void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts);
 bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
-                struct xdp_buff xdp, struct page *page, unsigned int *len,
-                u8 *event);
+                struct xdp_buff xdp, struct page *page, u8 **data_ptr,
+                unsigned int *len, u8 *event);
 int bnxt_xdp(struct net_device *dev, struct netdev_bpf *xdp);
 int bnxt_xdp_xmit(struct net_device *dev, int num_frames,
                  struct xdp_frame **frames, u32 flags);