Skip to content

Commit 9ded70f

Browse files
nvmmaxSaeed Mahameed
authored andcommitted
net/mlx5e: Don't prefill WQEs in XDP SQ in the multi buffer mode
When MPWQE is disabled, mlx5e_open_xdpsq() prefills the common fields of WQEs in the XDP SQ to save time when sending packets. mlx5e_xmit_xdp_frame() runs on the prefilled fields, however, sending multi buffer XDP frames would require changing some of these fields on a per-packet basis. Besides that, mlx5e_xmit_xdp_frame() will be used as a fallback to send multi buffer XDP frames when MPWQE is enabled (MPWQE can only handle linear packets). In order to prepare for XDP multi buffer support, this commit introduces a mode for mlx5e_xmit_xdp_frame() that fills all the fields itself. Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
1 parent c090451 commit 9ded70f

File tree

6 files changed

+46
-5
lines changed

6 files changed

+46
-5
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ enum {
405405
MLX5E_SQ_STATE_VLAN_NEED_L2_INLINE,
406406
MLX5E_SQ_STATE_PENDING_XSK_TX,
407407
MLX5E_SQ_STATE_PENDING_TLS_RX_RESYNC,
408+
MLX5E_SQ_STATE_XDP_MULTIBUF,
408409
};
409410

