RE: [PATCH iwl-net v1] i40e: fix set_ringparam error path freeing live Tx rings
"Loktionov, Aleksandr" <[email protected]>
| Newsgroups | org.osuosl.intel-wired-lan,org.kernel.vger.netdev |
|---|---|
| Message-ID | <IA3PR11MB898627357B69696EFD995B7DE5A32@IA3PR11MB8986.namprd11.prod.outlook.com> |
> -----Original Message----- > From: Simon Horman <[email protected]> > Sent: Thursday, July 16, 2026 12:42 PM > To: Loktionov, Aleksandr <[email protected]> > Cc: Simon Horman <[email protected]>; [email protected]; > Nguyen, Anthony L <[email protected]>; [email protected] > Subject: Re: [PATCH iwl-net v1] i40e: fix set_ringparam error path > freeing live Tx rings > > This is an AI-generated review of your patch. The human sending this > email has considered the AI review valid, or at least plausible. > Full review at: https://sashiko.dev > --- > --- Patch [1]: [PATCH iwl-net v1] i40e: fix set_ringparam error path > freeing live Tx rings --- commit > 7042e7b9f58a75bdb26437aed842a7b6780df035 > Author: Aleksandr Loktionov <[email protected]> > > i40e: fix set_ringparam error path freeing live Tx rings > > This commit fixes an issue in the i40e_set_ringparam() error path > where it mistakenly frees live, NAPI-active TX rings instead of the > temporary rings allocated for a configuration change. It does this by > passing the address of the temporary rings instead of the live ring > pointer. > > > diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c > > b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c > > index 3da9ec49cc745..6d2b076049f7e 100644 > > --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c > > +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c > > @@ -2249,7 +2249,7 @@ static int i40e_set_ringparam(struct > net_device *netdev, > > if (tx_rings) { > > for (i = 0; i < tx_alloc_queue_pairs; i++) { > > if (i40e_active_tx_ring_index(vsi, i)) > > - i40e_free_tx_resources(vsi->tx_rings[i]); > > + i40e_free_tx_resources(&tx_rings[i]); > > [Severity: High] > This is a pre-existing issue, but does calling > i40e_free_tx_resources() on the cloned &tx_rings[i] inadvertently > reset the Byte Queue Limits (BQL) state on the live TX queues? > > Because the temporary rings are shallow copies of the live rings, they > inherit the netdev and queue_index fields. When > i40e_free_tx_resources() cleans up the temporary rings, it calls > i40e_clean_tx_ring(): > > drivers/net/ethernet/intel/i40e/i40e_txrx.c:i40e_clean_tx_ring() { > ... > netdev_tx_reset_queue(txring_txq(tx_ring)); > ... > } > > Since i40e_down() has not yet been called on this error path, the live > queue is still actively transmitting. Locklessly resetting BQL here > zeroes num_queued. When the hardware subsequently completes the > already-queued packets, won't dql_completed() underflow and trigger a > BUG_ON()? > > The same issue also seems to be present in the earlier error path if > i40e_setup_tx_descriptors() fails. > > > } > > kfree(tx_rings); > > tx_rings = NULL; Thank you for your review. I'll re-spin v2 asap Alex