mirror of https://gitee.com/openkylin/linux.git
net/mlx5e: Move XDP completion functions to rx file
XDP code belongs to RX path, move mlx5e_poll_xdp_tx_cq and mlx5e_free_xdp_tx_descs to en_rx.c. Rename them to mlx5e_poll_xdpsq_cq and mlx5e_free_xdpsq_descs. Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Reviewed-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
aff2615763
commit
1c4bf94045
|
@ -737,6 +737,8 @@ void mlx5e_cq_error_event(struct mlx5_core_cq *mcq, enum mlx5_event event);
|
|||
int mlx5e_napi_poll(struct napi_struct *napi, int budget);
|
||||
bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget);
|
||||
int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget);
|
||||
bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq);
|
||||
void mlx5e_free_xdpsq_descs(struct mlx5e_sq *sq);
|
||||
void mlx5e_free_sq_descs(struct mlx5e_sq *sq);
|
||||
|
||||
void mlx5e_page_release(struct mlx5e_rq *rq, struct mlx5e_dma_info *dma_info,
|
||||
|
|
|
@ -989,3 +989,85 @@ int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget)
|
|||
|
||||
return work_done;
|
||||
}
|
||||
|
||||
bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq)
|
||||
{
|
||||
struct mlx5e_sq *sq;
|
||||
u16 sqcc;
|
||||
int i;
|
||||
|
||||
sq = container_of(cq, struct mlx5e_sq, cq);
|
||||
|
||||
if (unlikely(!test_bit(MLX5E_SQ_STATE_ENABLED, &sq->state)))
|
||||
return false;
|
||||
|
||||
/* sq->cc must be updated only after mlx5_cqwq_update_db_record(),
|
||||
* otherwise a cq overrun may occur
|
||||
*/
|
||||
sqcc = sq->cc;
|
||||
|
||||
for (i = 0; i < MLX5E_TX_CQ_POLL_BUDGET; i++) {
|
||||
struct mlx5_cqe64 *cqe;
|
||||
u16 wqe_counter;
|
||||
bool last_wqe;
|
||||
|
||||
cqe = mlx5e_get_cqe(cq);
|
||||
if (!cqe)
|
||||
break;
|
||||
|
||||
mlx5_cqwq_pop(&cq->wq);
|
||||
|
||||
wqe_counter = be16_to_cpu(cqe->wqe_counter);
|
||||
|
||||
do {
|
||||
struct mlx5e_sq_wqe_info *wi;
|
||||
struct mlx5e_dma_info *di;
|
||||
u16 ci;
|
||||
|
||||
last_wqe = (sqcc == wqe_counter);
|
||||
|
||||
ci = sqcc & sq->wq.sz_m1;
|
||||
di = &sq->db.xdp.di[ci];
|
||||
wi = &sq->db.xdp.wqe_info[ci];
|
||||
|
||||
if (unlikely(wi->opcode == MLX5_OPCODE_NOP)) {
|
||||
sqcc++;
|
||||
continue;
|
||||
}
|
||||
|
||||
sqcc += wi->num_wqebbs;
|
||||
/* Recycle RX page */
|
||||
mlx5e_page_release(&sq->channel->rq, di, true);
|
||||
} while (!last_wqe);
|
||||
}
|
||||
|
||||
mlx5_cqwq_update_db_record(&cq->wq);
|
||||
|
||||
/* ensure cq space is freed before enabling more cqes */
|
||||
wmb();
|
||||
|
||||
sq->cc = sqcc;
|
||||
return (i == MLX5E_TX_CQ_POLL_BUDGET);
|
||||
}
|
||||
|
||||
void mlx5e_free_xdpsq_descs(struct mlx5e_sq *sq)
|
||||
{
|
||||
struct mlx5e_sq_wqe_info *wi;
|
||||
struct mlx5e_dma_info *di;
|
||||
u16 ci;
|
||||
|
||||
while (sq->cc != sq->pc) {
|
||||
ci = sq->cc & sq->wq.sz_m1;
|
||||
di = &sq->db.xdp.di[ci];
|
||||
wi = &sq->db.xdp.wqe_info[ci];
|
||||
|
||||
if (wi->opcode == MLX5_OPCODE_NOP) {
|
||||
sq->cc++;
|
||||
continue;
|
||||
}
|
||||
|
||||
sq->cc += wi->num_wqebbs;
|
||||
|
||||
mlx5e_page_release(&sq->channel->rq, di, false);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -493,28 +493,6 @@ static void mlx5e_free_txq_sq_descs(struct mlx5e_sq *sq)
|
|||
}
|
||||
}
|
||||
|
||||
static void mlx5e_free_xdp_sq_descs(struct mlx5e_sq *sq)
|
||||
{
|
||||
struct mlx5e_sq_wqe_info *wi;
|
||||
struct mlx5e_dma_info *di;
|
||||
u16 ci;
|
||||
|
||||
while (sq->cc != sq->pc) {
|
||||
ci = sq->cc & sq->wq.sz_m1;
|
||||
di = &sq->db.xdp.di[ci];
|
||||
wi = &sq->db.xdp.wqe_info[ci];
|
||||
|
||||
if (wi->opcode == MLX5_OPCODE_NOP) {
|
||||
sq->cc++;
|
||||
continue;
|
||||
}
|
||||
|
||||
sq->cc += wi->num_wqebbs;
|
||||
|
||||
mlx5e_page_release(&sq->channel->rq, di, false);
|
||||
}
|
||||
}
|
||||
|
||||
void mlx5e_free_sq_descs(struct mlx5e_sq *sq)
|
||||
{
|
||||
switch (sq->type) {
|
||||
|
@ -522,7 +500,7 @@ void mlx5e_free_sq_descs(struct mlx5e_sq *sq)
|
|||
mlx5e_free_txq_sq_descs(sq);
|
||||
break;
|
||||
case MLX5E_SQ_XDP:
|
||||
mlx5e_free_xdp_sq_descs(sq);
|
||||
mlx5e_free_xdpsq_descs(sq);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -105,66 +105,6 @@ static void mlx5e_poll_ico_cq(struct mlx5e_cq *cq)
|
|||
sq->cc = sqcc;
|
||||
}
|
||||
|
||||
static inline bool mlx5e_poll_xdp_tx_cq(struct mlx5e_cq *cq)
|
||||
{
|
||||
struct mlx5e_sq *sq;
|
||||
u16 sqcc;
|
||||
int i;
|
||||
|
||||
sq = container_of(cq, struct mlx5e_sq, cq);
|
||||
|
||||
if (unlikely(!test_bit(MLX5E_SQ_STATE_ENABLED, &sq->state)))
|
||||
return false;
|
||||
|
||||
/* sq->cc must be updated only after mlx5_cqwq_update_db_record(),
|
||||
* otherwise a cq overrun may occur
|
||||
*/
|
||||
sqcc = sq->cc;
|
||||
|
||||
for (i = 0; i < MLX5E_TX_CQ_POLL_BUDGET; i++) {
|
||||
struct mlx5_cqe64 *cqe;
|
||||
u16 wqe_counter;
|
||||
bool last_wqe;
|
||||
|
||||
cqe = mlx5e_get_cqe(cq);
|
||||
if (!cqe)
|
||||
break;
|
||||
|
||||
mlx5_cqwq_pop(&cq->wq);
|
||||
|
||||
wqe_counter = be16_to_cpu(cqe->wqe_counter);
|
||||
|
||||
do {
|
||||
struct mlx5e_sq_wqe_info *wi;
|
||||
struct mlx5e_dma_info *di;
|
||||
u16 ci;
|
||||
|
||||
last_wqe = (sqcc == wqe_counter);
|
||||
|
||||
ci = sqcc & sq->wq.sz_m1;
|
||||
di = &sq->db.xdp.di[ci];
|
||||
wi = &sq->db.xdp.wqe_info[ci];
|
||||
|
||||
if (unlikely(wi->opcode == MLX5_OPCODE_NOP)) {
|
||||
sqcc++;
|
||||
continue;
|
||||
}
|
||||
|
||||
sqcc += wi->num_wqebbs;
|
||||
/* Recycle RX page */
|
||||
mlx5e_page_release(&sq->channel->rq, di, true);
|
||||
} while (!last_wqe);
|
||||
}
|
||||
|
||||
mlx5_cqwq_update_db_record(&cq->wq);
|
||||
|
||||
/* ensure cq space is freed before enabling more cqes */
|
||||
wmb();
|
||||
|
||||
sq->cc = sqcc;
|
||||
return (i == MLX5E_TX_CQ_POLL_BUDGET);
|
||||
}
|
||||
|
||||
int mlx5e_napi_poll(struct napi_struct *napi, int budget)
|
||||
{
|
||||
struct mlx5e_channel *c = container_of(napi, struct mlx5e_channel,
|
||||
|
@ -182,7 +122,7 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
|
|||
busy |= work_done == budget;
|
||||
|
||||
if (c->xdp)
|
||||
busy |= mlx5e_poll_xdp_tx_cq(&c->xdp_sq.cq);
|
||||
busy |= mlx5e_poll_xdpsq_cq(&c->xdp_sq.cq);
|
||||
|
||||
mlx5e_poll_ico_cq(&c->icosq.cq);
|
||||
|
||||
|
|
Loading…
Reference in New Issue