From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id DF05FA04A7; Tue, 25 Jan 2022 10:45:07 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D1DC74287D; Tue, 25 Jan 2022 10:45:07 +0100 (CET) Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2064.outbound.protection.outlook.com [40.107.93.64]) by mails.dpdk.org (Postfix) with ESMTP id DEA6140E0F; Mon, 24 Jan 2022 13:48:34 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CdZiQJaTLE8CqktIMR9Y0BCZTmXN5Jr0EFNf8CUhfj9dBJ7CLLnAnrhwzVoLV1eRaHWmyxNko5+KihryV9ewB9V4Gme4+MG2VM9fHz4Thx90TXQBcKlCQ6CmCgoUzMB8DXAmDzMy0HHNu0ZKOKTR+gs7PHwqu+3sHPSfLS8eTguqI9GGs+Z8tsZLevViK1p7LHpdhBFQNgj+se1y5GN5VhX5B/jWYC/LOBDCztBRhdw8ONpnhED0gpPJ+PT6kZwQksYhk1cAybnByFgoeF5PvGcv0I6WwFLWGMLx9AI8X4oRvAPOfIsRf0vsxuxI3QOfHVRNe6icsWiV9RZsMfGdnw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=N+ECcsSTO2hqoqxYh2iP//QR8zFmMHff8ozisPdqqpA=; b=VcEuRSS/Z0fQxudNBWGbzig0iqMP3XqBs7yTOsY7nWIEIYKBnip8IvcH1JRFt3TaOOvkBhzyjEeT4HbXP0MxRvIRF+HYaUvGvK8AwqkbBm7vLcNqAYLT/Rn6UnOSo2lhXkRH787psnqYzWiHz1h4x/XoKS7oecg6aysS3tLHuRT+4Ft0jb5d2q+1/j6V+iLNo3Nyue7VcE+xpBreq0u98yLb8/XAuGeuukrTeMucFWr6Aaz9r9S57UqZ00nTwCluLl1cw9KYSSCxImkX1DtVFRY0vDjycUyhk9pX1gBpvIn0WckU4nCGaI/5fPhzeY0/qihJiaIFO10wUyoI3rL7Xw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vmware.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=N+ECcsSTO2hqoqxYh2iP//QR8zFmMHff8ozisPdqqpA=; b=v37SiJ6mx8XxawQ4wrC/2mXFgAHUBQ/PHULWuJPsE3nnaOhTlAV0AgBaPgPPsKMgWrtQJ6E4SX8Lg3trcjNVDIlyvoSdU25s5sWvKN0enrjAn3KS7Sof2EzCkzqJX9F4W+B3eIODZez/KdPy4G21ScD+/4f6g9AK98AzJxtttxw= Received: from SN6PR05MB4895.namprd05.prod.outlook.com (2603:10b6:805:9c::25) by PH0PR05MB8701.namprd05.prod.outlook.com (2603:10b6:510:b1::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4930.4; Mon, 24 Jan 2022 12:48:32 +0000 Received: from SN6PR05MB4895.namprd05.prod.outlook.com ([fe80::11a4:1d7e:b8c9:7aa9]) by SN6PR05MB4895.namprd05.prod.outlook.com ([fe80::11a4:1d7e:b8c9:7aa9%4]) with mapi id 15.20.4930.014; Mon, 24 Jan 2022 12:48:32 +0000 From: Kumara Parameshwaran To: Ferruh Yigit , Kumara Parameshwaran , "dev@dpdk.org" CC: "stable@dpdk.org" Subject: Re: [PATCH v2] net/tap: fix to populate fds in secondary process Thread-Topic: [PATCH v2] net/tap: fix to populate fds in secondary process Thread-Index: AQHYERu8kFLqh84nSUC3nZMPxLcK1KxyG2mAgAADVVw= Date: Mon, 24 Jan 2022 12:48:32 +0000 Message-ID: References: <20220121042944.23929-1-kumaraparamesh92@gmail.com> <20220124121251.64762-1-kumaraparamesh92@gmail.com> In-Reply-To: Accept-Language: en-GB, en-US Content-Language: en-GB X-MS-Has-Attach: X-MS-TNEF-Correlator: suggested_attachment_session_id: d4417baa-9564-719f-c784-48f0f175c8f9 authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=vmware.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: e0bb3d0d-f148-4afb-c7c4-08d9df37d3fb x-ms-traffictypediagnostic: PH0PR05MB8701:EE_ x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:2201; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: jOuCIX6qYpqacFj5MvXA/wE8Tr4kkASnv/4Jsf0bj7RSsv93J4Uqf/XltVPKy3juIBDmbHIz5CEObbC7oWd546VGMfCZVraydXg+DWWxEDcxyxVR3aLPtmfAh6yOfL5QJNfJDvkHQ47MxesS1sMSUNtLhssYvxNg/bq3v0pguhTxzJfCRrk84BcwRr9LNYKD5VB/HiW/Lh51Mogcvet8PLVsZ6Viq7OtnCVbVEX33ZVbaFY7LvqgIY08Nq6uNVYTDX8LBvjdgH7gBfoe9B0BlWccKiGbbEAfP4CsSMAx+Q5or9Qg1oo3t4K3kqoNEVFatvq+g5FxBkCZkGcDilQSAmAl2F/4s6QnyeTUh7u84JOTcmc/uCbQQ/l/awh7HAAp7dxx3O/wXenMhGczRw3ZdDJ9MV4ZWn3iKQ5UYzjSU0xpdq8MRTeFPDjg3WDRyUziPfqrKMxK38NIizKvmGAWYrRMyiPEaS3i1rMSFSxRf3lMLKknuA4978ssWKHx/OyRJSSdjtKXwfwP6/kK1RadoDBASDBFcFM8y+XcV0cl/C8j1lQ/xcEkjHluYLcL4zJIWoRx9hPv3qGJrUzFACMlha7RJiwMVQ6otjM3kjT+pLkUyDqN7V8FbTlx6DRwONkU5N1UqnBKrIkts7TLJRCwkpfBMkTdHO8XIA7QHlrZvUkgbrXV/ECmsyPznBGS4e+rot0prMB/aRzKJj15cLqFfdjPekYiCwbM4rl1gadpK6gjD1/Cj0nZX10XhGYyy2eN x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SN6PR05MB4895.namprd05.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230001)(4636009)(366004)(33656002)(55016003)(83380400001)(19627405001)(186003)(26005)(122000001)(2906002)(38100700002)(30864003)(71200400001)(316002)(508600001)(9686003)(86362001)(52536014)(5660300002)(91956017)(110136005)(66556008)(66446008)(76116006)(66476007)(7696005)(6506007)(38070700005)(64756008)(8936002)(8676002)(4326008)(55236004)(53546011)(66946007)(20210929001); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?gQrcLwgQkIESHsc4Txk6P11B24qkMoY1M22UntLYdjPyOYBklAPaCNeSSc?= =?iso-8859-1?Q?A5t0kLipS+7XyAc5Z1B4mBrhV60OXmfjPseaXhnu8kuMpK0Ydui8sHnNdG?= =?iso-8859-1?Q?28LqSjavd/5zF9/XR9Cvrfl7OqFRsv88IZVXMg1WTNm+AC4w4G7TxpKqvf?= =?iso-8859-1?Q?WfxmylH9tyCMNcCFQo+h+fob2SOVnz3KkhACm0ED1RrsQ2vhPUNKzEj3EF?= =?iso-8859-1?Q?g7HYL/UdQrCKb7tx8Ac/zhcltDs5ppKl3k/S9d8pDvpwfiLqzDQV/SjI+P?= =?iso-8859-1?Q?ipdq9Fu3tz1bw42Cy/Ejr5hhMrt79S/nEUdAO2vX1I0GNPW+LDhbDRSBLv?= =?iso-8859-1?Q?neIbahw5VVqJ9Ao2jDl3BgadU25sYXQCSr8UE19ZrhhJ2QV64JJgwfawEM?= =?iso-8859-1?Q?43hP+z5Y4WhIy1S+wrqpZZp6ItW5TO9dsp1+vNr7wPAGGDcvzqotu8RF8R?= =?iso-8859-1?Q?Nhe9QVq67/o9vwbp8CQ1OQaZ66Y6wWW1nlZ3IZbRWJhhdh/9abnmmXtdbd?= =?iso-8859-1?Q?cHwCgFKJ0KaOu+159+BAuilgJIINsdAVVJcZ/cfwtiq1skcQ88jWoMAkqK?= =?iso-8859-1?Q?8++SRfp6HVEyGku3bugyLiGW/XCOy6jNJJlR0FuGK06m/0/X8wVAvM+gP9?= =?iso-8859-1?Q?p15eZO5uEtic8Gjpy16spsXANFORZf87JQlTf2ubZnx4wwedjlZrkij06n?= =?iso-8859-1?Q?ZzijcHdbX8Qlhaer+T5MoF/8y7ilCbqcKMxRKCuxvkIWwlpb6ZUs8Ajjau?= =?iso-8859-1?Q?ytHByD4UUT795U16cTwCaBawDpO1qlaWGwNSuZHF/Lw88oO7v0ZVO/Bqi1?= =?iso-8859-1?Q?Gi259ig7fIYU1aOfocIbmuIS8pLVTkOFHdFG6DkEuf6m7zYO7PYXamDzRn?= =?iso-8859-1?Q?vo5IK2583rdaN8almpoCwKgVmI6w+MhViKlgRb6pZJc8eel2kbHVM8STOf?= =?iso-8859-1?Q?MVI4XcD5JW1KvijthOHO8Hj0eChlIS2VYr98e383xmUma832oODiccv7Lq?= =?iso-8859-1?Q?Bt0Bg5ZVqdXUeGItA1YcpM5l1CerBK3QCTqOy2WO8rfbXZatm/0KN/il+U?= =?iso-8859-1?Q?mUCI5ALFPgI3+XdCaX5+tXvhEyNg/8fP+3mM7P7iomS0CVKqu3V2sgvQfD?= =?iso-8859-1?Q?KXRFEEls+1Q7QGozELHHANaykbDVhe5sDThlqx+p52wMh1OE+oy99xF081?= =?iso-8859-1?Q?sAZcwWhEAjjajPDW16onlOXaH+SenogehsfoX/arT3NuIK2jtGcZGNKvOa?= =?iso-8859-1?Q?aW4tSyLqsM24sOrBvTGproAGGemJxeH1KZD7m4Y+v7BTwVpxyT3RrqmZeC?= =?iso-8859-1?Q?dx0+PrWNjD2QxVRXOm6J0/9jXiuXj8XaZ/8LO08RHz4APCbrJOV96JeL7F?= =?iso-8859-1?Q?HOLwyBRL/UZGaK7AHvkd2x/lPfo2DWJ0ET5RmeBdSv/ngbjxY6Vs9bUZCa?= =?iso-8859-1?Q?yRkmHBXBgfQhE2uxuZqJF53XW4N7eMlpafxufMPcDl5PfEOolj889eAu4t?= =?iso-8859-1?Q?Ltf5t+bDDcV1iRn65tsXCXW1rfN7GwH7wVzrfkV2GzCHP+VKKOtP7O3diJ?= =?iso-8859-1?Q?3UqQBvTPchN+dBjnFq+DLLobQP9k+u9OQ2Ouy7xrlBsbEKzX/Qoty9oQgN?= =?iso-8859-1?Q?4zPdaVL4PncIx6J+o50J1WrKoC9vrz9vMhYvQwyWGJui8mcFsRMAk92g?= =?iso-8859-1?Q?=3D=3D?= Content-Type: multipart/alternative; boundary="_000_SN6PR05MB4895913ED649E152EC96422EB15E9SN6PR05MB4895namp_" MIME-Version: 1.0 X-OriginatorOrg: vmware.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SN6PR05MB4895.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: e0bb3d0d-f148-4afb-c7c4-08d9df37d3fb X-MS-Exchange-CrossTenant-originalarrivaltime: 24 Jan 2022 12:48:32.1074 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: b39138ca-3cee-4b4a-a4d6-cd83d9dd62f0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: eqa07T1SrjyadfaiMTmxDEkl9NIZUDQZzYNPMC4gPxC1ZP0RydKZzrtkVO+Jl+5AtBA/G1EOKhUfG4N8fsqrVw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR05MB8701 X-Mailman-Approved-At: Tue, 25 Jan 2022 10:45:07 +0100 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org --_000_SN6PR05MB4895913ED649E152EC96422EB15E9SN6PR05MB4895namp_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable ________________________________ From: Ferruh Yigit Sent: 24 January 2022 18:05 To: Kumara Parameshwaran ; dev@dpdk.org Cc: Kumara Parameshwaran ; stable@dpdk.org Subject: Re: [PATCH v2] net/tap: fix to populate fds in secondary process On 1/24/2022 12:12 PM, Kumara Parameshwaran wrote: > From: Kumara Parameshwaran > > When a tap device is hotplugged to primary process which in turn > adds the device to all secondary process, the secondary process > does a tap_mp_attach_queues, but the fds are not populated in > the primary during the probe they are populated during the queue_setup, > added a fix to sync the queues during rte_eth_dev_start > > Fixes: 4852aa8f6e21 ("drivers/net: enable hotplug on secondary process") > Cc: stable@dpdk.org > > Signed-off-by: Kumara Parameshwaran > --- > > v2: > * Addressed review comments to move the function declaration and version > map > Thanks for adding patch version. > drivers/net/tap/rte_eth_tap.c | 196 +++++++++++++--------------------- > lib/ethdev/ethdev_driver.h | 17 +++ > lib/ethdev/rte_ethdev.c | 11 ++ > lib/ethdev/version.map | 2 + > 4 files changed, 102 insertions(+), 124 deletions(-) > Can you please separate etdev (API) changes to another patch, so this will = be a patchset with two patches, first patch adds ethdev API second patch is tap patch, that uses the API in the first patch Sure, will do it. > diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.= c > index f1b48cae82..f6c25d7e21 100644 > --- a/drivers/net/tap/rte_eth_tap.c > +++ b/drivers/net/tap/rte_eth_tap.c > @@ -66,7 +66,7 @@ > (TAP_GSO_MBUFS_PER_CORE * TAP_GSO_MBUF_CACHE_SIZE) > > /* IPC key for queue fds sync */ > -#define TAP_MP_KEY "tap_mp_sync_queues" > +#define TAP_MP_REQ_START_RXTX "tap_mp_req_start_rxtx" > We said we can drop "tap_mp_sync_queues", but thinking twice, will current implementation cover following usecase: - Primary applicaiton started with tap interface, all config, setup, start done - Secondary app started without any parameter Since primary already started, I think secondary fds will be wrong, what do you think? Yes, that is true. We should retain the current behaviour of start for the = attach. > #define TAP_IOV_DEFAULT_MAX 1024 > > @@ -880,11 +880,48 @@ tap_link_set_up(struct rte_eth_dev *dev) > return tap_ioctl(pmd, SIOCSIFFLAGS, &ifr, 1, LOCAL_AND_REMOTE); > } > > +static int tap_mp_req_on_rxtx(struct rte_eth_dev *dev) Can you please follow the coding convention: static int tap_mp_req_on_rxtx(struct rte_eth_dev *dev) { > +{ > + struct rte_mp_msg msg; > + struct ipc_queues *request_param =3D (struct ipc_queues *)msg.param= ; > + int err; > + int fd_iterator =3D 0; > + struct pmd_process_private *process_private =3D dev->process_privat= e; > + int i; > + > + memset(&msg, 0, sizeof(msg)); > + strlcpy(msg.name, TAP_MP_REQ_START_RXTX, sizeof(msg.name)); > + strlcpy(request_param->port_name, dev->data->name, sizeof(request_p= aram->port_name)); > + msg.len_param =3D sizeof(*request_param); > + for (i =3D 0; i < dev->data->nb_tx_queues; i++) { > + msg.fds[fd_iterator++] =3D process_private->txq_fds[i]; > + msg.num_fds++; > + request_param->txq_count++; > + } > + for (i =3D 0; i < dev->data->nb_rx_queues; i++) { > + msg.fds[fd_iterator++] =3D process_private->rxq_fds[i]; > + msg.num_fds++; > + request_param->rxq_count++; > + } > + > + err =3D rte_mp_sendmsg(&msg); > + if (err < 0) { > + TAP_LOG(ERR, "Failed to send start req to secondary %d", > + rte_errno); > + return -1; > + } > + > + return 0; > +} > + > static int > tap_dev_start(struct rte_eth_dev *dev) > { > int err, i; > > + if (rte_eal_process_type() =3D=3D RTE_PROC_PRIMARY) > + tap_mp_req_on_rxtx(dev); > + > err =3D tap_intr_handle_set(dev, 1); > if (err) > return err; > @@ -901,6 +938,34 @@ tap_dev_start(struct rte_eth_dev *dev) > return err; > } > > +static int > +tap_mp_req_start_rxtx(const struct rte_mp_msg *request, __rte_unused con= st void *peer) > +{ I asked last time but I don't remember the response, what should be in the 'peer' variable? > + struct rte_eth_dev *dev; > + const struct ipc_queues *request_param =3D > + (const struct ipc_queues *)request->param; > + int fd_iterator; > + int queue; > + struct pmd_process_private *process_private; > + > + dev =3D rte_get_eth_dev_by_name(request_param->port_name); > + if (!dev) { > + TAP_LOG(ERR, "Failed to get dev for %s", > + request_param->port_name); > + return -1; > + } > + process_private =3D dev->process_private; > + fd_iterator =3D 0; > + TAP_LOG(DEBUG, "tap_attach rx_q:%d tx_q:%d\n", request_param->rxq_c= ount, > + request_param->txq_count); > + for (queue =3D 0; queue < request_param->txq_count; queue++) > + process_private->txq_fds[queue] =3D request->fds[fd_iterato= r++]; > + for (queue =3D 0; queue < request_param->rxq_count; queue++) > + process_private->rxq_fds[queue] =3D request->fds[fd_iterato= r++]; > + > + return 0; > +} > + > /* This function gets called when the current port gets stopped. > */ > static int > @@ -1084,6 +1149,7 @@ tap_dev_close(struct rte_eth_dev *dev) > > if (rte_eal_process_type() !=3D RTE_PROC_PRIMARY) { > rte_free(dev->process_private); > + rte_mp_action_unregister(TAP_MP_REQ_START_RXTX); > return 0; > } > > @@ -1140,8 +1206,6 @@ tap_dev_close(struct rte_eth_dev *dev) > internals->ioctl_sock =3D -1; > } > rte_free(dev->process_private); > - if (tap_devices_count =3D=3D 1) > - rte_mp_action_unregister(TAP_MP_KEY); > tap_devices_count--; > /* > * Since TUN device has no more opened file descriptors > @@ -2292,113 +2356,6 @@ rte_pmd_tun_probe(struct rte_vdev_device *dev) > return ret; > } > > -/* Request queue file descriptors from secondary to primary. */ > -static int > -tap_mp_attach_queues(const char *port_name, struct rte_eth_dev *dev) > -{ > - int ret; > - struct timespec timeout =3D {.tv_sec =3D 1, .tv_nsec =3D 0}; > - struct rte_mp_msg request, *reply; > - struct rte_mp_reply replies; > - struct ipc_queues *request_param =3D (struct ipc_queues *)request.p= aram; > - struct ipc_queues *reply_param; > - struct pmd_process_private *process_private =3D dev->process_privat= e; > - int queue, fd_iterator; > - > - /* Prepare the request */ > - memset(&request, 0, sizeof(request)); > - strlcpy(request.name, TAP_MP_KEY, sizeof(request.name)); > - strlcpy(request_param->port_name, port_name, > - sizeof(request_param->port_name)); > - request.len_param =3D sizeof(*request_param); > - /* Send request and receive reply */ > - ret =3D rte_mp_request_sync(&request, &replies, &timeout); > - if (ret < 0 || replies.nb_received !=3D 1) { > - TAP_LOG(ERR, "Failed to request queues from primary: %d", > - rte_errno); > - return -1; > - } > - reply =3D &replies.msgs[0]; > - reply_param =3D (struct ipc_queues *)reply->param; > - TAP_LOG(DEBUG, "Received IPC reply for %s", reply_param->port_name)= ; > - > - /* Attach the queues from received file descriptors */ > - if (reply_param->rxq_count + reply_param->txq_count !=3D reply->num= _fds) { > - TAP_LOG(ERR, "Unexpected number of fds received"); > - return -1; > - } > - > - dev->data->nb_rx_queues =3D reply_param->rxq_count; > - dev->data->nb_tx_queues =3D reply_param->txq_count; > - fd_iterator =3D 0; > - for (queue =3D 0; queue < reply_param->rxq_count; queue++) > - process_private->rxq_fds[queue] =3D reply->fds[fd_iterator+= +]; > - for (queue =3D 0; queue < reply_param->txq_count; queue++) > - process_private->txq_fds[queue] =3D reply->fds[fd_iterator+= +]; > - free(reply); > - return 0; > -} > - > -/* Send the queue file descriptors from the primary process to secondary= . */ > -static int > -tap_mp_sync_queues(const struct rte_mp_msg *request, const void *peer) > -{ > - struct rte_eth_dev *dev; > - struct pmd_process_private *process_private; > - struct rte_mp_msg reply; > - const struct ipc_queues *request_param =3D > - (const struct ipc_queues *)request->param; > - struct ipc_queues *reply_param =3D > - (struct ipc_queues *)reply.param; > - uint16_t port_id; > - int queue; > - int ret; > - > - /* Get requested port */ > - TAP_LOG(DEBUG, "Received IPC request for %s", request_param->port_n= ame); > - ret =3D rte_eth_dev_get_port_by_name(request_param->port_name, &por= t_id); > - if (ret) { > - TAP_LOG(ERR, "Failed to get port id for %s", > - request_param->port_name); > - return -1; > - } > - dev =3D &rte_eth_devices[port_id]; > - process_private =3D dev->process_private; > - > - /* Fill file descriptors for all queues */ > - reply.num_fds =3D 0; > - reply_param->rxq_count =3D 0; > - if (dev->data->nb_rx_queues + dev->data->nb_tx_queues > > - RTE_MP_MAX_FD_NUM){ > - TAP_LOG(ERR, "Number of rx/tx queues exceeds max number of = fds"); > - return -1; > - } > - > - for (queue =3D 0; queue < dev->data->nb_rx_queues; queue++) { > - reply.fds[reply.num_fds++] =3D process_private->rxq_fds[que= ue]; > - reply_param->rxq_count++; > - } > - RTE_ASSERT(reply_param->rxq_count =3D=3D dev->data->nb_rx_queues); > - > - reply_param->txq_count =3D 0; > - for (queue =3D 0; queue < dev->data->nb_tx_queues; queue++) { > - reply.fds[reply.num_fds++] =3D process_private->txq_fds[que= ue]; > - reply_param->txq_count++; > - } > - RTE_ASSERT(reply_param->txq_count =3D=3D dev->data->nb_tx_queues); > - > - /* Send reply */ > - strlcpy(reply.name, request->name, sizeof(reply.name)); > - strlcpy(reply_param->port_name, request_param->port_name, > - sizeof(reply_param->port_name)); > - reply.len_param =3D sizeof(*reply_param); > - if (rte_mp_reply(&reply, peer) < 0) { > - TAP_LOG(ERR, "Failed to reply an IPC request to sync queues= "); > - return -1; > - } > - return 0; > -} > - > /* Open a TAP interface device. > */ > static int > @@ -2442,9 +2399,11 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev) > return -1; > } > > - ret =3D tap_mp_attach_queues(name, eth_dev); > - if (ret !=3D 0) > - return -1; > + ret =3D rte_mp_action_register(TAP_MP_REQ_START_RXTX, tap_m= p_req_start_rxtx); > + if (ret < 0 && rte_errno !=3D ENOTSUP) > + TAP_LOG(ERR, "tap: Failed to register IPC callback:= %s", > + strerror(rte_errno)); > + > rte_eth_dev_probing_finish(eth_dev); > return 0; > } > @@ -2492,15 +2451,6 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev) > > TAP_LOG(DEBUG, "Initializing pmd_tap for %s", name); > > - /* Register IPC feed callback */ > - if (!tap_devices_count) { > - ret =3D rte_mp_action_register(TAP_MP_KEY, tap_mp_sync_queu= es); > - if (ret < 0 && rte_errno !=3D ENOTSUP) { > - TAP_LOG(ERR, "tap: Failed to register IPC callback:= %s", > - strerror(rte_errno)); > - goto leave; > - } > - } > tap_devices_count++; > tap_devices_count_increased =3D 1; > ret =3D eth_dev_tap_create(dev, tap_name, remote_iface, &user_mac, > @@ -2511,8 +2461,6 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev) > TAP_LOG(ERR, "Failed to create pmd for %s as %s", > name, tap_name); > if (tap_devices_count_increased =3D=3D 1) { > - if (tap_devices_count =3D=3D 1) > - rte_mp_action_unregister(TAP_MP_KEY); > tap_devices_count--; > } > } > diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h > index d95605a355..a08991bcdf 100644 > --- a/lib/ethdev/ethdev_driver.h > +++ b/lib/ethdev/ethdev_driver.h > @@ -1629,6 +1629,23 @@ rte_eth_hairpin_queue_peer_bind(uint16_t cur_port,= uint16_t cur_queue, > struct rte_hairpin_peer_info *peer_info, > uint32_t direction); > > +/** Please add '@internal' tag into doxygen comment. > +* Get rte_eth_dev from device name. The device name should be specified > +* as below: > +* - PCIe address (Domain:Bus:Device.Function), for example- 0000:2:00.0 > +* - SoC device name, for example- fsl-gmac0 > +* - vdev dpdk name, for example- net_[pcap0|null0|tap0] > +* > +* @param name > +* pci address or name of the device > +* @return > +* - rte_eth_dev if successful > +* - NULL on failure > +*/ > +__rte_internal > +struct rte_eth_dev* > +rte_get_eth_dev_by_name(const char *name); As the API name, better to start with 'rte_eth_' prefix to be consistent wi= th rest of the APIs. I suggest 'rte_eth_dev_get_by_name' but feel free to chose better one. > + > /** > * @internal > * Reset the current queue state and configuration to disconnect (unbin= d) it > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c > index a1d475a292..9192b0d664 100644 > --- a/lib/ethdev/rte_ethdev.c > +++ b/lib/ethdev/rte_ethdev.c > @@ -894,6 +894,17 @@ rte_eth_dev_get_port_by_name(const char *name, uint1= 6_t *port_id) > return -ENODEV; > } > > +struct rte_eth_dev * > +rte_get_eth_dev_by_name(const char *name) > +{ > + uint16_t pid; > + > + if (rte_eth_dev_get_port_by_name(name, &pid)) > + return NULL; > + > + return &rte_eth_devices[pid]; > +} > + > static int > eth_err(uint16_t port_id, int ret) > { > diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map > index c2fb0669a4..7e3797189b 100644 > --- a/lib/ethdev/version.map > +++ b/lib/ethdev/version.map > @@ -256,6 +256,7 @@ EXPERIMENTAL { > rte_flow_flex_item_create; > rte_flow_flex_item_release; > rte_flow_pick_transfer_proxy; > + This is unintendent change. > }; > > INTERNAL { > @@ -282,4 +283,5 @@ INTERNAL { > rte_eth_representor_id_get; > rte_eth_switch_domain_alloc; > rte_eth_switch_domain_free; > + rte_get_eth_dev_by_name; Please add in a sorted way. > }; --_000_SN6PR05MB4895913ED649E152EC96422EB15E9SN6PR05MB4895namp_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable



