mirror of https://gitee.com/openkylin/linux.git
net/mlx5e: XDP, Add array for WQE info descriptors
Each xdp_wqe_info instance describes the number of data-segments and WQEBBs of the WQE. This is useful for a downstream patch that adds support for Multi-Packet TX WQE feature. Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
fea28dd6a2
commit
1feeab8007
|
@ -411,6 +411,11 @@ struct mlx5e_xdp_info_fifo {
|
||||||
u32 mask;
|
u32 mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct mlx5e_xdp_wqe_info {
|
||||||
|
u8 num_wqebbs;
|
||||||
|
u8 num_ds;
|
||||||
|
};
|
||||||
|
|
||||||
struct mlx5e_xdpsq {
|
struct mlx5e_xdpsq {
|
||||||
/* data path */
|
/* data path */
|
||||||
|
|
||||||
|
@ -430,6 +435,7 @@ struct mlx5e_xdpsq {
|
||||||
struct mlx5_wq_cyc wq;
|
struct mlx5_wq_cyc wq;
|
||||||
struct mlx5e_xdpsq_stats *stats;
|
struct mlx5e_xdpsq_stats *stats;
|
||||||
struct {
|
struct {
|
||||||
|
struct mlx5e_xdp_wqe_info *wqe_info;
|
||||||
struct mlx5e_xdp_info_fifo xdpi_fifo;
|
struct mlx5e_xdp_info_fifo xdpi_fifo;
|
||||||
} db;
|
} db;
|
||||||
void __iomem *uar_map;
|
void __iomem *uar_map;
|
||||||
|
|
|
@ -199,11 +199,18 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq, struct mlx5e_rq *rq)
|
||||||
get_cqe_opcode(cqe));
|
get_cqe_opcode(cqe));
|
||||||
|
|
||||||
do {
|
do {
|
||||||
struct mlx5e_xdp_info xdpi =
|
struct mlx5e_xdp_wqe_info *wi;
|
||||||
mlx5e_xdpi_fifo_pop(xdpi_fifo);
|
u16 ci, j;
|
||||||
|
|
||||||
last_wqe = (sqcc == wqe_counter);
|
last_wqe = (sqcc == wqe_counter);
|
||||||
sqcc++;
|
ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sqcc);
|
||||||
|
wi = &sq->db.wqe_info[ci];
|
||||||
|
|
||||||
|
sqcc += wi->num_wqebbs;
|
||||||
|
|
||||||
|
for (j = 0; j < wi->num_ds; j++) {
|
||||||
|
struct mlx5e_xdp_info xdpi =
|
||||||
|
mlx5e_xdpi_fifo_pop(xdpi_fifo);
|
||||||
|
|
||||||
if (is_redirect) {
|
if (is_redirect) {
|
||||||
xdp_return_frame(xdpi.xdpf);
|
xdp_return_frame(xdpi.xdpf);
|
||||||
|
@ -213,6 +220,7 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq, struct mlx5e_rq *rq)
|
||||||
/* Recycle RX page */
|
/* Recycle RX page */
|
||||||
mlx5e_page_release(rq, &xdpi.di, true);
|
mlx5e_page_release(rq, &xdpi.di, true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} while (!last_wqe);
|
} while (!last_wqe);
|
||||||
} while ((++i < MLX5E_TX_CQ_POLL_BUDGET) && (cqe = mlx5_cqwq_get_cqe(&cq->wq)));
|
} while ((++i < MLX5E_TX_CQ_POLL_BUDGET) && (cqe = mlx5_cqwq_get_cqe(&cq->wq)));
|
||||||
|
|
||||||
|
@ -233,11 +241,18 @@ void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq, struct mlx5e_rq *rq)
|
||||||
bool is_redirect = !rq;
|
bool is_redirect = !rq;
|
||||||
|
|
||||||
while (sq->cc != sq->pc) {
|
while (sq->cc != sq->pc) {
|
||||||
|
struct mlx5e_xdp_wqe_info *wi;
|
||||||
|
u16 ci, i;
|
||||||
|
|
||||||
|
ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->cc);
|
||||||
|
wi = &sq->db.wqe_info[ci];
|
||||||
|
|
||||||
|
sq->cc += wi->num_wqebbs;
|
||||||
|
|
||||||
|
for (i = 0; i < wi->num_ds; i++) {
|
||||||
struct mlx5e_xdp_info xdpi =
|
struct mlx5e_xdp_info xdpi =
|
||||||
mlx5e_xdpi_fifo_pop(xdpi_fifo);
|
mlx5e_xdpi_fifo_pop(xdpi_fifo);
|
||||||
|
|
||||||
sq->cc++;
|
|
||||||
|
|
||||||
if (is_redirect) {
|
if (is_redirect) {
|
||||||
xdp_return_frame(xdpi.xdpf);
|
xdp_return_frame(xdpi.xdpf);
|
||||||
dma_unmap_single(sq->pdev, xdpi.dma_addr,
|
dma_unmap_single(sq->pdev, xdpi.dma_addr,
|
||||||
|
@ -247,6 +262,7 @@ void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq, struct mlx5e_rq *rq)
|
||||||
mlx5e_page_release(rq, &xdpi.di, false);
|
mlx5e_page_release(rq, &xdpi.di, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
|
int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
|
||||||
|
|
|
@ -993,6 +993,7 @@ static void mlx5e_close_rq(struct mlx5e_rq *rq)
|
||||||
static void mlx5e_free_xdpsq_db(struct mlx5e_xdpsq *sq)
|
static void mlx5e_free_xdpsq_db(struct mlx5e_xdpsq *sq)
|
||||||
{
|
{
|
||||||
kvfree(sq->db.xdpi_fifo.xi);
|
kvfree(sq->db.xdpi_fifo.xi);
|
||||||
|
kvfree(sq->db.wqe_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mlx5e_alloc_xdpsq_fifo(struct mlx5e_xdpsq *sq, int numa)
|
static int mlx5e_alloc_xdpsq_fifo(struct mlx5e_xdpsq *sq, int numa)
|
||||||
|
@ -1015,8 +1016,14 @@ static int mlx5e_alloc_xdpsq_fifo(struct mlx5e_xdpsq *sq, int numa)
|
||||||
|
|
||||||
static int mlx5e_alloc_xdpsq_db(struct mlx5e_xdpsq *sq, int numa)
|
static int mlx5e_alloc_xdpsq_db(struct mlx5e_xdpsq *sq, int numa)
|
||||||
{
|
{
|
||||||
|
int wq_sz = mlx5_wq_cyc_get_size(&sq->wq);
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
sq->db.wqe_info = kvzalloc_node(sizeof(*sq->db.wqe_info) * wq_sz,
|
||||||
|
GFP_KERNEL, numa);
|
||||||
|
if (!sq->db.wqe_info)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
err = mlx5e_alloc_xdpsq_fifo(sq, numa);
|
err = mlx5e_alloc_xdpsq_fifo(sq, numa);
|
||||||
if (err) {
|
if (err) {
|
||||||
mlx5e_free_xdpsq_db(sq);
|
mlx5e_free_xdpsq_db(sq);
|
||||||
|
@ -1606,6 +1613,7 @@ static int mlx5e_open_xdpsq(struct mlx5e_channel *c,
|
||||||
|
|
||||||
/* Pre initialize fixed WQE fields */
|
/* Pre initialize fixed WQE fields */
|
||||||
for (i = 0; i < mlx5_wq_cyc_get_size(&sq->wq); i++) {
|
for (i = 0; i < mlx5_wq_cyc_get_size(&sq->wq); i++) {
|
||||||
|
struct mlx5e_xdp_wqe_info *wi = &sq->db.wqe_info[i];
|
||||||
struct mlx5e_tx_wqe *wqe = mlx5_wq_cyc_get_wqe(&sq->wq, i);
|
struct mlx5e_tx_wqe *wqe = mlx5_wq_cyc_get_wqe(&sq->wq, i);
|
||||||
struct mlx5_wqe_ctrl_seg *cseg = &wqe->ctrl;
|
struct mlx5_wqe_ctrl_seg *cseg = &wqe->ctrl;
|
||||||
struct mlx5_wqe_eth_seg *eseg = &wqe->eth;
|
struct mlx5_wqe_eth_seg *eseg = &wqe->eth;
|
||||||
|
@ -1616,6 +1624,9 @@ static int mlx5e_open_xdpsq(struct mlx5e_channel *c,
|
||||||
|
|
||||||
dseg = (struct mlx5_wqe_data_seg *)cseg + (ds_cnt - 1);
|
dseg = (struct mlx5_wqe_data_seg *)cseg + (ds_cnt - 1);
|
||||||
dseg->lkey = sq->mkey_be;
|
dseg->lkey = sq->mkey_be;
|
||||||
|
|
||||||
|
wi->num_wqebbs = 1;
|
||||||
|
wi->num_ds = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue