From: Loktionov, Aleksandr <[email protected]> Date: Wed, 21 Jan 2026 08:18:47 +0100
> > >> -----Original Message----- >> From: Lobakin, Aleksander <[email protected]> >> Sent: Tuesday, January 20, 2026 6:34 PM >> To: Nguyen, Anthony L <[email protected]>; intel-wired- >> [email protected] >> Cc: Lobakin, Aleksander <[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]>; Simon Horman <[email protected]>; Keller, >> Jacob E <[email protected]>; Loktionov, Aleksandr >> <[email protected]>; NXNE CNSE OSDT ITP Upstreaming >> <[email protected]>; [email protected]; >> [email protected] >> Subject: [PATCH iwl-next] ice: fix system hang on `ethtool -L` >> >> ice_set_channels() calls ice_vsi_rebuild() under the netdev lock >> taken, but ice_vsi_rebuild() calls netif_napi_{add,del}() which take >> the same lock. >> Add ice_vsi_rebuild_locked() which uses the _locked counterparts of >> these functions and use it in ice_set_channels(). >> >> Signed-off-by: Alexander Lobakin <[email protected]> >> --- >> Hey Tony, please amend to the patch I replied to. >> --- >> drivers/net/ethernet/intel/ice/ice_base.h | 2 + >> drivers/net/ethernet/intel/ice/ice_lib.h | 1 + >> drivers/net/ethernet/intel/ice/ice_base.c | 63 ++++++++++++--- >> drivers/net/ethernet/intel/ice/ice_lib.c | 94 ++++++++++++++++++++--- >> drivers/net/ethernet/intel/ice/ice_main.c | 5 +- >> 5 files changed, 143 insertions(+), 22 deletions(-) >> >> diff --git a/drivers/net/ethernet/intel/ice/ice_base.h >> b/drivers/net/ethernet/intel/ice/ice_base.h >> index d28294247599..99b2c7232829 100644 >> --- a/drivers/net/ethernet/intel/ice/ice_base.h >> +++ b/drivers/net/ethernet/intel/ice/ice_base.h >> @@ -12,8 +12,10 @@ int __ice_vsi_get_qs(struct ice_qs_cfg *qs_cfg); >> int ice_vsi_ctrl_one_rx_ring(struct ice_vsi *vsi, bool ena, u16 >> rxq_idx, bool wait); int ice_vsi_wait_one_rx_ring(struct ice_vsi >> *vsi, bool ena, u16 rxq_idx); >> +int ice_vsi_alloc_q_vectors_locked(struct ice_vsi *vsi); >> int ice_vsi_alloc_q_vectors(struct ice_vsi *vsi); void >> ice_vsi_map_rings_to_vectors(struct ice_vsi *vsi); >> +void ice_vsi_free_q_vectors_locked(struct ice_vsi *vsi); >> void ice_vsi_free_q_vectors(struct ice_vsi *vsi); int >> ice_vsi_cfg_single_txq(struct ice_vsi *vsi, struct ice_tx_ring >> **tx_rings, >> u16 q_idx); >> diff --git a/drivers/net/ethernet/intel/ice/ice_lib.h >> b/drivers/net/ethernet/intel/ice/ice_lib.h >> index 347b63e497e7..e55b72db72c4 100644 >> --- a/drivers/net/ethernet/intel/ice/ice_lib.h >> +++ b/drivers/net/ethernet/intel/ice/ice_lib.h >> @@ -68,6 +68,7 @@ int ice_ena_vsi(struct ice_vsi *vsi, bool locked); >> void ice_vsi_decfg(struct ice_vsi *vsi); void ice_dis_vsi(struct >> ice_vsi *vsi, bool locked); >> >> +int ice_vsi_rebuild_locked(struct ice_vsi *vsi, u32 vsi_flags); >> int ice_vsi_rebuild(struct ice_vsi *vsi, u32 vsi_flags); int >> ice_vsi_cfg(struct ice_vsi *vsi); struct ice_vsi >> *ice_vsi_alloc(struct ice_pf *pf); diff --git >> a/drivers/net/ethernet/intel/ice/ice_base.c >> b/drivers/net/ethernet/intel/ice/ice_base.c >> index 7097324c38f3..65e19815bec5 100644 >> --- a/drivers/net/ethernet/intel/ice/ice_base.c >> +++ b/drivers/net/ethernet/intel/ice/ice_base.c >> @@ -153,8 +153,8 @@ static int ice_vsi_alloc_q_vector(struct ice_vsi >> *vsi, u16 v_idx) >> * handler here (i.e. resume, reset/rebuild, etc.) >> */ >> if (vsi->netdev) >> - netif_napi_add_config(vsi->netdev, &q_vector->napi, >> - ice_napi_poll, v_idx); >> + netif_napi_add_config_locked(vsi->netdev, &q_vector- >>> napi, >> + ice_napi_poll, v_idx); > If you converted ice_vsi_alloc_q_vector() into _locked, should it be > lockdep_assert_held(&vsi->netdev->lock); then? IIRC the core kernel functions check for this and warn already. > > Everything else looks fine. > Reviewed-by: Aleksandr Loktionov <[email protected]> Thanks, Olek
