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 D68BBA0A02; Thu, 25 Mar 2021 10:24:30 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 56C0C4067B; Thu, 25 Mar 2021 10:24:30 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id 888B640147 for ; Thu, 25 Mar 2021 10:24:28 +0100 (CET) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 12P9AaL4002588; Thu, 25 Mar 2021 02:24:25 -0700 Received: from nam11-dm6-obe.outbound.protection.outlook.com (mail-dm6nam11lp2171.outbound.protection.outlook.com [104.47.57.171]) by mx0a-0016f401.pphosted.com with ESMTP id 37ft17nr1e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 25 Mar 2021 02:24:24 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EQ47lGwAPvX3eynZnSouBFuN2FhEmw8GPm2GFkqlta2F18pQL9o7JHTbL2nhkE/iXYtnsZbkdCOTN3zrEcFiEGnZVkcg6gYxXHiIcJXN6Gv9+aSa3RkF2xIHPP63tBkkKyK6kw1R9JTBYFLI3owiV9B3zqGKxS/pRehisnC7mVf6P57HmGLQlutEEx6oZNQ301cNdDGDKBg1xZ2PkmHLg2TO0Xmxb6bCAam5AV42zygxSmGq9jN0EvgMucg9lHojadLXQGNOc1vDonhhhhDBV7h5SD2/nBsqWDe7VvQpFAfRinrlfWhBdc21b+OOWjml+oNJ6ujsYpWSFF7eOllL1g== 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-SenderADCheck; bh=1MF4RwZqez4u0Z32DMAXLUNGTBRpd7+Mdj3hUTgQ0YE=; b=RQgkcKVFM+avxjxQJD+7SWgO3HwaY3/hO0F5o0uoHz9aBfjhmFCFLxVWK7pPzPaoy9qHcg67jr3oN/if5OD5mpUiuQPkkcc+XCsNdEJazaeGe5E6M+yn0jLh58EXuqAZFwn4ZyYMikCkfPSaK4PhcR3w93BTmAmgVsM/tcbf5jFi1mIGFBBrSkIygu0s7xOILEXZZRMhnEsrpOIvG7mm9h9PaNfg/hzMH9z0zJCJ6z/0ntKOif1UdbeYl7lQ0fkeDO9M2DyqQZJHjZyuKEGG+4xN3Km5jzf2Yl5lh/MtCmD52oAQM4jOGiQInPz6eXmsdlY3ttjUenay9HuC47oFxA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=marvell.com; dmarc=pass action=none header.from=marvell.com; dkim=pass header.d=marvell.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.onmicrosoft.com; s=selector1-marvell-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1MF4RwZqez4u0Z32DMAXLUNGTBRpd7+Mdj3hUTgQ0YE=; b=MUz3nZVLW/2UO+YZ6WlicxGxO5XzaMrMCac6g3iWaLlXOhFWszUEfQn2h66hG+pipdOhseng2/lvpoxgObUZuC6BYks8jIzB3JSK58BCCggFioW4t6zrr14YPZfF6ddu+vIwmK3Gb63rj43xyZgn7xpZLWk7CIZKaJY6IZgOmp8= Received: from PH0PR18MB4086.namprd18.prod.outlook.com (2603:10b6:510:3::9) by PH0PR18MB4024.namprd18.prod.outlook.com (2603:10b6:510:2c::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3977.26; Thu, 25 Mar 2021 09:24:21 +0000 Received: from PH0PR18MB4086.namprd18.prod.outlook.com ([fe80::51dd:b5d6:af81:172d]) by PH0PR18MB4086.namprd18.prod.outlook.com ([fe80::51dd:b5d6:af81:172d%4]) with mapi id 15.20.3955.024; Thu, 25 Mar 2021 09:24:21 +0000 From: Pavan Nikhilesh Bhagavatula To: "Jayatheerthan, Jay" , Jerin Jacob Kollanukkaran , "Carrillo, Erik G" , "Gujjar, Abhinandan S" , "McDaniel, Timothy" , "hemant.agrawal@nxp.com" , "Van Haaren, Harry" , mattias.ronnblom , "Ma, Liang J" , Ray Kinsella , Neil Horman CC: "dev@dpdk.org" Thread-Topic: [dpdk-dev] [PATCH v5 2/8] eventdev: introduce event vector Rx capability Thread-Index: AQHXIGtmY5DlNAp3qkuNMCh+7Wlr9KqUXVCAgAASqwA= Date: Thu, 25 Mar 2021 09:24:21 +0000 Message-ID: References: <20210319205718.1436-1-pbhagavatula@marvell.com> <20210324050525.4489-1-pbhagavatula@marvell.com> <20210324050525.4489-3-pbhagavatula@marvell.com> In-Reply-To: Accept-Language: en-IN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=marvell.com; x-originating-ip: [49.37.166.152] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: d3c521e3-d082-4c06-b4e3-08d8ef6fc5da x-ms-traffictypediagnostic: PH0PR18MB4024: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:2887; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: ukL7b2JRg6zmXv0Azt0lyPcx4MRIum1NHXTAmG+M+My4wOFytoPeSAbtkQT2TVYvkXIPgSpX6zufbtGsZmmZ11JoigRQ0bcDRzOyihwDoiZZiePWrZ490uPEuaSxgALwLQxFBgMmsNiWjkCoGe3KqhSPpGqvArrVfd1sO50e0abIwV1w4IfFgniukqglnVhYB9FNw2Yuh297/hpObFDDv6AMAsmS6Pzy7bYePR7tb0tWnYu0ry2SkEDyJy/w31f79RtmhlztoKGRpODY19P9IjoSUHeJ5Q/ExDnR/Z2tb8SHIdl5ch5bqHtjEac2iWshP7UBJ9jae5Q+BoxvxLzv+q/8AQYJY9c8cBKkcCscMdF4I0p5vsjHnz9vxgur+JDLM/v7e0TAPacwxxpPKVslCsra+vJH/6imH4c5BI5AbONsY661wnv9nal6SNalTXhaCvIHLQrb2QG1uCLs8vmc6tqmKZYkO6StWW5rqrH96djFQ0hdIxpcx9On0Grdii2Gg3hc1EloTfbCl9j4US+v//bLq9oV1tHxrpH9Zg+YllGxCO6Rxi8GY0HsnamszkOl/0u6X9I6fWwM8FRJ6gt+WtnbVpeAat+jr67YligQKgvhYrU//2YpwnzyFKa61oChupUUo4SPURbL27SjptiIXqgaVGzAcxypjaUA85uALI9IpfQ8srLvMWAtY40Plv6p x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PH0PR18MB4086.namprd18.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(346002)(39850400004)(376002)(396003)(136003)(76116006)(8676002)(38100700001)(86362001)(316002)(71200400001)(478600001)(4326008)(9686003)(52536014)(7416002)(30864003)(66946007)(6506007)(7696005)(2906002)(26005)(64756008)(55016002)(83380400001)(186003)(53546011)(5660300002)(8936002)(110136005)(66446008)(66476007)(33656002)(66556008)(921005)(579004); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata: =?us-ascii?Q?FBHxnnSh6RoPc3/wzOwIW97lJPjZLgb4NEuPEChqtCz57bO9Np+N/JrGRldd?= =?us-ascii?Q?bcLB3qiSOJTWvOBD0z2nAtGNA/Lk90Jdjbk6mzbsqCSvcI7ClrDhD77jCopE?= =?us-ascii?Q?Pkd90/RIT23BgGPh7QRFdydA+tUINWuKG91yUd9JYNXxLmvICH3mnmQc9OEb?= =?us-ascii?Q?1aWGVsjI6NYh+yi8zt+vHl+LvoKjIaYaXgk5aN/RUPorsbBRRjPCWeIzQrgt?= =?us-ascii?Q?jWw8ceadWEbkA2PzNrrE9BpB6+uJo76HotrxdSEJI1rLcC1WTj4nTVTAFAge?= =?us-ascii?Q?0osTzkdLyDm0IixcOkXjIEiQodEq/K4VLPbrEmp/A9MFqzlKp5DiBNpEUbzA?= =?us-ascii?Q?jbDRHGbobLePjpEzEffkNJHjA1x7RotrXJWVYHVRqDE9lqSEK6IOAFwB385I?= =?us-ascii?Q?1yr9oooUiL9U/DxBYckvx6KI4gWiafk94tYaANzG06i+Gft5pF7SawaQ8S63?= =?us-ascii?Q?YeYxp9fo9z53UIcLrf64I2/izpMx5kfTytySITak4TS+33vUL384GYAiCn/r?= =?us-ascii?Q?JLVCFj6ghlZL3pS9tuM0cNPjPxOXcNJY/IZpV/eUZF6KdDh7reVEQM7pPRA+?= =?us-ascii?Q?CaPAykVLt3NGVFq7KuZX9xyOIt7YoJQdn8istE7zzxUhC8LFoAAj2vEirpyv?= =?us-ascii?Q?lGHjWhgEWKGpN/u1L7WoPjr+0MHl2LGuFwRIVOfRVz/s8lCyHCkkvBmcV9uc?= =?us-ascii?Q?6dLmGv29VMT7o0xhypef7T7/5aUggqZ2MhhDBhpR1oN49yJKcMDRQ6Xwy2Zf?= =?us-ascii?Q?voc4OEHZlI+EFWP/JUf1o/0hA3BXC0iZhxcoVTZED13rNDPHU9ymbZDKnECK?= =?us-ascii?Q?ynZKqcH3oeWpuD3IvbNBD4MgX21a+UEpW3knBTZT8eh2U90QxOM2J6/qIkzW?= =?us-ascii?Q?qcEtrnu3HWhS33hcGtP5DYe2wzx5k5kCjTdl5EKFFFh7KBYJ4ASmKJcQKKt2?= =?us-ascii?Q?4e+sDeWIyFtmTqw3KQ0EX5bw+qitJjsr2MG6dmUQuOHDOdr48e7W14qb5iYl?= =?us-ascii?Q?ctu3LkKdycmwECT4zLu6qqpY59PERM1O8EGkHKGUTjulPPJRxhcO4Rrwract?= =?us-ascii?Q?qaMlpMhJ2fUxxsG53bRXgdtDWe2wJn9HYd15JzWHYz3im59P/ymy1bbfk5s+?= =?us-ascii?Q?WbYUhmN34iFB3J3giYru4EbYeKgzRfdqr0vR9HxfrfHfyKhPg0Gs+Lccu+er?= =?us-ascii?Q?vC0TIxnqFrQjt6wk9UC2S0R5Mrf3+3VqQIXC+NJWju8ttwbPj8pEnIP+CDxH?= =?us-ascii?Q?p//pGdNUIu3A9hmAdwAjkXrKc7WtXEkRm0dQj6J+E/qmWoEQWs6d/qFplix2?= =?us-ascii?Q?Xx+UbJ9+5yxVayg1EMnUX73u?= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: marvell.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PH0PR18MB4086.namprd18.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d3c521e3-d082-4c06-b4e3-08d8ef6fc5da X-MS-Exchange-CrossTenant-originalarrivaltime: 25 Mar 2021 09:24:21.1822 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 70e1fb47-1155-421d-87fc-2e58f638b6e0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 8H321tf+Ci5F0Blnk7z3P0vWPZit13zI69+VpgkemJ6lQ4oatK0WT8oODoJA1NH5tEGcq+qY/b9vCUO+4fGVbiHsO9WeD4Nor0C0Zg/hcvo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR18MB4024 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.369, 18.0.761 definitions=2021-03-25_02:2021-03-24, 2021-03-25 signatures=0 Subject: Re: [dpdk-dev] [PATCH v5 2/8] eventdev: introduce event vector Rx capability 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 Sender: "dev" >> From: pbhagavatula@marvell.com >> Sent: Wednesday, March 24, 2021 10:35 AM >> To: jerinj@marvell.com; Jayatheerthan, Jay >; Carrillo, Erik G >; Gujjar, >> Abhinandan S ; McDaniel, Timothy >; hemant.agrawal@nxp.com; Van >> Haaren, Harry ; mattias.ronnblom >; Ma, Liang J >> ; Ray Kinsella ; Neil Horman > >> Cc: dev@dpdk.org; Pavan Nikhilesh >> Subject: [dpdk-dev] [PATCH v5 2/8] eventdev: introduce event vector >Rx capability >> >> From: Pavan Nikhilesh >> >> Introduce event ethernet Rx adapter event vector capability. >> >> If an event eth Rx adapter has the capability of >> RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR then a given Rx >queue >> can be configured to enable event vectorization by passing the >> flag RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR to >> rte_event_eth_rx_adapter_queue_conf::rx_queue_flags while >configuring >> Rx adapter through rte_event_eth_rx_adapter_queue_add(). >> >> The max vector size, vector timeout define the vector size and >> mempool used for allocating vector event are configured through >> rte_event_eth_rx_adapter_queue_add. The element size of the >element >> in the vector pool should be equal to >> sizeof(struct rte_event_vector) + (vector_sz * sizeof(uintptr_t)) >> >> Application can use `rte_event_vector_pool_create` to create the >> vector mempool used for >> rte_event_eth_rx_adapter_queue_conf::vector_mp. >> >> The Rx adapter would be responsible for vectorizing the mbufs >> based on the flow, the vector limits configured by the application >> and add the vector event of mbufs to the event queue set via >> rte_event_eth_rx_adapter_queue_conf::ev::queue_id. >> It should also mark rte_event_vector::union_valid and fill >> rte_event_vector::port, rte_event_vector::queue. >> >> Signed-off-by: Pavan Nikhilesh >> Acked-by: Jerin Jacob >> --- >> .../prog_guide/event_ethernet_rx_adapter.rst | 38 ++++++ >> lib/librte_eventdev/eventdev_pmd.h | 53 ++++++++ >> .../rte_event_eth_rx_adapter.c | 114 ++++++++++++++++++ >> .../rte_event_eth_rx_adapter.h | 105 ++++++++++++++++ >> lib/librte_eventdev/rte_eventdev.h | 30 ++++- >> lib/librte_eventdev/version.map | 2 + >> 6 files changed, 340 insertions(+), 2 deletions(-) >> >> diff --git a/doc/guides/prog_guide/event_ethernet_rx_adapter.rst >b/doc/guides/prog_guide/event_ethernet_rx_adapter.rst >> index cb44ce0e4..5eefef355 100644 >> --- a/doc/guides/prog_guide/event_ethernet_rx_adapter.rst >> +++ b/doc/guides/prog_guide/event_ethernet_rx_adapter.rst >> @@ -186,3 +186,41 @@ the event buffer fill level is low. The >> ``rte_event_eth_rx_adapter_cb_register()`` function allow the >application >> to register a callback that selects which packets to enqueue to the >event >> device. >> + >> +Rx event vectorization >> +~~~~~~~~~~~~~~~~~~~~~~ >> + >> +The event devices, ethernet device pairs which support the capability >> +``RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR`` can >aggregate packets based on >> +flow characteristics and generate a ``rte_event`` containing >``rte_event_vector`` >> +whose event type is either ``RTE_EVENT_TYPE_ETHDEV_VECTOR`` or >> +``RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR``. >> +The aggregation size and timeout are configurable at a queue level >and the >> +maximum, minimum vector sizes and timeouts vary based on the >device capability >> +and can be queried using >``rte_event_eth_rx_adapter_vector_limits_get``. >> +The Rx adapter additionally might include useful data such as >ethernet device >> +port and queue identifier in the ``rte_event_vector::port`` and >> +``rte_event_vector::queue`` and mark >``rte_event_vector::attr_valid`` as true. >> + >> +A loop processing ``rte_event_vector`` containing mbufs is shown >below. >> + >> +.. code-block:: c >> + >> + event =3D rte_event_dequeue_burst(event_dev, event_port, >&event, >> + 1, 0); >> + if (!event) >> + continue; >> + >> + switch (ev.event_type) { >> + case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR: >> + case RTE_EVENT_TYPE_ETHDEV_VECTOR: >> + struct rte_mbufs **mbufs; >> + >> + mbufs =3D (struct rte_mbufs **)ev[i].vec->mbufs; >> + for (i =3D 0; i < ev.vec->nb_elem; i++) { >> + /* Process each mbuf. */ >> + } >> + break; >> + case ... >> + ... >> + } >> diff --git a/lib/librte_eventdev/eventdev_pmd.h >b/lib/librte_eventdev/eventdev_pmd.h >> index 7eb9a7739..9297f1433 100644 >> --- a/lib/librte_eventdev/eventdev_pmd.h >> +++ b/lib/librte_eventdev/eventdev_pmd.h >> @@ -645,6 +645,53 @@ typedef int >(*eventdev_eth_rx_adapter_stats_reset) >> */ >> typedef int (*eventdev_selftest)(void); >> >> +struct rte_event_eth_rx_adapter_vector_limits; >> +/** >> + * Get event vector limits for a given event, ethernet device pair. >> + * >> + * @param dev >> + * Event device pointer >> + * >> + * @param eth_dev >> + * Ethernet device pointer >> + * >> + * @param[out] limits >> + * Pointer to the limits structure to be filled. >> + * >> + * @return >> + * - 0: Success. >> + * - <0: Error code returned by the driver function. >> + */ >> +typedef int (*eventdev_eth_rx_adapter_vector_limits_get_t)( >> + const struct rte_eventdev *dev, const struct rte_eth_dev >*eth_dev, >> + struct rte_event_eth_rx_adapter_vector_limits *limits); >> + >> +struct rte_event_eth_rx_adapter_event_vector_config; >> +/** >> + * Enable event vector on an given Rx queue of a ethernet devices >belonging to >> + * the Rx adapter. >> + * >> + * @param dev >> + * Event device pointer >> + * >> + * @param eth_dev >> + * Ethernet device pointer >> + * >> + * @param rx_queue_id >> + * The Rx queue identifier >> + * >> + * @param config >> + * Pointer to the event vector configuration structure. >> + * >> + * @return >> + * - 0: Success. >> + * - <0: Error code returned by the driver function. >> + */ >> +typedef int (*eventdev_eth_rx_adapter_event_vector_config_t)( >> + const struct rte_eventdev *dev, const struct rte_eth_dev >*eth_dev, >> + int32_t rx_queue_id, >> + const struct rte_event_eth_rx_adapter_event_vector_config >*config); >> + >> typedef uint32_t rte_event_pmd_selftest_seqn_t; >> extern int rte_event_pmd_selftest_seqn_dynfield_offset; >> >> @@ -1067,6 +1114,12 @@ struct rte_eventdev_ops { >> /**< Get ethernet Rx stats */ >> eventdev_eth_rx_adapter_stats_reset >eth_rx_adapter_stats_reset; >> /**< Reset ethernet Rx stats */ >> + eventdev_eth_rx_adapter_vector_limits_get_t >> + eth_rx_adapter_vector_limits_get; >> + /**< Get event vector limits for the Rx adapter */ >> + eventdev_eth_rx_adapter_event_vector_config_t >> + eth_rx_adapter_event_vector_config; >> + /**< Configure Rx adapter with event vector */ >> >> eventdev_timer_adapter_caps_get_t timer_adapter_caps_get; >> /**< Get timer adapter capabilities */ >> diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.c >b/lib/librte_eventdev/rte_event_eth_rx_adapter.c >> index d8c635e99..ac8ba5bf0 100644 >> --- a/lib/librte_eventdev/rte_event_eth_rx_adapter.c >> +++ b/lib/librte_eventdev/rte_event_eth_rx_adapter.c >> @@ -2263,6 +2263,120 @@ >rte_event_eth_rx_adapter_queue_del(uint8_t id, uint16_t eth_dev_id, >> return ret; >> } >> >> +int >> +rte_event_eth_rx_adapter_queue_event_vector_config( >> + uint8_t id, uint16_t eth_dev_id, int32_t rx_queue_id, >> + struct rte_event_eth_rx_adapter_event_vector_config *config) >> +{ >> + struct rte_event_eth_rx_adapter_vector_limits limits; >> + struct rte_event_eth_rx_adapter *rx_adapter; >> + struct rte_eventdev *dev; >> + uint32_t cap; >> + int ret; >> + >> + RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, - >EINVAL); >> + RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_dev_id, -EINVAL); >> + >> + rx_adapter =3D rxa_id_to_adapter(id); >> + if ((rx_adapter =3D=3D NULL) || (config =3D=3D NULL)) >> + return -EINVAL; >> + >> + dev =3D &rte_eventdevs[rx_adapter->eventdev_id]; >> + ret =3D rte_event_eth_rx_adapter_caps_get(rx_adapter- >>eventdev_id, >> + eth_dev_id, &cap); >> + if (ret) { >> + RTE_EDEV_LOG_ERR("Failed to get adapter caps edev >%" PRIu8 >> + "eth port %" PRIu16, >> + id, eth_dev_id); >> + return ret; >> + } >> + >> + if (!(cap & >RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR)) { >> + RTE_EDEV_LOG_ERR("Event vectorization is not >supported," >> + " eth port: %" PRIu16 " adapter id: %" >PRIu8, >> + eth_dev_id, id); >> + return -EINVAL; >> + } >> + >> + ret =3D rte_event_eth_rx_adapter_vector_limits_get( >> + rx_adapter->eventdev_id, eth_dev_id, &limits); >> + if (ret) { >> + RTE_EDEV_LOG_ERR("Failed to get vector limits edev >%" PRIu8 >> + "eth port %" PRIu16, >> + rx_adapter->eventdev_id, eth_dev_id); >> + return ret; >> + } >> + >> + if (config->vector_sz < limits.min_sz || >> + config->vector_sz > limits.max_sz || >> + config->vector_timeout_ns < limits.min_timeout_ns || >> + config->vector_timeout_ns > limits.max_timeout_ns || >> + config->vector_mp =3D=3D NULL) { >> + RTE_EDEV_LOG_ERR("Invalid event vector >configuration," >> + " eth port: %" PRIu16 " adapter id: %" >PRIu8, >> + eth_dev_id, id); >> + return -EINVAL; >> + } >> + if (config->vector_mp->elt_size < >> + (sizeof(struct rte_event_vector) + >> + (sizeof(uintptr_t) * config->vector_sz))) { >> + RTE_EDEV_LOG_ERR("Invalid event vector >configuration," >> + " eth port: %" PRIu16 " adapter id: %" >PRIu8, >> + eth_dev_id, id); >> + return -EINVAL; >> + } >> + >> + if (cap & >RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT) { >> + RTE_FUNC_PTR_OR_ERR_RET( >> + *dev->dev_ops- >>eth_rx_adapter_event_vector_config, >> + -ENOTSUP); >> + ret =3D dev->dev_ops- >>eth_rx_adapter_event_vector_config( >> + dev, &rte_eth_devices[eth_dev_id], >rx_queue_id, config); >> + } else { >> + ret =3D -ENOTSUP; >> + } > >Trying to understand why non-INTERNAL_PORT based event device >implementation returns ENOTSUP. Do you foresee any issues if such a >device implements this function? > I just didn't want to move the implementation here as this patch is only=20 Intended for spec. The implementation for non-INTERNAL_PORT is in 4/8 >> + >> + return ret; >> +} >> + >> +int >> +rte_event_eth_rx_adapter_vector_limits_get( >> + uint8_t dev_id, uint16_t eth_port_id, >> + struct rte_event_eth_rx_adapter_vector_limits *limits) >> +{ >> + struct rte_eventdev *dev; >> + uint32_t cap; >> + int ret; >> + >> + RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL); >> + RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_port_id, -EINVAL); >> + >> + if (limits =3D=3D NULL) >> + return -EINVAL; >> + >> + dev =3D &rte_eventdevs[dev_id]; >> + >> + ret =3D rte_event_eth_rx_adapter_caps_get(dev_id, eth_port_id, >&cap); >> + if (ret) { >> + RTE_EDEV_LOG_ERR("Failed to get adapter caps edev >%" PRIu8 >> + "eth port %" PRIu16, >> + dev_id, eth_port_id); >> + return ret; >> + } >> + >> + if (cap & >RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT) { >> + RTE_FUNC_PTR_OR_ERR_RET( >> + *dev->dev_ops- >>eth_rx_adapter_vector_limits_get, >> + -ENOTSUP); >> + ret =3D dev->dev_ops- >>eth_rx_adapter_vector_limits_get( >> + dev, &rte_eth_devices[eth_port_id], limits); >> + } else { >> + ret =3D -ENOTSUP; >> + } >> + > >Same here. > >> + return ret; >> +} >> + >> int >> rte_event_eth_rx_adapter_start(uint8_t id) >> { >> diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.h >b/lib/librte_eventdev/rte_event_eth_rx_adapter.h >> index 21bb1e54c..7407cde00 100644 >> --- a/lib/librte_eventdev/rte_event_eth_rx_adapter.h >> +++ b/lib/librte_eventdev/rte_event_eth_rx_adapter.h >> @@ -92,6 +92,10 @@ extern "C" { >> /**< This flag indicates the flow identifier is valid >> * @see rte_event_eth_rx_adapter_queue_conf::rx_queue_flags >> */ >> +#define RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR > 0x2 >> +/**< This flag indicates that mbufs arriving on the queue need to be >vectorized >> + * @see rte_event_eth_rx_adapter_queue_conf::rx_queue_flags >> + */ >> >> /** >> * Adapter configuration structure that the adapter configuration >callback >> @@ -169,6 +173,36 @@ struct >rte_event_eth_rx_adapter_queue_conf { >> */ >> }; >> >> +struct rte_event_eth_rx_adapter_event_vector_config { >> + uint16_t vector_sz; >> + /**< >> + * Indicates the maximum number for mbufs to combine and >form a vector. >> + * Should be within >> + * @see >rte_event_eth_rx_adapter_vector_limits::min_vector_sz >> + * @see >rte_event_eth_rx_adapter_vector_limits::max_vector_sz >> + * Valid when >RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR flag is set in >> + * @see >rte_event_eth_rx_adapter_queue_conf::rx_queue_flags >> + */ >> + uint64_t vector_timeout_ns; >> + /**< >> + * Indicates the maximum number of nanoseconds to wait for >receiving >> + * mbufs. Should be within vectorization limits of the >> + * adapter >> + * @see >rte_event_eth_rx_adapter_vector_limits::min_vector_ns >> + * @see >rte_event_eth_rx_adapter_vector_limits::max_vector_ns >> + * Valid when >RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR flag is set in >> + * @see >rte_event_eth_rx_adapter_queue_conf::rx_queue_flags >> + */ >> + struct rte_mempool *vector_mp; >> + /**< >> + * Indicates the mempool that should be used for allocating >> + * rte_event_vector container. >> + * Should be created by using `rte_event_vector_pool_create`. >> + * Valid when >RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR flag is set in >> + * @see >rte_event_eth_rx_adapter_queue_conf::rx_queue_flags. >> + */ >> +}; >> + >> /** >> * A structure used to retrieve statistics for an eth rx adapter >instance. >> */ >> @@ -199,6 +233,32 @@ struct rte_event_eth_rx_adapter_stats { >> /**< Received packet count for interrupt mode Rx queues */ >> }; >> >> +/** >> + * A structure used to retrieve eth rx adapter vector limits. >> + */ >> +struct rte_event_eth_rx_adapter_vector_limits { >> + uint16_t min_sz; >> + /**< Minimum vector limit configurable. >> + * @see >rte_event_eth_rx_adapter_event_vector_config::vector_sz >> + */ >> + uint16_t max_sz; >> + /**< Maximum vector limit configurable. >> + * @see >rte_event_eth_rx_adapter_event_vector_config::vector_sz >> + */ >> + uint8_t log2_sz; >> + /**< True if the size configured should be in log2. >> + * @see >rte_event_eth_rx_adapter_event_vector_config::vector_sz >> + */ >> + uint64_t min_timeout_ns; >> + /**< Minimum vector timeout configurable. >> + * @see >rte_event_eth_rx_adapter_event_vector_config::vector_timeout_ns >> + */ >> + uint64_t max_timeout_ns; >> + /**< Maximum vector timeout configurable. >> + * @see >rte_event_eth_rx_adapter_event_vector_config::vector_timeout_ns >> + */ >> +}; >> + >> /** >> * >> * Callback function invoked by the SW adapter before it continues >> @@ -467,6 +527,51 @@ int >rte_event_eth_rx_adapter_cb_register(uint8_t id, uint16_t eth_dev_id, >> >rte_event_eth_rx_adapter_cb_fn cb_fn, >> void *cb_arg); >> >> +/** >> + * Retrieve vector limits for a given event dev and eth dev pair. >> + * @see rte_event_eth_rx_adapter_vector_limits >> + * >> + * @param dev_id >> + * Event device identifier. >> + * @param eth_port_id >> + * Port identifier of the ethernet device. >> + * @param [out] limits >> + * A pointer to rte_event_eth_rx_adapter_vector_limits structure >that has to >> + * be filled. >> + * >> + * @return >> + * - 0: Success. >> + * - <0: Error code on failure. >> + */ >> +__rte_experimental >> +int rte_event_eth_rx_adapter_vector_limits_get( >> + uint8_t dev_id, uint16_t eth_port_id, >> + struct rte_event_eth_rx_adapter_vector_limits *limits); >> + >> +/** >> + * Configure event vectorization for a given ethernet device queue, >that has >> + * been added to a event eth Rx adapter. >> + * >> + * @param id >> + * The identifier of the ethernet Rx event adapter. >> + * >> + * @param eth_dev_id >> + * The identifier of the ethernet device. >> + * >> + * @param rx_queue_id >> + * Ethernet device receive queue index. >> + * If rx_queue_id is -1, then all Rx queues configured for the >ethernet device >> + * are configured with event vectorization. >> + * >> + * @return >> + * - 0: Success, Receive queue configured correctly. >> + * - <0: Error code on failure. >> + */ >> +__rte_experimental >> +int rte_event_eth_rx_adapter_queue_event_vector_config( >> + uint8_t id, uint16_t eth_dev_id, int32_t rx_queue_id, >> + struct rte_event_eth_rx_adapter_event_vector_config >*config); >> + >> #ifdef __cplusplus >> } >> #endif >> diff --git a/lib/librte_eventdev/rte_eventdev.h >b/lib/librte_eventdev/rte_eventdev.h >> index aa4dd3959..678338247 100644 >> --- a/lib/librte_eventdev/rte_eventdev.h >> +++ b/lib/librte_eventdev/rte_eventdev.h >> @@ -919,10 +919,28 @@ rte_event_dev_close(uint8_t dev_id); >> * Event vector structure. >> */ >> struct rte_event_vector { >> - uint64_t nb_elem : 16; >> + uint16_t nb_elem; >> /**< Number of elements in this event vector. */ >> - uint64_t rsvd : 48; >> + uint16_t rsvd : 15; >> /**< Reserved for future use */ >> + uint16_t attr_valid : 1; >> + /**< Indicates that the below union attributes have valid >information. >> + */ >> + union { >> + /* Used by Rx adapter. >> + * Indicates that all the elements in this vector belong to >the >> + * same port and queue pair when originating from Rx >adapter, >> + * valid only when event type is ETHDEV_VECTOR or >> + * ETH_RX_ADAPTER_VECTOR. >> + */ >> + struct { >> + uint16_t port; >> + /* Ethernet device port id. */ >> + uint16_t queue; >> + /* Ethernet device queue id. */ >> + }; >> + }; >> + /**< Union to hold common attributes of the vector array. */ >> uint64_t impl_opaque; >> /**< Implementation specific opaque value. >> * An implementation may use this field to hold implementation >specific >> @@ -1025,8 +1043,14 @@ struct rte_event_vector { >> * // Classify and handle event. >> * } >> */ >> +#define RTE_EVENT_TYPE_ETHDEV_VECTOR >\ >> + (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_ETHDEV) >> +/**< The event vector generated from ethdev subsystem */ >> #define RTE_EVENT_TYPE_CPU_VECTOR (RTE_EVENT_TYPE_VECTOR >| RTE_EVENT_TYPE_CPU) >> /**< The event vector generated from cpu for pipelining. */ >> +#define RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR >\ >> + (RTE_EVENT_TYPE_VECTOR | >RTE_EVENT_TYPE_ETH_RX_ADAPTER) >> +/**< The event vector generated from eth Rx adapter. */ >> >> #define RTE_EVENT_TYPE_MAX 0x10 >> /**< Maximum number of event types */ >> @@ -1171,6 +1195,8 @@ struct rte_event { >> * @see struct rte_event_eth_rx_adapter_queue_conf::ev >> * @see struct >rte_event_eth_rx_adapter_queue_conf::rx_queue_flags >> */ >> +#define RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR > 0x8 >> +/**< Adapter supports event vectorization per ethdev. */ >> >> /** >> * Retrieve the event device's ethdev Rx adapter capabilities for the >> diff --git a/lib/librte_eventdev/version.map >b/lib/librte_eventdev/version.map >> index a070ef56e..902df0ae3 100644 >> --- a/lib/librte_eventdev/version.map >> +++ b/lib/librte_eventdev/version.map >> @@ -141,6 +141,8 @@ EXPERIMENTAL { >> >> #added in 21.05 >> rte_event_vector_pool_create; >> + rte_event_eth_rx_adapter_vector_limits_get; >> + rte_event_eth_rx_adapter_queue_event_vector_config; >> }; >> >> INTERNAL { >> -- >> 2.17.1 > >More of informational queries. > >Acked-by: Jay Jayatheerthan