> -----Original Message-----
> From: Petr Oros <[email protected]> 
> Sent: Friday, October 2, 2026 6:08 AM
> To: [email protected]
> Cc: Oros, Petr <[email protected]>; Nguyen, Anthony L 
> <[email protected]>; Kitszel, Przemyslaw 
> <[email protected]>; Andrew Lunn <[email protected]>; David S. 
> Miller <[email protected]>; Eric Dumazet <[email protected]>; Jakub 
> Kicinski <[email protected]>; Paolo Abeni <[email protected]>; Lobakin, 
> Aleksander <[email protected]>; Alexei Starovoitov 
> <[email protected]>; Daniel Borkmann <[email protected]>; Jesper Dangaard 
> Brouer <[email protected]>; John Fastabend <[email protected]>; 
> Stanislav Fomichev <[email protected]>; Henry Tieman > 
> <[email protected]>; Anirudh Venkataramanan 
> <[email protected]>; Michal Swiatkowski 
> <[email protected]>; Jesse Brandeburg <[email protected]>; 
> Preethi Banala <[email protected]>; Kiran Patil 
> <[email protected]>; Dan Nowlin <[email protected]>; Stephen Hemminger 
> <[email protected]>; [email protected]; 
> [email protected]; [email protected]
> Subject: [PATCH iwl-net 07/10] ice: take the switch rule AQ error from the 
> response descriptor
> 
> ice_aq_sw_rules() decides whether a rule removal failed with ENOENT by 
> reading hw->adminq.sq_last_status after ice_aq_send_cmd() returned. That 
> field is shared by every admin queue user and is only stable > while the send 
> queue lock is held. Another AQ command completing in between can overwrite 
> it, so a failed removal is reported as a generic error, and a successful one 
> can even be turned into -ENOENT, because the check is not limited to the 
> failure case. A caller that sees -ENOENT keeps its rule bookkeeping while the 
> rule is gone from the hardware.
> 
> ice_vsi_sync_fltr() has the same problem with ENOSPC. It checks 
> sq_last_status only after it has freed the list of filters it tried to add. 
> Every entry is a separate devres allocation, so freeing a list of thousands 
> of entries takes seconds, and by then the value usually belongs to a 
> different command, so the MAC filter overflow handling is never entered. With 
> debug prints of the error and sq_last_status added to both places:
> 
>   ice_aq_sw_rules: opc 0x2a0 status -5 aq 16
>   ice 0000:04:00.0 enp4s0f0np0: Failed to add MAC filters err -5 aq 0
> 
> Use the retval of the descriptor that ice_aq_send_cmd() copies back, only 
> when the command failed, translate ENOSPC on add to -ENOSPC and let 
> ice_vsi_sync_fltr() check the return code instead of sq_last_status.
> 
> i40e fixed the same kind of race in commit 53a9e346e159 ("i40e: Fix race 
> condition while adding/deleting MAC/VLAN filters").
> 
> Fixes: ca1fdb885e5f ("ice: return correct error code from ice_aq_sw_rules")
> Assisted-by: LLM
> Signed-off-by: Petr Oros <[email protected]>
> ---
>  drivers/net/ethernet/intel/ice/ice_main.c   |  4 +---
>  drivers/net/ethernet/intel/ice/ice_switch.c | 13 ++++++++++---
>  2 files changed, 11 insertions(+), 6 deletions(-)

Tested-by: Alexander Nowlin <[email protected]>

Reply via email to