Message ID | 20240208005725.65134-2-shannon.nelson@amd.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | ionic: add XDP support | expand |
On Wed, 7 Feb 2024 16:57:16 -0800 Shannon Nelson wrote: > We should be doing as little as possible besides freeing Tx > space when our napi routines are called with budget of 0, so > jump out before doing anything besides Tx cleaning. > > See commit afbed3f74830 ("net/mlx5e: do as little as possible in napi > poll when budget is 0") for more info. Unfortunately to commit you quote proves that this is a real bug which can crash a non trivial number of machines if kernel printks meet an XDP workload :( This really should go to net.
On 2/9/2024 2:09 PM, Jakub Kicinski wrote: > > On Wed, 7 Feb 2024 16:57:16 -0800 Shannon Nelson wrote: >> We should be doing as little as possible besides freeing Tx >> space when our napi routines are called with budget of 0, so >> jump out before doing anything besides Tx cleaning. >> >> See commit afbed3f74830 ("net/mlx5e: do as little as possible in napi >> poll when budget is 0") for more info. > > Unfortunately to commit you quote proves that this is a real bug which > can crash a non trivial number of machines if kernel printks meet an XDP > workload :( This really should go to net. Sure - I'll repackage that and send it back out. sln
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_txrx.c b/drivers/net/ethernet/pensando/ionic/ionic_txrx.c index 54cd96b035d6..6f4776759863 100644 --- a/drivers/net/ethernet/pensando/ionic/ionic_txrx.c +++ b/drivers/net/ethernet/pensando/ionic/ionic_txrx.c @@ -579,6 +579,9 @@ int ionic_tx_napi(struct napi_struct *napi, int budget) work_done = ionic_cq_service(cq, budget, ionic_tx_service, NULL, NULL); + if (unlikely(!budget)) + return budget; + if (work_done < budget && napi_complete_done(napi, work_done)) { ionic_dim_update(qcq, IONIC_LIF_F_TX_DIM_INTR); flags |= IONIC_INTR_CRED_UNMASK; @@ -607,6 +610,9 @@ int ionic_rx_napi(struct napi_struct *napi, int budget) u32 work_done = 0; u32 flags = 0; + if (unlikely(!budget)) + return budget; + lif = cq->bound_q->lif; idev = &lif->ionic->idev; @@ -656,6 +662,9 @@ int ionic_txrx_napi(struct napi_struct *napi, int budget) tx_work_done = ionic_cq_service(txcq, IONIC_TX_BUDGET_DEFAULT, ionic_tx_service, NULL, NULL); + if (unlikely(!budget)) + return budget; + rx_work_done = ionic_cq_service(rxcq, budget, ionic_rx_service, NULL, NULL);