From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <jingjing.wu@intel.com>
Received: from mga09.intel.com (mga09.intel.com [134.134.136.24])
 by dpdk.org (Postfix) with ESMTP id AB0B92BA1
 for <dev@dpdk.org>; Thu, 25 Feb 2016 02:15:35 +0100 (CET)
Received: from orsmga001.jf.intel.com ([10.7.209.18])
 by orsmga102.jf.intel.com with ESMTP; 24 Feb 2016 17:15:35 -0800
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="5.22,496,1449561600"; d="scan'208";a="894109808"
Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204])
 by orsmga001.jf.intel.com with ESMTP; 24 Feb 2016 17:15:34 -0800
Received: from shsmsx152.ccr.corp.intel.com (10.239.6.52) by
 FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS)
 id 14.3.248.2; Wed, 24 Feb 2016 17:15:33 -0800
Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.132]) by
 SHSMSX152.ccr.corp.intel.com ([169.254.6.42]) with mapi id 14.03.0248.002;
 Thu, 25 Feb 2016 09:15:31 +0800
From: "Wu, Jingjing" <jingjing.wu@intel.com>
To: "Tao, Zhe" <zhe.tao@intel.com>, "dev@dpdk.org" <dev@dpdk.org>
Thread-Topic: [dpdk-dev][PATCH 2/2 v2] i40e: Add floating VEB support in i40e
Thread-Index: AQHRbhqOpm4/z+Cfq02i/Uv4vi3SXp878yhQ
Date: Thu, 25 Feb 2016 01:15:31 +0000
Message-ID: <9BB6961774997848B5B42BEC655768F8DC917A@SHSMSX104.ccr.corp.intel.com>
References: <1453361066-22755-2-git-send-email-zhe.tao@intel.com>
 <1456218796-15630-1-git-send-email-zhe.tao@intel.com>
 <1456218796-15630-3-git-send-email-zhe.tao@intel.com>
In-Reply-To: <1456218796-15630-3-git-send-email-zhe.tao@intel.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
x-originating-ip: [10.239.127.40]
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Subject: Re: [dpdk-dev] [PATCH 2/2 v2] i40e: Add floating VEB support in i40e
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: patches and discussions about DPDK <dev.dpdk.org>
List-Unsubscribe: <http://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <http://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Thu, 25 Feb 2016 01:15:36 -0000

