Add timer to watch the RQ when we are out of mbufs.
The firmware/hardware does not generate additional completion events unless we post new buffers. Use a timer to try to post more buffers in case we are temporarily out of mbufs. Else the receive schedule completely stops. Sponsored by: Mellanox Technologies MFC after: 1 week
This commit is contained in:
parent
c1bc87b161
commit
6f4cab6cc3
@ -478,6 +478,7 @@ struct mlx5e_rq {
|
||||
struct mlx5_wq_ctrl wq_ctrl;
|
||||
u32 rqn;
|
||||
struct mlx5e_channel *channel;
|
||||
struct callout watchdog;
|
||||
} __aligned(MLX5E_CACHELINE_SIZE);
|
||||
|
||||
struct mlx5e_sq_mbuf {
|
||||
|
@ -855,7 +855,13 @@ err_destroy_rq:
|
||||
static void
|
||||
mlx5e_close_rq(struct mlx5e_rq *rq)
|
||||
{
|
||||
mtx_lock(&rq->mtx);
|
||||
rq->enabled = 0;
|
||||
callout_stop(&rq->watchdog);
|
||||
mtx_unlock(&rq->mtx);
|
||||
|
||||
callout_drain(&rq->watchdog);
|
||||
|
||||
mlx5e_modify_rq(rq, MLX5_RQC_STATE_RDY, MLX5_RQC_STATE_ERR);
|
||||
}
|
||||
|
||||
@ -1439,6 +1445,8 @@ mlx5e_chan_mtx_init(struct mlx5e_channel *c)
|
||||
|
||||
mtx_init(&c->rq.mtx, "mlx5rx", MTX_NETWORK_LOCK, MTX_DEF);
|
||||
|
||||
callout_init_mtx(&c->rq.watchdog, &c->rq.mtx, 0);
|
||||
|
||||
for (tc = 0; tc < c->num_tc; tc++) {
|
||||
struct mlx5e_sq *sq = c->sq + tc;
|
||||
|
||||
|
@ -82,9 +82,10 @@ mlx5e_post_rx_wqes(struct mlx5e_rq *rq)
|
||||
while (!mlx5_wq_ll_is_full(&rq->wq)) {
|
||||
struct mlx5e_rx_wqe *wqe = mlx5_wq_ll_get_wqe(&rq->wq, rq->wq.head);
|
||||
|
||||
if (unlikely(mlx5e_alloc_rx_wqe(rq, wqe, rq->wq.head)))
|
||||
if (unlikely(mlx5e_alloc_rx_wqe(rq, wqe, rq->wq.head))) {
|
||||
callout_reset_curcpu(&rq->watchdog, 1, (void *)&mlx5e_post_rx_wqes, rq);
|
||||
break;
|
||||
|
||||
}
|
||||
mlx5_wq_ll_push(&rq->wq, be16_to_cpu(wqe->next.next_wqe_index));
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user