[LibreQoS] Fwd: [PATCH bpf-next v3 11/12] mlx5: Support RX XDP metadata

Dave Taht dave.taht at gmail.com
Mon Dec 5 22:03:58 EST 2022


thx toke!

---------- Forwarded message ---------
From: Stanislav Fomichev <sdf at google.com>
Date: Mon, Dec 5, 2022 at 6:57 PM
Subject: [PATCH bpf-next v3 11/12] mlx5: Support RX XDP metadata
To: <bpf at vger.kernel.org>
Cc: <ast at kernel.org>, <daniel at iogearbox.net>, <andrii at kernel.org>,
<martin.lau at linux.dev>, <song at kernel.org>, <yhs at fb.com>,
<john.fastabend at gmail.com>, <kpsingh at kernel.org>, <sdf at google.com>,
<haoluo at google.com>, <jolsa at kernel.org>, Toke Høiland-Jørgensen
<toke at redhat.com>, Saeed Mahameed <saeedm at nvidia.com>, David Ahern
<dsahern at gmail.com>, Jakub Kicinski <kuba at kernel.org>, Willem de
Bruijn <willemb at google.com>, Jesper Dangaard Brouer
<brouer at redhat.com>, Anatoly Burakov <anatoly.burakov at intel.com>,
Alexander Lobakin <alexandr.lobakin at intel.com>, Magnus Karlsson
<magnus.karlsson at gmail.com>, Maryam Tahhan <mtahhan at redhat.com>,
<xdp-hints at xdp-project.net>, <netdev at vger.kernel.org>


From: Toke Høiland-Jørgensen <toke at redhat.com>

Support RX hash and timestamp metadata kfuncs. We need to pass in the cqe
pointer to the mlx5e_skb_from* functions so it can be retrieved from the
XDP ctx to do this.

Cc: Saeed Mahameed <saeedm at nvidia.com>
Cc: John Fastabend <john.fastabend at gmail.com>
Cc: David Ahern <dsahern at gmail.com>
Cc: Martin KaFai Lau <martin.lau at linux.dev>
Cc: Jakub Kicinski <kuba at kernel.org>
Cc: Willem de Bruijn <willemb at google.com>
Cc: Jesper Dangaard Brouer <brouer at redhat.com>
Cc: Anatoly Burakov <anatoly.burakov at intel.com>
Cc: Alexander Lobakin <alexandr.lobakin at intel.com>
Cc: Magnus Karlsson <magnus.karlsson at gmail.com>
Cc: Maryam Tahhan <mtahhan at redhat.com>
Cc: xdp-hints at xdp-project.net
Cc: netdev at vger.kernel.org
Signed-off-by: Toke Høiland-Jørgensen <toke at redhat.com>
Signed-off-by: Stanislav Fomichev <sdf at google.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en.h  | 10 +++-
 .../net/ethernet/mellanox/mlx5/core/en/xdp.c  | 29 +++++++++++
 .../net/ethernet/mellanox/mlx5/core/en/xdp.h  |  7 +++
 .../ethernet/mellanox/mlx5/core/en/xsk/rx.c   | 10 ++++
 .../ethernet/mellanox/mlx5/core/en/xsk/rx.h   |  2 +
 .../net/ethernet/mellanox/mlx5/core/en_main.c |  4 ++
 .../net/ethernet/mellanox/mlx5/core/en_rx.c   | 48 ++++++++++---------
 7 files changed, 85 insertions(+), 25 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h
b/drivers/net/ethernet/mellanox/mlx5/core/en.h
index cdbaac5f6d25..8337ff0cacd5 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
@@ -627,10 +627,11 @@ struct mlx5e_rq;
 typedef void (*mlx5e_fp_handle_rx_cqe)(struct mlx5e_rq*, struct mlx5_cqe64*);
 typedef struct sk_buff *
 (*mlx5e_fp_skb_from_cqe_mpwrq)(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi,
-                              u16 cqe_bcnt, u32 head_offset, u32 page_idx);
+                              struct mlx5_cqe64 *cqe, u16 cqe_bcnt,
+                              u32 head_offset, u32 page_idx);
 typedef struct sk_buff *
 (*mlx5e_fp_skb_from_cqe)(struct mlx5e_rq *rq, struct mlx5e_wqe_frag_info *wi,
-                        u32 cqe_bcnt);
+                        struct mlx5_cqe64 *cqe, u32 cqe_bcnt);
 typedef bool (*mlx5e_fp_post_rx_wqes)(struct mlx5e_rq *rq);
 typedef void (*mlx5e_fp_dealloc_wqe)(struct mlx5e_rq*, u16);
 typedef void (*mlx5e_fp_shampo_dealloc_hd)(struct mlx5e_rq*, u16, u16, bool);
