> -----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?
Everything else looks fine. Reviewed-by: Aleksandr Loktionov <[email protected]> ... > -- > 2.52.0
