Message ID | 20190802082533.23083-4-anthony.l.nguyen@intel.com |
---|---|
State | Accepted |
Delegated to: | Jeff Kirsher |
Headers | show |
Series | [S26,01/15] ice: add support for enabling/disabling single queues | expand |
> -----Original Message----- > From: Intel-wired-lan [mailto:intel-wired-lan-bounces@osuosl.org] On > Behalf Of Tony Nguyen > Sent: Friday, August 2, 2019 1:25 AM > To: intel-wired-lan@lists.osuosl.org > Subject: [Intel-wired-lan] [PATCH S26 04/15] ice: Fix VF configuration issues > due to reset > > From: Akeem G Abodunrin <akeem.g.abodunrin@intel.com> > > This patch fixes a critical reset issue that resulting to the server reboot when > an Admin changes VF configuration on the host, for example changing VF to > Trusted/non_Trusted mode, the PF driver send reset notification to AVF > driver while also continue with reset flow. However, AVF driver schedule > another reset due to notification, which causes two concurrent reset going > on, and trigger lock up in the FW, with AQ call to delete VSI. > > Signed-off-by: Akeem G Abodunrin <akeem.g.abodunrin@intel.com> > --- > drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c index 78fd3fa8ac8b..b93324e9f4bc 100644 --- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c @@ -1152,12 +1152,19 @@ static bool ice_reset_vf(struct ice_vf *vf, bool is_vflr) u32 reg; int i; - /* If the VFs have been disabled, this means something else is - * resetting the VF, so we shouldn't continue. + /* If the PF has been disabled, there is no need resetting VF until + * PF is active again. */ if (test_bit(__ICE_VF_DIS, pf->state)) return false; + /* If the VF has been disabled, this means something else is + * resetting the VF, so we shouldn't continue. Otherwise, set + * disable VF state bit for actual reset, and continue. + */ + if (test_and_set_bit(ICE_VF_STATE_DIS, vf->vf_states)) + return false; + ice_trigger_vf_reset(vf, is_vflr); vsi = pf->vsi[vf->lan_vsi_idx];