@@ -1036,6 +1037,11 @@ int mlx5e_vlan_rx_kill_vid(struct net_device
*dev, __always_unused __be16 proto,
                           u16 vid);
 void mlx5e_timestamp_init(struct mlx5e_priv *priv);

+static inline bool mlx5e_rx_hw_stamp(struct hwtstamp_config *config)
+{
+       return config->rx_filter == HWTSTAMP_FILTER_ALL;
+}
+
 struct mlx5e_xsk_param;

 struct mlx5e_rq_param;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
index db49b813bcb5..2a4700b3695a 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
@@ -156,6 +156,35 @@ mlx5e_xmit_xdp_buff(struct mlx5e_xdpsq *sq,
struct mlx5e_rq *rq,
        return true;
 }

+bool mlx5e_xdp_rx_timestamp_supported(const struct xdp_md *ctx)
+{
+       const struct mlx5_xdp_buff *_ctx = (void *)ctx;
+
+       return mlx5e_rx_hw_stamp(_ctx->rq->tstamp);
+}
+
+u64 mlx5e_xdp_rx_timestamp(const struct xdp_md *ctx)
+{
+       const struct mlx5_xdp_buff *_ctx = (void *)ctx;
+
+       return mlx5e_cqe_ts_to_ns(_ctx->rq->ptp_cyc2time,
+                                 _ctx->rq->clock, get_cqe_ts(_ctx->cqe));
+}
+
+bool mlx5e_xdp_rx_hash_supported(const struct xdp_md *ctx)
+{
+       const struct mlx5_xdp_buff *_ctx = (void *)ctx;
+
+       return _ctx->xdp.rxq->dev->features & NETIF_F_RXHASH;
+}
+
+u32 mlx5e_xdp_rx_hash(const struct xdp_md *ctx)
+{
+       const struct mlx5_xdp_buff *_ctx = (void *)ctx;
+
+       return be32_to_cpu(_ctx->cqe->rss_hash_result);
+}
+
 /* returns true if packet was consumed by xdp */
 bool mlx5e_xdp_handle(struct mlx5e_rq *rq, struct page *page,
                      struct bpf_prog *prog, struct mlx5_xdp_buff *mxbuf)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h
b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h
index a33b448d542d..a5fc30b07617 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h
@@ -46,6 +46,8 @@

 struct mlx5_xdp_buff {
        struct xdp_buff xdp;
+       struct mlx5_cqe64 *cqe;
+       struct mlx5e_rq *rq;
 };

 struct mlx5e_xsk_param;
@@ -60,6 +62,11 @@ void mlx5e_xdp_rx_poll_complete(struct mlx5e_rq *rq);
 int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
                   u32 flags);

+bool mlx5e_xdp_rx_hash_supported(const struct xdp_md *ctx);
+u32 mlx5e_xdp_rx_hash(const struct xdp_md *ctx);
+bool mlx5e_xdp_rx_timestamp_supported(const struct xdp_md *ctx);
+u64 mlx5e_xdp_rx_timestamp(const struct xdp_md *ctx);
+
 INDIRECT_CALLABLE_DECLARE(bool mlx5e_xmit_xdp_frame_mpwqe(struct
mlx5e_xdpsq *sq,
                                                          struct
mlx5e_xmit_data *xdptxd,
                                                          struct
skb_shared_info *sinfo,
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.c
b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.c
index 5e88dc61824e..05cf7987585a 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.c
@@ -49,6 +49,7 @@ int mlx5e_xsk_alloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
                        umr_wqe->inline_mtts[i] = (struct mlx5_mtt) {
                                .ptag = cpu_to_be64(addr | MLX5_EN_WR),
                        };
+                       wi->alloc_units[i].mxbuf->rq = rq;
                }
        } else if (unlikely(rq->mpwqe.umr_mode ==
MLX5E_MPWRQ_UMR_MODE_UNALIGNED)) {
                for (i = 0; i < batch; i++) {
@@ -58,6 +59,7 @@ int mlx5e_xsk_alloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
                                .key = rq->mkey_be,
                                .va = cpu_to_be64(addr),
                        };
+                       wi->alloc_units[i].mxbuf->rq = rq;
                }
        } else if (likely(rq->mpwqe.umr_mode == MLX5E_MPWRQ_UMR_MODE_TRIPLE)) {
                u32 mapping_size = 1 << (rq->mpwqe.page_shift - 2);
@@ -81,6 +83,7 @@ int mlx5e_xsk_alloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
                                .key = rq->mkey_be,
                                .va = cpu_to_be64(rq->wqe_overflow.addr),
                        };
