summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/mlx5/mlx5_en/en.h1
-rw-r--r--sys/dev/mlx5/mlx5_en/mlx5_en_main.c8
-rw-r--r--sys/dev/mlx5/mlx5_en/mlx5_en_rx.c5
3 files changed, 12 insertions, 2 deletions
diff --git a/sys/dev/mlx5/mlx5_en/en.h b/sys/dev/mlx5/mlx5_en/en.h
index b953591..ade80a5 100644
--- a/sys/dev/mlx5/mlx5_en/en.h
+++ b/sys/dev/mlx5/mlx5_en/en.h
@@ -488,6 +488,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 {
diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
index 7057410..c2cfff9 100644
--- a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
+++ b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
@@ -861,7 +861,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);
}
@@ -1445,6 +1451,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;
diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_rx.c b/sys/dev/mlx5/mlx5_en/mlx5_en_rx.c
index 48339be..0d3e16e 100644
--- a/sys/dev/mlx5/mlx5_en/mlx5_en_rx.c
+++ b/sys/dev/mlx5/mlx5_en/mlx5_en_rx.c
@@ -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));
}
OpenPOWER on IntegriCloud