410411
struct mlx5e_tx_mpwqe {

drivers/net/ethernet/mellanox/mlx5/core/en/params.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,7 @@ static void mlx5e_build_async_icosq_param(struct mlx5_core_dev *mdev,
843843

844844
void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev,
845845
struct mlx5e_params *params,
846+
struct mlx5e_xsk_param *xsk,
846847
struct mlx5e_sq_param *param)
847848
{
848849
void *sqc = param->sqc;
@@ -851,6 +852,7 @@ void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev,
851852
mlx5e_build_sq_param_common(mdev, param);
852853
MLX5_SET(wq, wq, log_wq_sz, params->log_sq_size);
853854
param->is_mpw = MLX5E_GET_PFLAG(params, MLX5E_PFLAG_XDP_TX_MPWQE);
855+
param->is_xdp_mb = !mlx5e_rx_is_linear_skb(params, xsk);
854856
mlx5e_build_tx_cq_param(mdev, params, &param->cqp);
855857
}
856858

@@ -870,7 +872,7 @@ int mlx5e_build_channel_param(struct mlx5_core_dev *mdev,
870872
async_icosq_log_wq_sz = mlx5e_build_async_icosq_log_wq_sz(mdev);
871873

872874
mlx5e_build_sq_param(mdev, params, &cparam->txq_sq);
873-
mlx5e_build_xdpsq_param(mdev, params, &cparam->xdp_sq);
875+
mlx5e_build_xdpsq_param(mdev, params, NULL, &cparam->xdp_sq);
874876
mlx5e_build_icosq_param(mdev, icosq_log_wq_sz, &cparam->icosq);
875877
mlx5e_build_async_icosq_param(mdev, async_icosq_log_wq_sz, &cparam->async_icosq);
876878

drivers/net/ethernet/mellanox/mlx5/core/en/params.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ struct mlx5e_sq_param {
3131
struct mlx5_wq_param wq;
3232
bool is_mpw;
3333
bool is_tls;
34+
bool is_xdp_mb;
3435
u16 stop_room;
3536
};
3637

@@ -155,6 +156,7 @@ void mlx5e_build_tx_cq_param(struct mlx5_core_dev *mdev,
155156
struct mlx5e_cq_param *param);
156157
void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev,
157158
struct mlx5e_params *params,
159+
struct mlx5e_xsk_param *xsk,
158160
struct mlx5e_sq_param *param);
159161
int mlx5e_build_channel_param(struct mlx5_core_dev *mdev,
160162
struct mlx5e_params *params,

drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xmit_data *xdptxd,
323323

324324
dma_addr_t dma_addr = xdptxd->dma_addr;
325325
u32 dma_len = xdptxd->len;
326+
u16 ds_cnt, inline_hdr_sz;
326327

327328
struct mlx5e_xdpsq_stats *stats = sq->stats;
328329

@@ -338,7 +339,8 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xmit_data *xdptxd,
338339
if (unlikely(check_result < 0))
339340
return false;
340341

341-
cseg->fm_ce_se = 0;
342+
ds_cnt = MLX5E_TX_WQE_EMPTY_DS_COUNT + 1;
343+
inline_hdr_sz = 0;
342344

343345
/* copy the inline part if required */
344346
if (sq->min_inline_mode != MLX5_INLINE_MODE_NONE) {
@@ -347,7 +349,9 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xmit_data *xdptxd,
347349
MLX5E_XDP_MIN_INLINE - sizeof(eseg->inline_hdr.start));
348350
dma_len -= MLX5E_XDP_MIN_INLINE;
349351
dma_addr += MLX5E_XDP_MIN_INLINE;
352+
inline_hdr_sz = MLX5E_XDP_MIN_INLINE;
350353
dseg++;
354+
ds_cnt++;
351355
}
352356

353357
/* write the dma part */
@@ -356,7 +360,31 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xmit_data *xdptxd,
356360

357361
cseg->opmod_idx_opcode = cpu_to_be32((sq->pc << 8) | MLX5_OPCODE_SEND);
358362

359-
sq->pc++;
363+
if (unlikely(test_bit(MLX5E_SQ_STATE_XDP_MULTIBUF, &sq->state))) {
364+
u8 num_pkts = 1;
365+
u8 num_wqebbs;
366+
367+
memset(&cseg->signature, 0, sizeof(*cseg) -
368+
sizeof(cseg->opmod_idx_opcode) - sizeof(cseg->qpn_ds));
369+
memset(eseg, 0, sizeof(*eseg) - sizeof(eseg->trailer));
370+
371+
eseg->inline_hdr.sz = cpu_to_be16(inline_hdr_sz);
372+
dseg->lkey = sq->mkey_be;
373+
374+
cseg->qpn_ds = cpu_to_be32((sq->sqn << 8) | ds_cnt);
375+
376+
num_wqebbs = DIV_ROUND_UP(ds_cnt, MLX5_SEND_WQEBB_NUM_DS);
377+
sq->db.wqe_info[pi] = (struct mlx5e_xdp_wqe_info) {
378+
.num_wqebbs = num_wqebbs,
379+
.num_pkts = num_pkts,
380+
};
381+
382+
sq->pc += num_wqebbs;
383+
} else {
384+
cseg->fm_ce_se = 0;
385+
386+
sq->pc++;
387+
}
360388

361389
sq->doorbell_cseg = cseg;
362390

drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ static void mlx5e_build_xsk_cparam(struct mlx5_core_dev *mdev,
4343
struct mlx5e_channel_param *cparam)
4444
{
4545
mlx5e_build_rq_param(mdev, params, xsk, q_counter, &cparam->rq);
46-
mlx5e_build_xdpsq_param(mdev, params, &cparam->xdp_sq);
46+
mlx5e_build_xdpsq_param(mdev, params, xsk, &cparam->xdp_sq);
4747
}
4848

4949
static int mlx5e_init_xsk_rq(struct mlx5e_channel *c,

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1666,13 +1666,21 @@ int mlx5e_open_xdpsq(struct mlx5e_channel *c, struct mlx5e_params *params,
16661666
csp.wq_ctrl = &sq->wq_ctrl;
16671667
csp.min_inline_mode = sq->min_inline_mode;
16681668
set_bit(MLX5E_SQ_STATE_ENABLED, &sq->state);
1669+
1670+
/* Don't enable multi buffer on XDP_REDIRECT SQ, as it's not yet
1671+
* supported by upstream, and there is no defined trigger to allow
1672+
* transmitting redirected multi-buffer frames.
1673+
*/
1674+
if (param->is_xdp_mb && !is_redirect)
1675+
set_bit(MLX5E_SQ_STATE_XDP_MULTIBUF, &sq->state);
1676+
16691677
err = mlx5e_create_sq_rdy(c->mdev, param, &csp, 0, &sq->sqn);
16701678
if (err)
16711679
goto err_free_xdpsq;
16721680

16731681
mlx5e_set_xmit_fp(sq, param->is_mpw);
16741682

1675-
if (!param->is_mpw) {
1683+
if (!param->is_mpw && !test_bit(MLX5E_SQ_STATE_XDP_MULTIBUF, &sq->state)) {
16761684
unsigned int ds_cnt = MLX5E_XDP_TX_DS_COUNT;
16771685
unsigned int inline_hdr_sz = 0;
16781686
int i;

0 commit comments

Comments
 (0)