From: Ferruh Yigit <ferr= uh.yigit@intel.com>
Sent: 24 January 2022 18:05
To: Kumara Parameshwaran <kumaraparamesh92@gmail.com>; dev@dpd= k.org <dev@dpdk.org>
Cc: Kumara Parameshwaran <kparameshwar@vmware.com>; stable@dpd= k.org <stable@dpdk.org>
Subject: Re: [PATCH v2] net/tap: fix to populate fds in secondary pr= ocess
 
On 1/24/2022 12:12 PM, Kumara Parameshwaran wrote:=
> From: Kumara Parameshwaran <kparameshwar@vmware.com>
>
> When a tap device is hotplugged to primary process which in turn
> adds the device to all secondary process, the secondary process
> does a tap_mp_attach_queues, but the fds are not populated in
> the primary during the probe they are populated during the queue_setup= ,
> added a fix to sync the queues during rte_eth_dev_start
>
> Fixes: 4852aa8f6e21 ("drivers/net: enable hotplug on secondary pr= ocess")
> Cc: stable@dpdk.org
>
> Signed-off-by: Kumara Parameshwaran <kparameshwar@vmware.com> > ---
>
> v2:
> * Addressed review comments to move the function declaration and versi= on
>    map
>

Thanks for adding patch version.

>   drivers/net/tap/rte_eth_tap.c | 196 +++++++++++++---------= ------------
>   lib/ethdev/ethdev_driver.h    |  17 ++= +
>   lib/ethdev/rte_ethdev.c      = ; |  11 ++
>   lib/ethdev/version.map      =   |   2 +
>   4 files changed, 102 insertions(+), 124 deletions(-)
>

