Message ID | 20230417113200.152404-1-kamil.maziarz@intel.com |
---|---|
State | Changes Requested |
Headers | show |
Series | [net,v1] ice: Fix ice VF reset during iavf initialization | expand |
On 4/17/2023 4:32 AM, Kamil Maziarz wrote: > From: Dawid Wesierski <dawidx.wesierski@intel.com> > > Fix the current implementation that causes ice_trigger_vf_reset() > to start resetting the VF even when the VF is still resetting itself > and initializing adminq. This leads to a series of -53 errors > (failed to init adminq) from the IAVF. > > Change the state of the vf_state field to be not active when the IAVF > asks for a reset. To avoid issues caused by the VF being reset too > early, make sure to wait until receiving the message on the message > box to know the exact state of the IAVF driver. > > Fixes: 109aba47ca9b ("ice: introduce ice_vf_lib.c, ice_vf_lib.h, and ice_vf_lib_private.h") This commit seems to just move stuff around. Is this really the offending commit? I believe Jake suggested c54d209c78b8 ("ice: Wait for VF to be reset/ready before configuration"). > Signed-off-by: Dawid Wesierski <dawidx.wesierski@intel.com> > Signed-off-by: Kamil Maziarz <kamil.maziarz@intel.com> > Acked-by: Jacob Keller <Jacob.e.keller@intel.com> > --- ... > diff --git a/drivers/net/ethernet/intel/ice/ice_vf_lib.c b/drivers/net/ethernet/intel/ice/ice_vf_lib.c > index 0e57bd1b85fd..f206293a8cf1 100644 > --- a/drivers/net/ethernet/intel/ice/ice_vf_lib.c > +++ b/drivers/net/ethernet/intel/ice/ice_vf_lib.c > @@ -185,6 +185,26 @@ int ice_check_vf_ready_for_cfg(struct ice_vf *vf) > return 0; > } > > +/** > + * ice_check_vf_ready_for_reset - check if VF is ready to be reseted > + * @vf: VF to check if it's ready to be reseted WARNING: 'reseted' may be misspelled - perhaps 'reset'? > + * > + * The purpose of this function is to ensure that the VF is not in reset, > + * disabled, and is both initialized and active, thus enabling us to safely > + * initialize another reset. > + */ > +int ice_check_vf_ready_for_reset(struct ice_vf *vf) > +{ > + int ret; > + > + ret = ice_check_vf_ready_for_cfg(vf); > + > + if (!ret && !test_bit(ICE_VF_STATE_ACTIVE, vf->vf_states)) No space between function call and error check please. > + ret = -EAGAIN; > + > + return ret; > +} > + > /** > * ice_trigger_vf_reset - Reset a VF on HW > * @vf: pointer to the VF structure > diff --git a/drivers/net/ethernet/intel/ice/ice_vf_lib.h b/drivers/net/ethernet/intel/ice/ice_vf_lib.h > index ef30f05b5d02..3fc6a0a8d955 100644 > --- a/drivers/net/ethernet/intel/ice/ice_vf_lib.h > +++ b/drivers/net/ethernet/intel/ice/ice_vf_lib.h > @@ -215,6 +215,7 @@ u16 ice_get_num_vfs(struct ice_pf *pf); > struct ice_vsi *ice_get_vf_vsi(struct ice_vf *vf); > bool ice_is_vf_disabled(struct ice_vf *vf); > int ice_check_vf_ready_for_cfg(struct ice_vf *vf); > +int ice_check_vf_ready_for_reset(struct ice_vf *vf); > void ice_set_vf_state_dis(struct ice_vf *vf); > bool ice_is_any_vf_in_unicast_promisc(struct ice_pf *pf); > void > diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl.c b/drivers/net/ethernet/intel/ice/ice_virtchnl.c > index e24e3f5017ca..d8c66baf4eb4 100644 > --- a/drivers/net/ethernet/intel/ice/ice_virtchnl.c > +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl.c > @@ -3908,6 +3908,7 @@ void ice_vc_process_vf_msg(struct ice_pf *pf, struct ice_rq_event_info *event) > ice_vc_notify_vf_link_state(vf); > break; > case VIRTCHNL_OP_RESET_VF: > + clear_bit(ICE_VF_STATE_ACTIVE, vf->vf_states); > ops->reset_vf(vf); > break; > case VIRTCHNL_OP_ADD_ETH_ADDR:
On 4/17/2023 10:56 AM, Tony Nguyen wrote: > On 4/17/2023 4:32 AM, Kamil Maziarz wrote: >> From: Dawid Wesierski <dawidx.wesierski@intel.com> >> >> Fix the current implementation that causes ice_trigger_vf_reset() >> to start resetting the VF even when the VF is still resetting itself >> and initializing adminq. This leads to a series of -53 errors >> (failed to init adminq) from the IAVF. >> >> Change the state of the vf_state field to be not active when the IAVF >> asks for a reset. To avoid issues caused by the VF being reset too >> early, make sure to wait until receiving the message on the message >> box to know the exact state of the IAVF driver. >> >> Fixes: 109aba47ca9b ("ice: introduce ice_vf_lib.c, ice_vf_lib.h, and ice_vf_lib_private.h") > > This commit seems to just move stuff around. Is this really the > offending commit? I believe Jake suggested c54d209c78b8 ("ice: Wait for > VF to be reset/ready before configuration"). Yes I am pretty sure the fixes tag is wrong because that commit just moves code out of the ice_pf_virtchnl.c file into ice_vf_lib.c The offending code still existed and I think the one we mentioned here is more accurate. Thanks, Jake
diff --git a/drivers/net/ethernet/intel/ice/ice_sriov.c b/drivers/net/ethernet/intel/ice/ice_sriov.c index 0cc05e54a781..d4206db7d6d5 100644 --- a/drivers/net/ethernet/intel/ice/ice_sriov.c +++ b/drivers/net/ethernet/intel/ice/ice_sriov.c @@ -1181,7 +1181,7 @@ int ice_set_vf_spoofchk(struct net_device *netdev, int vf_id, bool ena) if (!vf) return -EINVAL; - ret = ice_check_vf_ready_for_cfg(vf); + ret = ice_check_vf_ready_for_reset(vf); if (ret) goto out_put_vf; @@ -1296,7 +1296,7 @@ int ice_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac) goto out_put_vf; } - ret = ice_check_vf_ready_for_cfg(vf); + ret = ice_check_vf_ready_for_reset(vf); if (ret) goto out_put_vf; @@ -1350,7 +1350,7 @@ int ice_set_vf_trust(struct net_device *netdev, int vf_id, bool trusted) return -EOPNOTSUPP; } - ret = ice_check_vf_ready_for_cfg(vf); + ret = ice_check_vf_ready_for_reset(vf); if (ret) goto out_put_vf; @@ -1663,7 +1663,7 @@ ice_set_vf_port_vlan(struct net_device *netdev, int vf_id, u16 vlan_id, u8 qos, if (!vf) return -EINVAL; - ret = ice_check_vf_ready_for_cfg(vf); + ret = ice_check_vf_ready_for_reset(vf); if (ret) goto out_put_vf; diff --git a/drivers/net/ethernet/intel/ice/ice_vf_lib.c b/drivers/net/ethernet/intel/ice/ice_vf_lib.c index 0e57bd1b85fd..f206293a8cf1 100644 --- a/drivers/net/ethernet/intel/ice/ice_vf_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_vf_lib.c @@ -185,6 +185,26 @@ int ice_check_vf_ready_for_cfg(struct ice_vf *vf) return 0; } +/** + * ice_check_vf_ready_for_reset - check if VF is ready to be reseted + * @vf: VF to check if it's ready to be reseted + * + * The purpose of this function is to ensure that the VF is not in reset, + * disabled, and is both initialized and active, thus enabling us to safely + * initialize another reset. + */ +int ice_check_vf_ready_for_reset(struct ice_vf *vf) +{ + int ret; + + ret = ice_check_vf_ready_for_cfg(vf); + + if (!ret && !test_bit(ICE_VF_STATE_ACTIVE, vf->vf_states)) + ret = -EAGAIN; + + return ret; +} + /** * ice_trigger_vf_reset - Reset a VF on HW * @vf: pointer to the VF structure diff --git a/drivers/net/ethernet/intel/ice/ice_vf_lib.h b/drivers/net/ethernet/intel/ice/ice_vf_lib.h index ef30f05b5d02..3fc6a0a8d955 100644 --- a/drivers/net/ethernet/intel/ice/ice_vf_lib.h +++ b/drivers/net/ethernet/intel/ice/ice_vf_lib.h @@ -215,6 +215,7 @@ u16 ice_get_num_vfs(struct ice_pf *pf); struct ice_vsi *ice_get_vf_vsi(struct ice_vf *vf); bool ice_is_vf_disabled(struct ice_vf *vf); int ice_check_vf_ready_for_cfg(struct ice_vf *vf); +int ice_check_vf_ready_for_reset(struct ice_vf *vf); void ice_set_vf_state_dis(struct ice_vf *vf); bool ice_is_any_vf_in_unicast_promisc(struct ice_pf *pf); void diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl.c b/drivers/net/ethernet/intel/ice/ice_virtchnl.c index e24e3f5017ca..d8c66baf4eb4 100644 --- a/drivers/net/ethernet/intel/ice/ice_virtchnl.c +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl.c @@ -3908,6 +3908,7 @@ void ice_vc_process_vf_msg(struct ice_pf *pf, struct ice_rq_event_info *event) ice_vc_notify_vf_link_state(vf); break; case VIRTCHNL_OP_RESET_VF: + clear_bit(ICE_VF_STATE_ACTIVE, vf->vf_states); ops->reset_vf(vf); break; case VIRTCHNL_OP_ADD_ETH_ADDR: