Skip to content

Commit cd02a1a

Browse files
committed
Merge branch 'mlx5e-xdp-extend'
Tariq Toukan says: ==================== net/mlx5e: Extend XDP multi-buffer capabilities This series extends the XDP multi-buffer support in the mlx5e driver. Patchset breakdown: - Infrastructural changes and preparations. - Add XDP multi-buffer support for XDP redirect-in. - Use TX MPWQE (multi-packet WQE) HW feature for non-linear single-segmented XDP frames. - Add XDP multi-buffer support for striding RQ. In Striding RQ, we overcome the lack of headroom and tailroom between the RQ strides by allocating a side page per packet and using it for the xdp_buff descriptor. We structure the xdp_buff so that it contains nothing in the linear part, and the whole packet resides in the fragments. Performance highlight: Packet rate test, 64 bytes, 32 channels, MTU 9000 bytes. CPU: Intel(R) Xeon(R) Platinum 8380 CPU @ 2.30GHz. NIC: ConnectX-6 Dx, at 100 Gbps. +----------+-------------+-------------+---------+ | Test | Legacy RQ | Striding RQ | Speedup | +----------+-------------+-------------+---------+ | XDP_DROP | 101,615,544 | 117,191,020 | +15% | +----------+-------------+-------------+---------+ | XDP_TX | 95,608,169 | 117,043,422 | +22% | +----------+-------------+-------------+---------+ Series generated against net commit: e61caf0 Merge branch 'page_pool-allow-caching-from-safely-localized-napi' I'm submitting this directly as Saeed is traveling. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 14cac66 + f52ac70 commit cd02a1a

File tree

9 files changed

+519
-254
lines changed

9 files changed

+519
-254
lines changed

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

Lines changed: 3 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -475,59 +475,18 @@ struct mlx5e_txqsq {
475475
cqe_ts_to_ns ptp_cyc2time;
476476
} ____cacheline_aligned_in_smp;
477477

478-
/* XDP packets can be transmitted in different ways. On completion, we need to
479-
* distinguish between them to clean up things in a proper way.
480-
*/
481-
enum mlx5e_xdp_xmit_mode {
482-
/* An xdp_frame was transmitted due to either XDP_REDIRECT from another
483-
* device or XDP_TX from an XSK RQ. The frame has to be unmapped and
484-
* returned.
485-
*/
486-
MLX5E_XDP_XMIT_MODE_FRAME,
487-
488-
/* The xdp_frame was created in place as a result of XDP_TX from a
489-
* regular RQ. No DMA remapping happened, and the page belongs to us.
490-
*/
491-
MLX5E_XDP_XMIT_MODE_PAGE,
492-
493-
/* No xdp_frame was created at all, the transmit happened from a UMEM
494-
* page. The UMEM Completion Ring producer pointer has to be increased.
495-
*/
496-
MLX5E_XDP_XMIT_MODE_XSK,
497-
};
498-
499-
struct mlx5e_xdp_info {
500-
enum mlx5e_xdp_xmit_mode mode;
501-
union {
502-
struct {
503-
struct xdp_frame *xdpf;
504-
dma_addr_t dma_addr;
505-
} frame;
506-
struct {
507-
struct mlx5e_rq *rq;
508-
struct page *page;
509-
} page;
510-
};
511-
};
512-
513-
struct mlx5e_xmit_data {
514-
dma_addr_t dma_addr;
515-
void *data;
516-
u32 len;
517-
};
518-
519478
struct mlx5e_xdp_info_fifo {
520-
struct mlx5e_xdp_info *xi;
479+
union mlx5e_xdp_info *xi;
521480
u32 *cc;
522481
u32 *pc;
523482
u32 mask;
524483
};
525484

526485
struct mlx5e_xdpsq;
486+
struct mlx5e_xmit_data;
527487
typedef int (*mlx5e_fp_xmit_xdp_frame_check)(struct mlx5e_xdpsq *);
528488
typedef bool (*mlx5e_fp_xmit_xdp_frame)(struct mlx5e_xdpsq *,
529489
struct mlx5e_xmit_data *,
530-
struct skb_shared_info *,
531490
int);
532491