Can you please separate etdev (API) changes to another patch, so this will = be a patchset
with two patches,
first patch adds ethdev API
second patch is tap patch, that uses the API in the first patch

Sure, will do it. 

> diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_t= ap.c
> index f1b48cae82..f6c25d7e21 100644
> --- a/drivers/net/tap/rte_eth_tap.c
> +++ b/drivers/net/tap/rte_eth_tap.c
> @@ -66,7 +66,7 @@
>        (TAP_GSO_MBUFS_PER_CORE * TA= P_GSO_MBUF_CACHE_SIZE)
>  
>   /* IPC key for queue fds sync */
> -#define TAP_MP_KEY "tap_mp_sync_queues"
> +#define TAP_MP_REQ_START_RXTX "tap_mp_req_start_rxtx"
>

We said we can drop "tap_mp_sync_queues", but thinking twice,
will current implementation cover following usecase:

- Primary applicaiton started with tap interface, all config, setup,
   start done
- Secondary app started without any parameter

Since primary already started, I think secondary fds will be wrong,
what do you think?
Yes, that is true. We should retain the current be= haviour of start for the attach. 

>   #define TAP_IOV_DEFAULT_MAX 1024
>  
> @@ -880,11 +880,48 @@ tap_link_set_up(struct rte_eth_dev *dev)
>        return tap_ioctl(pmd, SIOCSI= FFLAGS, &ifr, 1, LOCAL_AND_REMOTE);
>   }
>  
> +static int tap_mp_req_on_rxtx(struct rte_eth_dev *dev)