+                       wi->alloc_units[i].mxbuf->rq = rq;
                }
        } else {
                __be32 pad_size = cpu_to_be32((1 << rq->mpwqe.page_shift) -
@@ -100,6 +103,7 @@ int mlx5e_xsk_alloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
                                .va = cpu_to_be64(rq->wqe_overflow.addr),
                                .bcount = pad_size,
                        };
+                       wi->alloc_units[i].mxbuf->rq = rq;
                }
        }

@@ -230,6 +234,7 @@ static struct sk_buff
*mlx5e_xsk_construct_skb(struct mlx5e_rq *rq, struct xdp_b

 struct sk_buff *mlx5e_xsk_skb_from_cqe_mpwrq_linear(struct mlx5e_rq *rq,
                                                    struct mlx5e_mpw_info *wi,
+                                                   struct mlx5_cqe64 *cqe,
                                                    u16 cqe_bcnt,
                                                    u32 head_offset,
                                                    u32 page_idx)
@@ -250,6 +255,8 @@ struct sk_buff
*mlx5e_xsk_skb_from_cqe_mpwrq_linear(struct mlx5e_rq *rq,
         */
        WARN_ON_ONCE(head_offset);

+       /* mxbuf->rq is set on allocation, but cqe is per-packet so
set it here */
+       mxbuf->cqe = cqe;
        xsk_buff_set_size(&mxbuf->xdp, cqe_bcnt);
        xsk_buff_dma_sync_for_cpu(&mxbuf->xdp, rq->xsk_pool);
        net_prefetch(mxbuf->xdp.data);
@@ -284,6 +291,7 @@ struct sk_buff
*mlx5e_xsk_skb_from_cqe_mpwrq_linear(struct mlx5e_rq *rq,

 struct sk_buff *mlx5e_xsk_skb_from_cqe_linear(struct mlx5e_rq *rq,
                                              struct mlx5e_wqe_frag_info *wi,
+                                             struct mlx5_cqe64 *cqe,
                                              u32 cqe_bcnt)
 {
        struct mlx5_xdp_buff *mxbuf = wi->au->mxbuf;
@@ -296,6 +304,8 @@ struct sk_buff
*mlx5e_xsk_skb_from_cqe_linear(struct mlx5e_rq *rq,
         */
        WARN_ON_ONCE(wi->offset);

+       /* mxbuf->rq is set on allocation, but cqe is per-packet so
set it here */
+       mxbuf->cqe = cqe;
        xsk_buff_set_size(&mxbuf->xdp, cqe_bcnt);
        xsk_buff_dma_sync_for_cpu(&mxbuf->xdp, rq->xsk_pool);
        net_prefetch(mxbuf->xdp.data);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.h
b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.h
index 087c943bd8e9..cefc0ef6105d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.h
@@ -13,11 +13,13 @@ int mlx5e_xsk_alloc_rx_wqes_batched(struct
mlx5e_rq *rq, u16 ix, int wqe_bulk);
 int mlx5e_xsk_alloc_rx_wqes(struct mlx5e_rq *rq, u16 ix, int wqe_bulk);
 struct sk_buff *mlx5e_xsk_skb_from_cqe_mpwrq_linear(struct mlx5e_rq *rq,
                                                    struct mlx5e_mpw_info *wi,
+                                                   struct mlx5_cqe64 *cqe,
                                                    u16 cqe_bcnt,
                                                    u32 head_offset,
                                                    u32 page_idx);
 struct sk_buff *mlx5e_xsk_skb_from_cqe_linear(struct mlx5e_rq *rq,
                                              struct mlx5e_wqe_frag_info *wi,
+                                             struct mlx5_cqe64 *cqe,
                                              u32 cqe_bcnt);

 #endif /* __MLX5_EN_XSK_RX_H__ */
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 217c8a478977..967a82bf34b4 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -4891,6 +4891,10 @@ const struct net_device_ops mlx5e_netdev_ops = {
        .ndo_tx_timeout          = mlx5e_tx_timeout,
        .ndo_bpf                 = mlx5e_xdp,
        .ndo_xdp_xmit            = mlx5e_xdp_xmit,
+       .ndo_xdp_rx_timestamp_supported = mlx5e_xdp_rx_timestamp_supported,
+       .ndo_xdp_rx_timestamp    = mlx5e_xdp_rx_timestamp,
+       .ndo_xdp_rx_hash_supported = mlx5e_xdp_rx_hash_supported,
+       .ndo_xdp_rx_hash         = mlx5e_xdp_rx_hash,
        .ndo_xsk_wakeup          = mlx5e_xsk_wakeup,
 #ifdef CONFIG_MLX5_EN_ARFS
        .ndo_rx_flow_steer       = mlx5e_rx_flow_steer,
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
index 434025703e50..1bc631abe24c 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
@@ -62,10 +62,12 @@

 static struct sk_buff *
 mlx5e_skb_from_cqe_mpwrq_linear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi,
-                               u16 cqe_bcnt, u32 head_offset, u32 page_idx);
+                               struct mlx5_cqe64 *cqe, u16 cqe_bcnt,
u32 head_offset,
+                               u32 page_idx);
 static struct sk_buff *
 mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct
mlx5e_mpw_info *wi,
-                                  u16 cqe_bcnt, u32 head_offset, u32 page_idx);
+                                  struct mlx5_cqe64 *cqe, u16
cqe_bcnt, u32 head_offset,
+                                  u32 page_idx);
 static void mlx5e_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe);
 static void mlx5e_handle_rx_cqe_mpwrq(struct mlx5e_rq *rq, struct
mlx5_cqe64 *cqe);
 static void mlx5e_handle_rx_cqe_mpwrq_shampo(struct mlx5e_rq *rq,
struct mlx5_cqe64 *cqe);
@@ -76,11 +78,6 @@ const struct mlx5e_rx_handlers mlx5e_rx_handlers_nic = {
        .handle_rx_cqe_mpwqe_shampo = mlx5e_handle_rx_cqe_mpwrq_shampo,
 };

-static inline bool mlx5e_rx_hw_stamp(struct hwtstamp_config *config)
-{
-       return config->rx_filter == HWTSTAMP_FILTER_ALL;
-}
-
 static inline void mlx5e_read_cqe_slot(struct mlx5_cqwq *wq,
                                       u32 cqcc, void *data)
 {
@@ -1564,16 +1561,18 @@ struct sk_buff *mlx5e_build_linear_skb(struct
mlx5e_rq *rq, void *va,
        return skb;
 }

-static void mlx5e_fill_xdp_buff(struct mlx5e_rq *rq, void *va, u16 headroom,
+static void mlx5e_fill_xdp_buff(struct mlx5e_rq *rq, struct
mlx5_cqe64 *cqe, void *va, u16 headroom,
                                u32 len, struct mlx5_xdp_buff *mxbuf)
 {
        xdp_init_buff(&mxbuf->xdp, rq->buff.frame0_sz, &rq->xdp_rxq);
        xdp_prepare_buff(&mxbuf->xdp, va, headroom, len, true);
+       mxbuf->cqe = cqe;
+       mxbuf->rq = rq;
 }

 static struct sk_buff *
 mlx5e_skb_from_cqe_linear(struct mlx5e_rq *rq, struct mlx5e_wqe_frag_info *wi,
-                         u32 cqe_bcnt)
+                         struct mlx5_cqe64 *cqe, u32 cqe_bcnt)
 {
        union mlx5e_alloc_unit *au = wi->au;
        u16 rx_headroom = rq->buff.headroom;
@@ -1598,7 +1597,7 @@ mlx5e_skb_from_cqe_linear(struct mlx5e_rq *rq,
struct mlx5e_wqe_frag_info *wi,
                struct mlx5_xdp_buff mxbuf;

                net_prefetchw(va); /* xdp_frame data area */
-               mlx5e_fill_xdp_buff(rq, va, rx_headroom, cqe_bcnt, &mxbuf);
+               mlx5e_fill_xdp_buff(rq, cqe, va, rx_headroom, cqe_bcnt, &mxbuf);
                if (mlx5e_xdp_handle(rq, au->page, prog, &mxbuf))
                        return NULL; /* page/packet was consumed by XDP */

@@ -1619,7 +1618,7 @@ mlx5e_skb_from_cqe_linear(struct mlx5e_rq *rq,
struct mlx5e_wqe_frag_info *wi,

 static struct sk_buff *
 mlx5e_skb_from_cqe_nonlinear(struct mlx5e_rq *rq, struct
mlx5e_wqe_frag_info *wi,
-                            u32 cqe_bcnt)
+                            struct mlx5_cqe64 *cqe, u32 cqe_bcnt)
 {
        struct mlx5e_rq_frag_info *frag_info = &rq->wqe.info.arr[0];
        struct mlx5e_wqe_frag_info *head_wi = wi;
@@ -1643,7 +1642,7 @@ mlx5e_skb_from_cqe_nonlinear(struct mlx5e_rq
*rq, struct mlx5e_wqe_frag_info *wi
        net_prefetchw(va); /* xdp_frame data area */
        net_prefetch(va + rx_headroom);

-       mlx5e_fill_xdp_buff(rq, va, rx_headroom, frag_consumed_bytes, &mxbuf);
+       mlx5e_fill_xdp_buff(rq, cqe, va, rx_headroom,
frag_consumed_bytes, &mxbuf);
        sinfo = xdp_get_shared_info_from_buff(&mxbuf.xdp);
        truesize = 0;

@@ -1766,7 +1765,7 @@ static void mlx5e_handle_rx_cqe(struct mlx5e_rq
*rq, struct mlx5_cqe64 *cqe)
                              mlx5e_skb_from_cqe_linear,
                              mlx5e_skb_from_cqe_nonlinear,
                              mlx5e_xsk_skb_from_cqe_linear,
-                             rq, wi, cqe_bcnt);
+                             rq, wi, cqe, cqe_bcnt);
        if (!skb) {
                /* probably for XDP */
                if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) {
@@ -1819,7 +1818,7 @@ static void mlx5e_handle_rx_cqe_rep(struct
mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
        skb = INDIRECT_CALL_2(rq->wqe.skb_from_cqe,
                              mlx5e_skb_from_cqe_linear,
                              mlx5e_skb_from_cqe_nonlinear,
-                             rq, wi, cqe_bcnt);
+                             rq, wi, cqe, cqe_bcnt);
        if (!skb) {
                /* probably for XDP */
                if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) {
@@ -1878,7 +1877,7 @@ static void mlx5e_handle_rx_cqe_mpwrq_rep(struct
mlx5e_rq *rq, struct mlx5_cqe64
        skb = INDIRECT_CALL_2(rq->mpwqe.skb_from_cqe_mpwrq,
                              mlx5e_skb_from_cqe_mpwrq_linear,
                              mlx5e_skb_from_cqe_mpwrq_nonlinear,
-                             rq, wi, cqe_bcnt, head_offset, page_idx);
+                             rq, wi, cqe, cqe_bcnt, head_offset, page_idx);
        if (!skb)
                goto mpwrq_cqe_out;

@@ -1929,7 +1928,8 @@ mlx5e_fill_skb_data(struct sk_buff *skb, struct
mlx5e_rq *rq,

 static struct sk_buff *
 mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct
mlx5e_mpw_info *wi,
-                                  u16 cqe_bcnt, u32 head_offset, u32 page_idx)
+                                  struct mlx5_cqe64 *cqe, u16
cqe_bcnt, u32 head_offset,
+                                  u32 page_idx)
 {
        union mlx5e_alloc_unit *au = &wi->alloc_units[page_idx];
        u16 headlen = min_t(u16, MLX5E_RX_MAX_HEAD, cqe_bcnt);
@@ -1968,7 +1968,8 @@ mlx5e_skb_from_cqe_mpwrq_nonlinear(struct
mlx5e_rq *rq, struct mlx5e_mpw_info *w

 static struct sk_buff *
 mlx5e_skb_from_cqe_mpwrq_linear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi,
-                               u16 cqe_bcnt, u32 head_offset, u32 page_idx)
+                               struct mlx5_cqe64 *cqe, u16 cqe_bcnt,
u32 head_offset,
+                               u32 page_idx)
 {
        union mlx5e_alloc_unit *au = &wi->alloc_units[page_idx];
        u16 rx_headroom = rq->buff.headroom;
@@ -1999,7 +2000,7 @@ mlx5e_skb_from_cqe_mpwrq_linear(struct mlx5e_rq
*rq, struct mlx5e_mpw_info *wi,
                struct mlx5_xdp_buff mxbuf;

                net_prefetchw(va); /* xdp_frame data area */
-               mlx5e_fill_xdp_buff(rq, va, rx_headroom, cqe_bcnt, &mxbuf);
+               mlx5e_fill_xdp_buff(rq, cqe, va, rx_headroom, cqe_bcnt, &mxbuf);
                if (mlx5e_xdp_handle(rq, au->page, prog, &mxbuf)) {
                        if
(__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags))
                                __set_bit(page_idx,
wi->xdp_xmit_bitmap); /* non-atomic */
@@ -2163,8 +2164,8 @@ static void
mlx5e_handle_rx_cqe_mpwrq_shampo(struct mlx5e_rq *rq, struct mlx5_cq
                if (likely(head_size))
                        *skb = mlx5e_skb_from_cqe_shampo(rq, wi, cqe,
header_index);
                else
-                       *skb = mlx5e_skb_from_cqe_mpwrq_nonlinear(rq,
wi, cqe_bcnt, data_offset,
-                                                                 page_idx);
+                       *skb = mlx5e_skb_from_cqe_mpwrq_nonlinear(rq,
wi, cqe, cqe_bcnt,
+
data_offset, page_idx);
                if (unlikely(!*skb))
                        goto free_hd_entry;

@@ -2238,7 +2239,8 @@ static void mlx5e_handle_rx_cqe_mpwrq(struct
mlx5e_rq *rq, struct mlx5_cqe64 *cq
                              mlx5e_skb_from_cqe_mpwrq_linear,
                              mlx5e_skb_from_cqe_mpwrq_nonlinear,
                              mlx5e_xsk_skb_from_cqe_mpwrq_linear,
-                             rq, wi, cqe_bcnt, head_offset, page_idx);
+                             rq, wi, cqe, cqe_bcnt, head_offset,
+                             page_idx);
        if (!skb)
                goto mpwrq_cqe_out;

@@ -2483,7 +2485,7 @@ static void mlx5i_handle_rx_cqe(struct mlx5e_rq
*rq, struct mlx5_cqe64 *cqe)
        skb = INDIRECT_CALL_2(rq->wqe.skb_from_cqe,
                              mlx5e_skb_from_cqe_linear,
                              mlx5e_skb_from_cqe_nonlinear,
-                             rq, wi, cqe_bcnt);
+                             rq, wi, cqe, cqe_bcnt);
        if (!skb)
                goto wq_free_wqe;

@@ -2575,7 +2577,7 @@ static void mlx5e_trap_handle_rx_cqe(struct
mlx5e_rq *rq, struct mlx5_cqe64 *cqe
                goto free_wqe;
        }

-       skb = mlx5e_skb_from_cqe_nonlinear(rq, wi, cqe_bcnt);
+       skb = mlx5e_skb_from_cqe_nonlinear(rq, wi, cqe, cqe_bcnt);
        if (!skb)
                goto free_wqe;

--
2.39.0.rc0.267.gcb52ba06e7-goog



-- 
This song goes out to all the folk that thought Stadia would work:
https://www.linkedin.com/posts/dtaht_the-mushroom-song-activity-6981366665607352320-FXtz
Dave Täht CEO, TekLibre, LLC


More information about the LibreQoS mailing list