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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.