Can you please follow the coding convention:

static int
tap_mp_req_on_rxtx(struct rte_eth_dev *dev)
{

> +{
> +     struct rte_mp_msg msg;
> +     struct ipc_queues *request_param =3D (struct= ipc_queues *)msg.param;
> +     int err;
> +     int fd_iterator =3D 0;
> +     struct pmd_process_private *process_private = =3D dev->process_private;
> +     int i;
> +
> +     memset(&msg, 0, sizeof(msg));
> +     strlcpy(msg.name, TAP_MP_REQ_START_RXTX, siz= eof(msg.name));
> +     strlcpy(request_param->port_name, dev->= ;data->name, sizeof(request_param->port_name));
> +     msg.len_param =3D sizeof(*request_param); > +     for (i =3D 0; i < dev->data->nb_tx_= queues; i++) {
> +           &nb= sp; msg.fds[fd_iterator++] =3D process_private->txq_fds[i];
> +           &nb= sp; msg.num_fds++;
> +           &nb= sp; request_param->txq_count++;
> +     }
> +     for (i =3D 0; i < dev->data->nb_rx_= queues; i++) {
> +           &nb= sp; msg.fds[fd_iterator++] =3D process_private->rxq_fds[i];
> +           &nb= sp; msg.num_fds++;
> +           &nb= sp; request_param->rxq_count++;
> +     }
> +
> +     err =3D rte_mp_sendmsg(&msg);
> +     if (err < 0) {
> +           &nb= sp; TAP_LOG(ERR, "Failed to send start req to secondary %d",
> +           &nb= sp;         rte_errno);
> +           &nb= sp; return -1;
> +     }
> +
> +     return 0;
> +}
> +
>   static int
>   tap_dev_start(struct rte_eth_dev *dev)
>   {
>        int err, i;
>  
> +     if (rte_eal_process_type() =3D=3D RTE_PROC_P= RIMARY)
> +           &nb= sp; tap_mp_req_on_rxtx(dev);
> +
>        err =3D tap_intr_handle_set(= dev, 1);
>        if (err)
>            = ;    return err;
> @@ -901,6 +938,34 @@ tap_dev_start(struct rte_eth_dev *dev)
>        return err;
>   }
>  
> +static int
> +tap_mp_req_start_rxtx(const struct rte_mp_msg *request, __rte_unused = const void *peer)
> +{

I asked last time but I don't remember the response,
what should be in the 'peer' variable?

> +     struct rte_eth_dev *dev;
> +     const struct ipc_queues *request_param =3D > +           &nb= sp; (const struct ipc_queues *)request->param;
> +     int fd_iterator;
> +     int queue;
> +     struct pmd_process_private *process_private;=
> +
> +     dev =3D rte_get_eth_dev_by_name(request_para= m->port_name);
> +     if (!dev) {
> +           &nb= sp; TAP_LOG(ERR, "Failed to get dev for %s",
> +           &nb= sp;         request_param->port_= name);
> +           &nb= sp; return -1;
> +     }
> +     process_private =3D dev->process_private;=
> +     fd_iterator =3D 0;
> +     TAP_LOG(DEBUG, "tap_attach rx_q:%d tx_q= :%d\n", request_param->rxq_count,
> +           &nb= sp; request_param->txq_count);
> +     for (queue =3D 0; queue < request_param-&= gt;txq_count; queue++)
> +           &nb= sp; process_private->txq_fds[queue] =3D request->fds[fd_iterator++];<= br> > +     for (queue =3D 0; queue < request_param-&= gt;rxq_count; queue++)
> +           &nb= sp; process_private->rxq_fds[queue] =3D request->fds[fd_iterator++];<= br> > +
> +     return 0;
> +}
> +
>   /* This function gets called when the current port gets st= opped.
>    */
>   static int
> @@ -1084,6 +1149,7 @@ tap_dev_close(struct rte_eth_dev *dev)
>  
>        if (rte_eal_process_type() != =3D RTE_PROC_PRIMARY) {
>            = ;    rte_free(dev->process_private);
> +           &nb= sp; rte_mp_action_unregister(TAP_MP_REQ_START_RXTX);
>            = ;    return 0;
>        }
>  
> @@ -1140,8 +1206,6 @@ tap_dev_close(struct rte_eth_dev *dev)
>            = ;    internals->ioctl_sock =3D -1;
>        }
>        rte_free(dev->process_pri= vate);
> -     if (tap_devices_count =3D=3D 1)
> -           &nb= sp; rte_mp_action_unregister(TAP_MP_KEY);
>        tap_devices_count--;
>        /*
>         * Since TUN device has= no more opened file descriptors
> @@ -2292,113 +2356,6 @@ rte_pmd_tun_probe(struct rte_vdev_device *dev)=
>        return ret;
>   }
>  
> -/* Request queue file descriptors from secondary to primary. */
> -static int
> -tap_mp_attach_queues(const char *port_name, struct rte_eth_dev *dev)<= br> > -{
> -     int ret;
> -     struct timespec timeout =3D {.tv_sec =3D 1, = .tv_nsec =3D 0};
> -     struct rte_mp_msg request, *reply;
> -     struct rte_mp_reply replies;
> -     struct ipc_queues *request_param =3D (struct= ipc_queues *)request.param;
> -     struct ipc_queues *reply_param;
> -     struct pmd_process_private *process_private = =3D dev->process_private;
> -     int queue, fd_iterator;
> -
> -     /* Prepare the request */
> -     memset(&request, 0, sizeof(request)); > -     strlcpy(request.name, TAP_MP_KEY, sizeof(req= uest.name));
> -     strlcpy(request_param->port_name, port_na= me,
> -           &nb= sp; sizeof(request_param->port_name));
> -     request.len_param =3D sizeof(*request_param)= ;
> -     /* Send request and receive reply */
> -     ret =3D rte_mp_request_sync(&request, &a= mp;replies, &timeout);
> -     if (ret < 0 || replies.nb_received !=3D 1= ) {
> -           &nb= sp; TAP_LOG(ERR, "Failed to request queues from primary: %d",
> -           &nb= sp;         rte_errno);
> -           &nb= sp; return -1;
> -     }
> -     reply =3D &replies.msgs[0];
> -     reply_param =3D (struct ipc_queues *)reply-&= gt;param;
> -     TAP_LOG(DEBUG, "Received IPC reply for = %s", reply_param->port_name);
> -
> -     /* Attach the queues from received file desc= riptors */
> -     if (reply_param->rxq_count + reply_param-= >txq_count !=3D reply->num_fds) {
> -           &nb= sp; TAP_LOG(ERR, "Unexpected number of fds received");
> -           &nb= sp; return -1;
> -     }
> -
> -     dev->data->nb_rx_queues =3D reply_para= m->rxq_count;
> -     dev->data->nb_tx_queues =3D reply_para= m->txq_count;
> -     fd_iterator =3D 0;
> -     for (queue =3D 0; queue < reply_param->= ;rxq_count; queue++)
> -           &nb= sp; process_private->rxq_fds[queue] =3D reply->fds[fd_iterator++]; > -     for (queue =3D 0; queue < reply_param->= ;txq_count; queue++)
> -           &nb= sp; process_private->txq_fds[queue] =3D reply->fds[fd_iterator++]; > -     free(reply);
> -     return 0;
> -}
> -
> -/* Send the queue file descriptors from the primary process to second= ary. */
> -static int
> -tap_mp_sync_queues(const struct rte_mp_msg *request, const void *peer= )
> -{
> -     struct rte_eth_dev *dev;
> -     struct pmd_process_private *process_private;=
> -     struct rte_mp_msg reply;
> -     const struct ipc_queues *request_param =3D > -           &nb= sp; (const struct ipc_queues *)request->param;
> -     struct ipc_queues *reply_param =3D
> -           &nb= sp; (struct ipc_queues *)reply.param;
> -     uint16_t port_id;
> -     int queue;
> -     int ret;
> -
> -     /* Get requested port */
> -     TAP_LOG(DEBUG, "Received IPC request fo= r %s", request_param->port_name);
> -     ret =3D rte_eth_dev_get_port_by_name(request= _param->port_name, &port_id);
> -     if (ret) {
> -           &nb= sp; TAP_LOG(ERR, "Failed to get port id for %s",
> -           &nb= sp;         request_param->port_= name);
> -           &nb= sp; return -1;
> -     }
> -     dev =3D &rte_eth_devices[port_id];
> -     process_private =3D dev->process_private;=
> -
> -     /* Fill file descriptors for all queues */ > -     reply.num_fds =3D 0;
> -     reply_param->rxq_count =3D 0;
> -     if (dev->data->nb_rx_queues + dev->= data->nb_tx_queues >
> -           &nb= sp;         RTE_MP_MAX_FD_NUM){
> -           &nb= sp; TAP_LOG(ERR, "Number of rx/tx queues exceeds max number of fds&quo= t;);
> -           &nb= sp; return -1;
> -     }
> -
> -     for (queue =3D 0; queue < dev->data-&g= t;nb_rx_queues; queue++) {
> -           &nb= sp; reply.fds[reply.num_fds++] =3D process_private->rxq_fds[queue];
> -           &nb= sp; reply_param->rxq_count++;
> -     }
> -     RTE_ASSERT(reply_param->rxq_count =3D=3D = dev->data->nb_rx_queues);
> -
> -     reply_param->txq_count =3D 0;
> -     for (queue =3D 0; queue < dev->data-&g= t;nb_tx_queues; queue++) {
> -           &nb= sp; reply.fds[reply.num_fds++] =3D process_private->txq_fds[queue];
> -           &nb= sp; reply_param->txq_count++;
> -     }
> -     RTE_ASSERT(reply_param->txq_count =3D=3D = dev->data->nb_tx_queues);
> -
> -     /* Send reply */
> -     strlcpy(reply.name, request->name, sizeof= (reply.name));
> -     strlcpy(reply_param->port_name, request_p= aram->port_name,
> -           &nb= sp; sizeof(reply_param->port_name));
> -     reply.len_param =3D sizeof(*reply_param); > -     if (rte_mp_reply(&reply, peer) < 0) {=
> -           &nb= sp; TAP_LOG(ERR, "Failed to reply an IPC request to sync queues")= ;
> -           &nb= sp; return -1;
> -     }
> -     return 0;
> -}
> -
>   /* Open a TAP interface device.
>    */
>   static int
> @@ -2442,9 +2399,11 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev)<= br> >            = ;            return = -1;
>            = ;    }
>  
> -           &nb= sp; ret =3D tap_mp_attach_queues(name, eth_dev);
> -           &nb= sp; if (ret !=3D 0)
> -           &nb= sp;         return -1;
> +           &nb= sp; ret =3D rte_mp_action_register(TAP_MP_REQ_START_RXTX, tap_mp_req_start_= rxtx);
> +           &nb= sp; if (ret < 0 && rte_errno !=3D ENOTSUP)
> +           &nb= sp;         TAP_LOG(ERR, "tap:= Failed to register IPC callback: %s",
> +           &nb= sp;            =      strerror(rte_errno));
> +
>            = ;    rte_eth_dev_probing_finish(eth_dev);
>            = ;    return 0;
>        }
> @@ -2492,15 +2451,6 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev)<= br> >  
>        TAP_LOG(DEBUG, "Initial= izing pmd_tap for %s", name);
>  
> -     /* Register IPC feed callback */
> -     if (!tap_devices_count) {
> -           &nb= sp; ret =3D rte_mp_action_register(TAP_MP_KEY, tap_mp_sync_queues);
> -           &nb= sp; if (ret < 0 && rte_errno !=3D ENOTSUP) {
> -           &nb= sp;         TAP_LOG(ERR, "tap:= Failed to register IPC callback: %s",
> -           &nb= sp;            =      strerror(rte_errno));
> -           &nb= sp;         goto leave;
> -           &nb= sp; }
> -     }
>        tap_devices_count++;
>        tap_devices_count_increased = =3D 1;
>        ret =3D eth_dev_tap_create(d= ev, tap_name, remote_iface, &user_mac,
> @@ -2511,8 +2461,6 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev) >            = ;    TAP_LOG(ERR, "Failed to create pmd for %s as %s&qu= ot;,
>            = ;            name, t= ap_name);
>            = ;    if (tap_devices_count_increased =3D=3D 1) {
> -           &nb= sp;         if (tap_devices_count = =3D=3D 1)
> -           &nb= sp;            =      rte_mp_action_unregister(TAP_MP_KEY);
>            = ;            tap_dev= ices_count--;
>            = ;    }
>        }
> diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h > index d95605a355..a08991bcdf 100644
> --- a/lib/ethdev/ethdev_driver.h
> +++ b/lib/ethdev/ethdev_driver.h
> @@ -1629,6 +1629,23 @@ rte_eth_hairpin_queue_peer_bind(uint16_t cur_po= rt, uint16_t cur_queue,
>            = ;            &n= bsp;       struct rte_hairpin_peer_info *peer= _info,
>            = ;            &n= bsp;       uint32_t direction);
>  
> +/**

Please add '@internal' tag into doxygen comment.

> +* Get rte_eth_dev from device name. The device name should be specifi= ed
> +* as below:
> +* - PCIe address (Domain:Bus:Device.Function), for example- 0000:2:00= .0
> +* - SoC device name, for example- fsl-gmac0
> +* - vdev dpdk name, for example- net_[pcap0|null0|tap0]
> +*
> +* @param name
> +*  pci address or name of the device
> +* @return
> +*   - rte_eth_dev if successful
> +*   - NULL on failure
> +*/
> +__rte_internal
> +struct rte_eth_dev*
> +rte_get_eth_dev_by_name(const char *name);