533492
struct mlx5e_xdpsq {
@@ -628,6 +587,7 @@ union mlx5e_alloc_units {
628587
struct mlx5e_mpw_info {
629588
u16 consumed_strides;
630589
DECLARE_BITMAP(skip_release_bitmap, MLX5_MPWRQ_MAX_PAGES_PER_WQE);
590+
struct mlx5e_frag_page linear_page;
631591
union mlx5e_alloc_units alloc_units;
632592
};
633593

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

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -253,17 +253,20 @@ static u32 mlx5e_rx_get_linear_stride_sz(struct mlx5_core_dev *mdev,
253253
struct mlx5e_xsk_param *xsk,
254254
bool mpwqe)
255255
{
256+
u32 sz;
257+
256258
/* XSK frames are mapped as individual pages, because frames may come in
257259
* an arbitrary order from random locations in the UMEM.
258260
*/
259261
if (xsk)
260262
return mpwqe ? 1 << mlx5e_mpwrq_page_shift(mdev, xsk) : PAGE_SIZE;
261263

262-
/* XDP in mlx5e doesn't support multiple packets per page. */
263-
if (params->xdp_prog)
264-
return PAGE_SIZE;
264+
sz = roundup_pow_of_two(mlx5e_rx_get_linear_sz_skb(params, false));
265265

266-
return roundup_pow_of_two(mlx5e_rx_get_linear_sz_skb(params, false));
266+
/* XDP in mlx5e doesn't support multiple packets per page.
267+
* Do not assume sz <= PAGE_SIZE if params->xdp_prog is set.
268+
*/
269+
return params->xdp_prog && sz < PAGE_SIZE ? PAGE_SIZE : sz;
267270
}
268271

269272
static u8 mlx5e_mpwqe_log_pkts_per_wqe(struct mlx5_core_dev *mdev,
@@ -320,6 +323,20 @@ static bool mlx5e_verify_rx_mpwqe_strides(struct mlx5_core_dev *mdev,
320323
return log_num_strides >= MLX5_MPWQE_LOG_NUM_STRIDES_BASE;
321324
}
322325

326+
bool mlx5e_verify_params_rx_mpwqe_strides(struct mlx5_core_dev *mdev,
327+
struct mlx5e_params *params,
328+
struct mlx5e_xsk_param *xsk)
329+
{
330+
u8 log_wqe_num_of_strides = mlx5e_mpwqe_get_log_num_strides(mdev, params, xsk);
331+
u8 log_wqe_stride_size = mlx5e_mpwqe_get_log_stride_size(mdev, params, xsk);
332+
enum mlx5e_mpwrq_umr_mode umr_mode = mlx5e_mpwrq_umr_mode(mdev, xsk);
333+
u8 page_shift = mlx5e_mpwrq_page_shift(mdev, xsk);
334+
335+
return mlx5e_verify_rx_mpwqe_strides(mdev, log_wqe_stride_size,
336+
log_wqe_num_of_strides,
337+
page_shift, umr_mode);
338+
}
339+
323340
bool mlx5e_rx_mpwqe_is_linear_skb(struct mlx5_core_dev *mdev,
324341
struct mlx5e_params *params,
325342
struct mlx5e_xsk_param *xsk)
@@ -402,6 +419,10 @@ u8 mlx5e_mpwqe_get_log_stride_size(struct mlx5_core_dev *mdev,
402419
if (mlx5e_rx_mpwqe_is_linear_skb(mdev, params, xsk))
403420
return order_base_2(mlx5e_rx_get_linear_stride_sz(mdev, params, xsk, true));
404421

422+
/* XDP in mlx5e doesn't support multiple packets per page. */
423+
if (params->xdp_prog)
424+
return PAGE_SHIFT;
425+
405426
return MLX5_MPWRQ_DEF_LOG_STRIDE_SZ(mdev);
406427
}
407428

@@ -572,9 +593,6 @@ int mlx5e_mpwrq_validate_regular(struct mlx5_core_dev *mdev, struct mlx5e_params
572593
if (!mlx5e_check_fragmented_striding_rq_cap(mdev, page_shift, umr_mode))
573594
return -EOPNOTSUPP;
574595

575-
if (params->xdp_prog && !mlx5e_rx_mpwqe_is_linear_skb(mdev, params, NULL))
576-
return -EINVAL;
577-
578596
return 0;
579597
}
580598

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,9 @@ int mlx5e_build_channel_param(struct mlx5_core_dev *mdev,
153153

154154
u16 mlx5e_calc_sq_stop_room(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
155155
int mlx5e_validate_params(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
156+
bool mlx5e_verify_params_rx_mpwqe_strides(struct mlx5_core_dev *mdev,
157+
struct mlx5e_params *params,
158+
struct mlx5e_xsk_param *xsk);
156159

157160
static inline void mlx5e_params_print_info(struct mlx5_core_dev *mdev,
158161
struct mlx5e_params *params)

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,19 @@ static inline bool mlx5e_rx_hw_stamp(struct hwtstamp_config *config)
7777
}
7878

7979
/* TX */
80+
struct mlx5e_xmit_data {
81+
dma_addr_t dma_addr;
82+
void *data;
83+
u32 len : 31;
84+
u32 has_frags : 1;
85+
};
86+
87+
struct mlx5e_xmit_data_frags {
88+
struct mlx5e_xmit_data xd;
89+
struct skb_shared_info *sinfo;
90+
dma_addr_t *dma_arr;
91+
};
92+
8093
netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev);
8194
bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget);
8295
void mlx5e_free_txqsq_descs(struct mlx5e_txqsq *sq);

0 commit comments

Comments
 (0)