[Intel-wired-lan] [PATCH S23 v3 04/15] ice: Restructure VFs initialization flows

Abodunrin, Akeem G akeem.g.abodunrin at intel.com
Thu Jul 25 00:51:54 UTC 2019



> -----Original Message-----
> From: Allan, Bruce W
> Sent: Wednesday, July 24, 2019 5:47 PM
> To: Nguyen, Anthony L <anthony.l.nguyen at intel.com>; intel-wired-
> lan at lists.osuosl.org
> Cc: Abodunrin, Akeem G <akeem.g.abodunrin at intel.com>
> Subject: RE: [Intel-wired-lan] [PATCH S23 v3 04/15] ice: Restructure VFs
> initialization flows
> 
> > -----Original Message-----
> > From: Intel-wired-lan [mailto:intel-wired-lan-bounces at osuosl.org] On
> > Behalf Of Tony Nguyen
> > Sent: Tuesday, July 23, 2019 2:25 AM
> > To: intel-wired-lan at lists.osuosl.org
> > Cc: Abodunrin, Akeem G <akeem.g.abodunrin at intel.com>
> > Subject: [Intel-wired-lan] [PATCH S23 v3 04/15] ice: Restructure VFs
> > initialization flows
> >
> > From: Akeem G Abodunrin <akeem.g.abodunrin at intel.com>
> >
> > This patch restructures how VFs are configured, and resources allocated.
> > Instead of freeing resources that were never allocated, and resetting
> > empty VFs that have never been created - the new flow will just
> > allocate resources for number of requested VFs based on the availability.
> >
> > During VFs initialization process, global interrupt is disabled, and
> > rearmed after getting MSIX vectors for VFs. This allows immediate
> > mailbox communications, instead of delaying it till later and VFs.
> > PF communications resulted to using polling instead of actual interrupt.
> > The issue manifested when creating higher number of VFs (128 VFs) per PF.
> >
> > Signed-off-by: Akeem G Abodunrin <akeem.g.abodunrin at intel.com>
> > ---
> >  drivers/net/ethernet/intel/ice/ice.h          |  1 +
> >  .../net/ethernet/intel/ice/ice_virtchnl_pf.c  | 70
> > +++++++++++++------
> >  2 files changed, 49 insertions(+), 22 deletions(-)
> >
> > diff --git a/drivers/net/ethernet/intel/ice/ice.h
> > b/drivers/net/ethernet/intel/ice/ice.h
> > index 07950ac4869f..112bdb662ea2 100644
> > --- a/drivers/net/ethernet/intel/ice/ice.h
> > +++ b/drivers/net/ethernet/intel/ice/ice.h
> > @@ -220,6 +220,7 @@ enum ice_state {
> >  	__ICE_CFG_BUSY,
> >  	__ICE_SERVICE_SCHED,
> >  	__ICE_SERVICE_DIS,
> > +	__ICE_OICR_INTR_DIS,		/* Global OICR interrupt disabled */
> >  	__ICE_STATE_NBITS		/* must be last */
> >  };
> >
> > diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
> > b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
> > index ce01cbe70ea4..4d41877fa06e 100644
> > --- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
> > +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
> > @@ -974,6 +974,48 @@ ice_vf_set_vsi_promisc(struct ice_vf *vf, struct
> > ice_vsi *vsi, u8 promisc_m,
> >  	return status;
> >  }
> >
> > +/**
> > + * ice_config_res_vfs - Finalize allocation of VFs resources in one
> > +go
> > + * @pf: pointer to the PF structure
> > + *
> > + * This function is being called as last part of resetting all VFs,
> > +or when
> > + * configuring VFs for the first time, where there is no resource to
> > +be freed
> > + * Returns true if resources were properly allocated for all VFs, and
> > +false
> > + * otherwise.
> > + */
> > +static bool ice_config_res_vfs(struct ice_pf *pf) {
> > +	struct ice_hw *hw = &pf->hw;
> > +	struct ice_vf *vf;
> 
> The scope of vf can be reduced to the for() loop that uses it
I agree with that... Thanks Bruce!

> 
> > +	int v;
> > +
> > +	if (ice_check_avail_res(pf)) {
> > +		dev_err(&pf->pdev->dev,
> > +			"Cannot allocate VF resources, try with fewer
> number
> > of VFs\n");
> > +		return false;
> > +	}
> > +
> > +	/* rearm global interrupts */
> > +	if (test_and_clear_bit(__ICE_OICR_INTR_DIS, pf->state))
> > +		ice_irq_dynamic_ena(hw, NULL, NULL);
> > +
> > +	/* Finish resetting each VF and allocate resources */
> > +	for (v = 0; v < pf->num_alloc_vfs; v++) {
> > +		vf = &pf->vf[v];
> > +
> > +		vf->num_vf_qs = pf->num_vf_qps;
> > +		dev_dbg(&pf->pdev->dev,
> > +			"VF-id %d has %d queues configured\n",
> > +			vf->vf_id, vf->num_vf_qs);
> > +		ice_cleanup_and_realloc_vf(vf);
> > +	}
> > +
> > +	ice_flush(hw);
> > +	clear_bit(__ICE_VF_DIS, pf->state);
> > +
> > +	return true;
> > +}
> > +
> >  /**
> >   * ice_reset_all_vfs - reset all allocated VFs in one go
> >   * @pf: pointer to the PF structure
> > @@ -1066,25 +1108,8 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool
> > is_vflr)
> >  		dev_err(&pf->pdev->dev,
> >  			"Failed to free MSIX resources used by SR-IOV\n");
> >
> > -	if (ice_check_avail_res(pf)) {
> > -		dev_err(&pf->pdev->dev,
> > -			"Cannot allocate VF resources, try with fewer
> number
> > of VFs\n");
> > +	if (!ice_config_res_vfs(pf))
> >  		return false;
> > -	}
> > -
> > -	/* Finish the reset on each VF */
> > -	for (v = 0; v < pf->num_alloc_vfs; v++) {
> > -		vf = &pf->vf[v];
> > -
> > -		vf->num_vf_qs = pf->num_vf_qps;
> > -		dev_dbg(&pf->pdev->dev,
> > -			"VF-id %d has %d queues configured\n",
> > -			vf->vf_id, vf->num_vf_qs);
> > -		ice_cleanup_and_realloc_vf(vf);
> > -	}
> > -
> > -	ice_flush(hw);
> > -	clear_bit(__ICE_VF_DIS, pf->state);
> >
> >  	return true;
> >  }
> > @@ -1249,7 +1274,7 @@ static int ice_alloc_vfs(struct ice_pf *pf, u16
> > num_alloc_vfs)
> >  	/* Disable global interrupt 0 so we don't try to handle the VFLR. */
> >  	wr32(hw, GLINT_DYN_CTL(pf->oicr_idx),
> >  	     ICE_ITR_NONE << GLINT_DYN_CTL_ITR_INDX_S);
> > -
> > +	set_bit(__ICE_OICR_INTR_DIS, pf->state);
> >  	ice_flush(hw);
> >
> >  	ret = pci_enable_sriov(pf->pdev, num_alloc_vfs); @@ -1278,13
> > +1303,13 @@ static int ice_alloc_vfs(struct ice_pf *pf, u16
> > num_alloc_vfs)
> >  	}
> >  	pf->num_alloc_vfs = num_alloc_vfs;
> >
> > -	/* VF resources get allocated during reset */
> > -	if (!ice_reset_all_vfs(pf, true)) {
> > +	/* VF resources get allocated with initialization */
> > +	if (!ice_config_res_vfs(pf)) {
> >  		ret = -EIO;
> >  		goto err_unroll_sriov;
> >  	}
> >
> > -	goto err_unroll_intr;
> > +	return ret;
> >
> >  err_unroll_sriov:
> >  	pf->vf = NULL;
> > @@ -1296,6 +1321,7 @@ static int ice_alloc_vfs(struct ice_pf *pf, u16
> > num_alloc_vfs)
> >  err_unroll_intr:
> >  	/* rearm interrupts here */
> >  	ice_irq_dynamic_ena(hw, NULL, NULL);
> > +	clear_bit(__ICE_OICR_INTR_DIS, pf->state);
> >  	return ret;
> >  }
> >
> > --
> > 2.20.1
> >
> > _______________________________________________
> > Intel-wired-lan mailing list
> > Intel-wired-lan at osuosl.org
> > https://lists.osuosl.org/mailman/listinfo/intel-wired-lan


More information about the Intel-wired-lan mailing list