As the API name, better to start with 'rte_eth_' prefix to be consistent wi= th
rest of the APIs.
I suggest 'rte_eth_dev_get_by_name' but feel free to chose better one.

> +
>   /**
>    * @internal
>    * Reset the current queue state and configuration to= disconnect (unbind) it
> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
> index a1d475a292..9192b0d664 100644
> --- a/lib/ethdev/rte_ethdev.c
> +++ b/lib/ethdev/rte_ethdev.c
> @@ -894,6 +894,17 @@ rte_eth_dev_get_port_by_name(const char *name, ui= nt16_t *port_id)
>        return -ENODEV;
>   }
>  
> +struct rte_eth_dev *
> +rte_get_eth_dev_by_name(const char *name)
> +{
> +     uint16_t pid;
> +
> +     if (rte_eth_dev_get_port_by_name(name, &= pid))
> +           &nb= sp; return NULL;
> +
> +     return &rte_eth_devices[pid];
> +}
> +
>   static int
>   eth_err(uint16_t port_id, int ret)
>   {
> diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
> index c2fb0669a4..7e3797189b 100644
> --- a/lib/ethdev/version.map
> +++ b/lib/ethdev/version.map
> @@ -256,6 +256,7 @@ EXPERIMENTAL {
>        rte_flow_flex_item_create; >        rte_flow_flex_item_release;<= br> >        rte_flow_pick_transfer_proxy= ;
> +

This is unintendent change.

>   };
>  
>   INTERNAL {
> @@ -282,4 +283,5 @@ INTERNAL {
>        rte_eth_representor_id_get;<= br> >        rte_eth_switch_domain_alloc;=
>        rte_eth_switch_domain_free;<= br> > +     rte_get_eth_dev_by_name;

Please add in a sorted way.

>   };

--_000_SN6PR05MB4895913ED649E152EC96422EB15E9SN6PR05MB4895namp_--