diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice.h')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice.h | 14 | 
1 files changed, 5 insertions, 9 deletions
| diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h index b0e29e342401..e809249500e1 100644 --- a/drivers/net/ethernet/intel/ice/ice.h +++ b/drivers/net/ethernet/intel/ice/ice.h @@ -509,6 +509,7 @@ enum ice_pf_flags {  	ICE_FLAG_VF_VLAN_PRUNING,  	ICE_FLAG_LINK_LENIENT_MODE_ENA,  	ICE_FLAG_PLUG_AUX_DEV, +	ICE_FLAG_UNPLUG_AUX_DEV,  	ICE_FLAG_MTU_CHANGED,  	ICE_FLAG_GNSS,			/* GNSS successfully initialized */  	ICE_PF_FLAGS_NBITS		/* must be last */ @@ -955,16 +956,11 @@ static inline void ice_set_rdma_cap(struct ice_pf *pf)   */  static inline void ice_clear_rdma_cap(struct ice_pf *pf)  { -	/* We can directly unplug aux device here only if the flag bit -	 * ICE_FLAG_PLUG_AUX_DEV is not set because ice_unplug_aux_dev() -	 * could race with ice_plug_aux_dev() called from -	 * ice_service_task(). In this case we only clear that bit now and -	 * aux device will be unplugged later once ice_plug_aux_device() -	 * called from ice_service_task() finishes (see ice_service_task()). +	/* defer unplug to service task to avoid RTNL lock and +	 * clear PLUG bit so that pending plugs don't interfere  	 */ -	if (!test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags)) -		ice_unplug_aux_dev(pf); - +	clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags); +	set_bit(ICE_FLAG_UNPLUG_AUX_DEV, pf->flags);  	clear_bit(ICE_FLAG_RDMA_ENA, pf->flags);  }  #endif /* _ICE_H_ */ |