From: Jonathan Lemon <b...@fb.com>

Modify mlx5e structures in order to add support for netgpu, which
shares some of the same structures as AF_XDP.  Add logic to make sure
they are not both in use.

Signed-off-by: Jonathan Lemon <jonathan.le...@gmail.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en.h         | 12 ++++++++++--
 .../net/ethernet/mellanox/mlx5/core/en/xsk/umem.c    |  3 +++
 .../net/ethernet/mellanox/mlx5/core/en/xsk/umem.h    |  3 +++
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c    |  3 ++-
 4 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h 
b/drivers/net/ethernet/mellanox/mlx5/core/en.h
index 24d88e8952ed..ae555c6be847 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
@@ -365,6 +365,7 @@ struct mlx5e_dma_info {
                struct page *page;
                struct xdp_buff *xsk;
        };
+       bool netgpu_source;
 };
 
 /* XDP packets can be transmitted in different ways. On completion, we need to
@@ -553,6 +554,7 @@ struct mlx5e_rq_frags_info {
        u8 wqe_bulk;
 };
 
+struct netgpu_ifq;
 struct mlx5e_rq {
        /* data path */
        union {
@@ -608,8 +610,9 @@ struct mlx5e_rq {
        DECLARE_BITMAP(flags, 8);
        struct page_pool      *page_pool;
 
-       /* AF_XDP zero-copy */
+       /* AF_XDP or NETGPU zero-copy */
        struct xdp_umem       *umem;
+       struct netgpu_ifq     *netgpu;
 
        struct work_struct     recover_work;
 
@@ -627,6 +630,7 @@ struct mlx5e_rq {
 
 enum mlx5e_channel_state {
        MLX5E_CHANNEL_STATE_XSK,
+       MLX5E_CHANNEL_STATE_NETGPU,
        MLX5E_CHANNEL_NUM_STATES
 };
 
@@ -737,9 +741,13 @@ struct mlx5e_xsk {
         * but it doesn't distinguish between zero-copy and non-zero-copy UMEMs,
         * so rely on our mechanism.
         */
-       struct xdp_umem **umems;
+       union {
+               struct xdp_umem **umems;
+               struct netgpu_ifq **ifq_tbl;
+       };
        u16 refcnt;
        bool ever_used;
+       bool is_umem;
 };
 
 /* Temporary storage for variables that are allocated when struct mlx5e_priv is
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.c
index 8ecfbcc3c826..1fad8dbbf59d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.c
@@ -27,7 +27,10 @@ static int mlx5e_xsk_get_umems(struct mlx5e_xsk *xsk)
                                     sizeof(*xsk->umems), GFP_KERNEL);
                if (unlikely(!xsk->umems))
                        return -ENOMEM;
+               xsk->is_umem = true;
        }
+       if (!xsk->is_umem)
+               return -EINVAL;
 
        xsk->refcnt++;
        xsk->ever_used = true;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.h 
b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.h
index bada94973586..13ef03446571 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/umem.h
@@ -15,6 +15,9 @@ static inline struct xdp_umem *mlx5e_xsk_get_umem(struct 
mlx5e_params *params,
        if (unlikely(ix >= params->num_channels))
                return NULL;
 
+       if (unlikely(!xsk->is_umem))
+               return NULL;
+
        return xsk->umems[ix];
 }
 
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 5a0b181f92f7..d75f22471357 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -62,7 +62,6 @@
 #include "en/xsk/setup.h"
 #include "en/xsk/rx.h"
 #include "en/xsk/tx.h"
-#include "en/netgpu/setup.h"
 #include "en/hv_vhca_stats.h"
 #include "en/devlink.h"
 #include "lib/mlx5.h"
@@ -324,6 +323,8 @@ static void mlx5e_init_frags_partition(struct mlx5e_rq *rq)
                                if (prev)
                                        prev->last_in_page = true;
                        }
+                       next_frag.di->netgpu_source =
+                                               !!frag_info[f].frag_source;
                        *frag = next_frag;
 
                        /* prepare next */
-- 
2.24.1

Reply via email to