|
@@ -2077,14 +2077,17 @@ nfp_ctrl_rx_one(struct nfp_net *nn, struct nfp_net_dp *dp,
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-static void nfp_ctrl_rx(struct nfp_net_r_vector *r_vec)
|
|
|
+static bool nfp_ctrl_rx(struct nfp_net_r_vector *r_vec)
|
|
|
{
|
|
|
struct nfp_net_rx_ring *rx_ring = r_vec->rx_ring;
|
|
|
struct nfp_net *nn = r_vec->nfp_net;
|
|
|
struct nfp_net_dp *dp = &nn->dp;
|
|
|
+ unsigned int budget = 512;
|
|
|
|
|
|
- while (nfp_ctrl_rx_one(nn, dp, r_vec, rx_ring))
|
|
|
+ while (nfp_ctrl_rx_one(nn, dp, r_vec, rx_ring) && budget--)
|
|
|
continue;
|
|
|
+
|
|
|
+ return budget;
|
|
|
}
|
|
|
|
|
|
static void nfp_ctrl_poll(unsigned long arg)
|
|
@@ -2096,9 +2099,13 @@ static void nfp_ctrl_poll(unsigned long arg)
|
|
|
__nfp_ctrl_tx_queued(r_vec);
|
|
|
spin_unlock_bh(&r_vec->lock);
|
|
|
|
|
|
- nfp_ctrl_rx(r_vec);
|
|
|
-
|
|
|
- nfp_net_irq_unmask(r_vec->nfp_net, r_vec->irq_entry);
|
|
|
+ if (nfp_ctrl_rx(r_vec)) {
|
|
|
+ nfp_net_irq_unmask(r_vec->nfp_net, r_vec->irq_entry);
|
|
|
+ } else {
|
|
|
+ tasklet_schedule(&r_vec->tasklet);
|
|
|
+ nn_dp_warn(&r_vec->nfp_net->dp,
|
|
|
+ "control message budget exceeded!\n");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Setup and Configuration
|