>  	if (ret !=3D I40E_SUCCESS) {
>  		PMD_DRV_LOG(ERR, "Add veb failed, aq_err: %d", @@ -
> 3688,20 +3702,21 @@ i40e_vsi_release(struct i40e_vsi *vsi)
>  		i40e_veb_release(vsi->veb);
>  	}
>=20
> +	if (vsi->floating_veb) {
> +		TAILQ_FOREACH(vsi_list, &vsi->floating_veb->head, list) {
> +			if (i40e_vsi_release(vsi_list->vsi) !=3D I40E_SUCCESS)
> +				return -1;
> +			TAILQ_REMOVE(&vsi->floating_veb->head, vsi_list,
> list);
> +		}
> +		i40e_veb_release(vsi->floating_veb);
> +	}
> +
>  	/* Remove all macvlan filters of the VSI */
>  	i40e_vsi_remove_all_macvlan_filter(vsi);
>  	TAILQ_FOREACH(f, &vsi->mac_list, next)
>  		rte_free(f);
>=20
>  	if (vsi->type !=3D I40E_VSI_MAIN) {
> -		/* Remove vsi from parent's sibling list */
> -		if (vsi->parent_vsi =3D=3D NULL || vsi->parent_vsi->veb =3D=3D NULL)
> {
> -			PMD_DRV_LOG(ERR, "VSI's parent VSI is NULL");
> -			return I40E_ERR_PARAM;
> -		}
> -		TAILQ_REMOVE(&vsi->parent_vsi->veb->head,
> -				&vsi->sib_vsi_list, list);
Why do you think these line is unnecessary? We need to remove it from vsi l=
ist.
> -
>  		/* Remove all switch element of the VSI */
>  		ret =3D i40e_aq_delete_element(hw, vsi->seid, NULL);
>  		if (ret !=3D I40E_SUCCESS)
> @@ -3837,7 +3852,8 @@ i40e_vsi_setup(struct i40e_pf *pf,
>  	struct ether_addr broadcast =3D
>  		{.addr_bytes =3D {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}};
>=20
> -	if (type !=3D I40E_VSI_MAIN && uplink_vsi =3D=3D NULL) {
> +	if (type !=3D I40E_VSI_MAIN && type !=3D I40E_VSI_SRIOV &&
> +	    uplink_vsi =3D=3D NULL) {
>  		PMD_DRV_LOG(ERR, "VSI setup failed, "
>  			    "VSI link shouldn't be NULL");
>  		return NULL;
> @@ -3849,11 +3865,28 @@ i40e_vsi_setup(struct i40e_pf *pf,
>  		return NULL;
>  	}
>=20
> -	/* If uplink vsi didn't setup VEB, create one first */
> -	if (type !=3D I40E_VSI_MAIN && uplink_vsi->veb =3D=3D NULL) {
> +	/* two situations
> +	 * 1.type is not MAIN and uplink vsi is not NULL
> +	 * If uplink vsi didn't setup VEB, create one first under veb field
> +	 * 2.type is SRIOV and the uplink is NULL
> +	 * If floating VEB is NULL, create one veb under floating veb field
> +	 */
> +
> +	if (type !=3D I40E_VSI_MAIN && uplink_vsi !=3D NULL &&
> +	    uplink_vsi->veb =3D=3D NULL) {
>  		uplink_vsi->veb =3D i40e_veb_setup(pf, uplink_vsi);
>=20
> -		if (NULL =3D=3D uplink_vsi->veb) {
> +		if (uplink_vsi->veb =3D=3D NULL) {
> +			PMD_DRV_LOG(ERR, "VEB setup failed");
> +			return NULL;
> +		}
> +	}
> +
> +	if (type =3D=3D I40E_VSI_SRIOV && uplink_vsi =3D=3D NULL &&
> +	    pf->main_vsi->floating_veb =3D=3D NULL) {
> +		pf->main_vsi->floating_veb =3D i40e_veb_setup(pf, uplink_vsi);
> +
> +		if (pf->main_vsi->floating_veb =3D=3D NULL) {
>  			PMD_DRV_LOG(ERR, "VEB setup failed");
>  			return NULL;
>  		}
> @@ -4022,7 +4055,11 @@ i40e_vsi_setup(struct i40e_pf *pf,
>  		 * For other VSI, the uplink_seid equals to uplink VSI's
>  		 * uplink_seid since they share same VEB
>  		 */
> -		vsi->uplink_seid =3D uplink_vsi->uplink_seid;
> +		if (uplink_vsi =3D=3D NULL) {
> +			vsi->uplink_seid =3D pf->main_vsi->floating_veb->seid;
> +		} else {
> +			vsi->uplink_seid =3D uplink_vsi->uplink_seid;
> +		}
{} is not necessary.

>  		ctxt.pf_num =3D hw->pf_id;
>  		ctxt.vf_num =3D hw->func_caps.vf_base_id + user_param;
>  		ctxt.uplink_seid =3D vsi->uplink_seid;
> @@ -4130,8 +4167,13 @@ i40e_vsi_setup(struct i40e_pf *pf,
>  		vsi->seid =3D ctxt.seid;
>  		vsi->vsi_id =3D ctxt.vsi_number;
>  		vsi->sib_vsi_list.vsi =3D vsi;
> -		TAILQ_INSERT_TAIL(&uplink_vsi->veb->head,
> -				&vsi->sib_vsi_list, list);
> +		if (vsi->type =3D=3D I40E_VSI_SRIOV && uplink_vsi =3D=3D NULL) {
> +			TAILQ_INSERT_TAIL(&pf->main_vsi->floating_veb-
> >head,
> +					  &vsi->sib_vsi_list, list);
> +		} else {
> +			TAILQ_INSERT_TAIL(&uplink_vsi->veb->head,
> +					  &vsi->sib_vsi_list, list);
> +		}
>  	}
>=20
>  	/* MAC/VLAN configuration */
> diff --git a/drivers/net/i40e/i40e_ethdev.h
> b/drivers/net/i40e/i40e_ethdev.h index 6edd7dd..19246db 100644
> --- a/drivers/net/i40e/i40e_ethdev.h
> +++ b/drivers/net/i40e/i40e_ethdev.h
> @@ -36,6 +36,7 @@
>=20
>  #include <rte_eth_ctrl.h>
>  #include <rte_time.h>
> +#include <eal_internal_cfg.h>
>=20
>  #define I40E_VLAN_TAG_SIZE        4
>=20
> @@ -203,6 +204,7 @@ struct i40e_tx_queue;  struct i40e_veb {
>  	struct i40e_vsi_list_head head;
>  	struct i40e_vsi *associate_vsi; /* Associate VSI who owns the VEB */
> +	struct i40e_pf *associate_pf; /* Associate PF who owns the VEB */
>  	uint16_t seid; /* The seid of VEB itself */
>  	uint16_t uplink_seid; /* The uplink seid of this VEB */
>  	uint16_t stats_idx;
> @@ -254,6 +256,7 @@ struct i40e_vsi {
>  	struct i40e_vsi_list sib_vsi_list; /* sibling vsi list */
>  	struct i40e_vsi *parent_vsi;
>  	struct i40e_veb *veb;    /* Associated veb, could be null */
> +	struct i40e_veb *floating_veb; /* Associated floating veb */
>  	bool offset_loaded;
>  	enum i40e_vsi_type type; /* VSI types */
>  	uint16_t vlan_num;       /* Total VLAN number */
> diff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c inde=
x
> cbf4e5b..cc315f6 100644
> --- a/drivers/net/i40e/i40e_pf.c
> +++ b/drivers/net/i40e/i40e_pf.c
> @@ -223,9 +223,15 @@ i40e_pf_host_vf_reset(struct i40e_pf_vf *vf, bool
> do_hw_reset)
>  	vf->reset_cnt++;
>  	I40E_WRITE_FLUSH(hw);
>=20
> +	if (internal_config.floating =3D=3D true) {
> +		vf->vsi =3D i40e_vsi_setup(vf->pf, I40E_VSI_SRIOV,
> +			NULL, vf->vf_idx);
> +	} else {
>  	/* Allocate resource again */
> -	vf->vsi =3D i40e_vsi_setup(vf->pf, I40E_VSI_SRIOV,
> -			vf->pf->main_vsi, vf->vf_idx);
> +		vf->vsi =3D i40e_vsi_setup(vf->pf, I40E_VSI_SRIOV,
> +				vf->pf->main_vsi, vf->vf_idx);
> +	}
{} is not necessary. How about to check the NVM version?

Thanks
Jingjing