From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id AB0B92BA1 for ; 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" To: "Tao, Zhe" , "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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 > #include > +#include >=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