[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20200727224444.2987641-19-jonathan.lemon@gmail.com>
Date: Mon, 27 Jul 2020 15:44:41 -0700
From: Jonathan Lemon <jonathan.lemon@...il.com>
To: <netdev@...r.kernel.org>
CC: <kernel-team@...com>
Subject: [RFC PATCH v2 18/21] mlx5e: add netgpu entries to mlx5 structures
From: Jonathan Lemon <bsd@...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.lemon@...il.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
Powered by blists - more mailing lists