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 C308642220; Fri, 1 Sep 2023 14:22:13 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BA75B40299; Fri, 1 Sep 2023 14:22:13 +0200 (CEST) Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-vi1eur04on2048.outbound.protection.outlook.com [40.107.8.48]) by mails.dpdk.org (Postfix) with ESMTP id 99F4D4014F for ; Fri, 1 Sep 2023 14:22:12 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fD1f2w8udOXaBLk4arrdyQWretziIFN5sTiEBBHeYtORkksgBlFoeKdxQJADUtF/Ye5fXedEJ8oWZg+N9rvMRML8CH4V2WpPL434Ma9vElatvXg3f79e69BnHEcwS+WisaddzQmHaAbE/tWJRQ3RnjLO0teIZJB7KjX/K/ceTeC2FDk50IWMpFR2rwJzG+Oy2Fs4QZ4S9SZA0H7MjLtCLRgNNdciqU9aSYCWMS6ZT90MZzGwKIPAhe0KqWC6Dmzw3X1v7V60rcRhGqEfgDasQqLT34z5Z5x0sVYHyWpcLH3OU3EEg6zpkfYz0LypyFnue1AxFqjlViy796hs/x+jUg== 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=yNP+8bqMGdPiNMkS3U1aspeLcFE2EOpwVndJsOI7q8Y=; b=K/dO1RY4SM2+hLA+1crhXv7J9RjrRcrF7bHF3p4HEvxuLdgMaalTPGtw5fkRiIGWPmEIA0EFSPA0wn4CEOTMgL3ZIkfKVrVq8gGrXJQLiTuRLYECRHl6kzetmw+eUhyTW8jD3pKTzr4tE34p8+S6SsC/tuuGVLrWup2w84CLVLANHeL5EelVuV81jlM6xWTZODA7z7d9KlPvpI99GmjNh+EolJeISDrjHqjbIksYrH2zkNbpfOPzxEUpTAZKMYodBVLCbqA2vwEry4C5NrAJb5vuaxVhbfVoGlekVuWyZj8ZqHmyGm1iOrkzml9uKo6WtPvMo2nAHK8JFzdvtXTIew== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=yNP+8bqMGdPiNMkS3U1aspeLcFE2EOpwVndJsOI7q8Y=; b=nWgDZpPChA/xkK6+vC2WAOdwbjcfQ4VyLGjFbkXjG5i2IXN9ZN4ykmCAEiXX3cYsPjJ1Y+SE1VEAFSo/fjlk/sQCg5XGgrEwPn2JQJ4N9yo8ceTdW9MGEul51rz6ja7BUkYqz/GBhYYD/5AQUqYp61g6bDEE0KCT+V8cqQFNVIE= Received: from AS8PR08MB7718.eurprd08.prod.outlook.com (2603:10a6:20b:50a::22) by DU0PR08MB9300.eurprd08.prod.outlook.com (2603:10a6:10:41f::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6745.20; Fri, 1 Sep 2023 12:22:10 +0000 Received: from AS8PR08MB7718.eurprd08.prod.outlook.com ([fe80::5530:2382:34ac:cb8e]) by AS8PR08MB7718.eurprd08.prod.outlook.com ([fe80::5530:2382:34ac:cb8e%4]) with mapi id 15.20.6745.023; Fri, 1 Sep 2023 12:22:10 +0000 From: Feifei Wang To: Konstantin Ananyev , Konstantin Ananyev CC: "dev@dpdk.org" , nd , Honnappa Nagarahalli , Ruifeng Wang , Yuying Zhang , Beilei Xing , nd , nd Subject: RE: [PATCH v11 2/4] net/i40e: implement mbufs recycle mode Thread-Topic: [PATCH v11 2/4] net/i40e: implement mbufs recycle mode Thread-Index: AQHZ1Mog0nujzlh9U0CHKeg6D9zv8K/48qdwgAvD0gCAARCtoA== Date: Fri, 1 Sep 2023 12:22:09 +0000 Message-ID: References: <20220420081650.2043183-1-feifei.wang2@arm.com> <20230822072710.1945027-1-feifei.wang2@arm.com> <20230822072710.1945027-3-feifei.wang2@arm.com> In-Reply-To: Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ts-tracking-id: B0C97E2481BD2C4E9CA784E9CD2FC7AF.0 x-checkrecipientchecked: true authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: AS8PR08MB7718:EE_|DU0PR08MB9300:EE_ x-ms-office365-filtering-correlation-id: 853034a9-24d3-4648-0036-08dbaae61084 nodisclaimer: true x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 9hy9owxNtJh+pRHGkGoXvwPL4OAzgLb/V4HKjpBvPvIAMJFGhOoCYCrCcV5rzVGqnbszZ9UZFsbvMo6U/bRPNVMV6zydC9uQgoxl0uGMq6FswwMHSXutl1HlJZJkjMx/fSbuKcIPVjBFFfSpLRRQK0CUrQe907WvXT5bPL30C1a/9Lwip5rslTW8uPN3sXPc7ds0+o2cahPjmyC704luJeE7qw067pt/azhO/KcJOOTiVWqaOkWsjFxyBXrXhWdTobPjk319qJIDA48ojkSjexwv1dQMfQhqRg2AUwWbiEgeLl1y2YRQXIPTTJTsAYlpxTTw+s0gXWsL6TL/vRbYYXl0kmJPuk2G1oFV9hTh53irDJBEULUaL7pNJbE9OueDhNM838kp7zBLlvCKqu3bPcG5ztGpUd1pw0HwydJsvonmPWR6K0P87fNkPTV2spvWLhIs+HF1O4CvSjs8EStt7w8CcXs49EE/CSiOjdLdwOn+UETRfwEv9uyWIFXIdDd4+tCGxNi1WED/LV5S6sxhIiLdUArZfwIfNjFxsyO/jIX5ekuLvxASvgTb06Aaji0u+PRUfUOUl745w0Zd64Gk2m8V1M8qmRc75TqlrIxw7KHlzA6SrmEdwgrEUc4R5VvOSLkQ1gyx4wbFjp0CIlq8lg== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AS8PR08MB7718.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(396003)(346002)(366004)(39860400002)(136003)(376002)(451199024)(1800799009)(186009)(38100700002)(2906002)(30864003)(5660300002)(33656002)(86362001)(52536014)(122000001)(38070700005)(55016003)(4326008)(8676002)(64756008)(66556008)(41300700001)(8936002)(83380400001)(6506007)(66446008)(53546011)(9686003)(316002)(54906003)(7696005)(26005)(76116006)(66946007)(66476007)(478600001)(110136005)(71200400001)(448954002); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?4W0IIESWh2dPfuYm3ho7+03UUbFvtaNAJniWmwMSJrBxzWCzeqJWhrfBUccT?= =?us-ascii?Q?lZU8OHu3DG3+BvTSkB2cl2PS7AkkjtevsG/+waBGnDs7w2EYCk8tA0uvw1/G?= =?us-ascii?Q?eL0Mpea0o/BUsZFV5xRsTHzgoOgEgak3+LgWOmGIgoMnQGsiK1wey/RIOyrJ?= =?us-ascii?Q?n/nVddZhZmwrXh1fMlb7UxypsubLxabkfp+QktyteTfwGW1LFvnIakWFk8Nz?= =?us-ascii?Q?Ky1X7x+rrExxrMs9LUbY/ElyVE+2q1FH+p2k+ESiTi37CdNw5i/59K/lTtcI?= =?us-ascii?Q?XL62EAFRvY/JdSS+TYw02sRmgPeEBoDaziyn1ZCVqppyEsZk3vkGhz5y+XBq?= =?us-ascii?Q?peqx8V7OFtiUvzWX0hsUyt4BNQlE4K5VIo8WElK47Ms66oQzkZXI0+cyxzj6?= =?us-ascii?Q?CAMaJB/zisWpCWEXXz8s4rIhHp/RKJL2ZAqM11W/teKR/aPQbaeO/uhXykX+?= =?us-ascii?Q?bw/+S/v/ZyEVNOmMrqsIwdUwup4YKnlatl752llvaPwnvsgX1kP4qeVXtrv6?= =?us-ascii?Q?mod0fKBFg1lnnAZKrND2DSV0RCok0s1DfFXyW2vnZZJSEGqvbn8Yr03Y3Cjg?= =?us-ascii?Q?MgmiuTLMhUnHxndk+KzDaEXSITUi9Sx3ad3sRDjUvoAfB9FJ7alUuKOW1V6s?= =?us-ascii?Q?yGQ4MEvv55ZDwmUEtB264kymVV2puENaf2eyS2yWv7Em1U8H8/EgRyqMZGZp?= =?us-ascii?Q?G1OiaKxR3tXbSQWMiHcTx7mScXsuGsj95y/b6gUGtIFdYiXflSll6nU9Ha4l?= =?us-ascii?Q?XJVDQon8ObZjlo67g1KotAT6WWRAXSHmplp8nssPa31P0FVv8pNKXTNVOuFo?= =?us-ascii?Q?G6wDTL5eR3d73PmKVs6q2aR+0KFApqFsb6xo36K1q4Gl0jxcZ+0ZH6o2qMYu?= =?us-ascii?Q?FG39ozqakuetR1qlgImnHP92fG4zCerS9SqQToCeK59LQQ3VxL8Z6/1P6tWK?= =?us-ascii?Q?HycKd/tlc5XEGGcI/zSkn2OnEM4tE1cPKAsSheiP0rBjOteH0LyQETwcWVVs?= =?us-ascii?Q?qXddo2q43oQpI7ZCjglTSrpCct/SbB+K2iKkz0OfbJ9hMIT39VRjrqzDAE8W?= =?us-ascii?Q?JxyONbJiXPRHcdXyvADeyRa46kDV35WfI47P70JGYHWCt3Qg66Vv43K809db?= =?us-ascii?Q?5dO2cAMyhx+c21uZtcrpvoVLgS8XgOz63328gpO4FQkO5++xgJxJe0P/xEXk?= =?us-ascii?Q?mj5VU7cLrtXn+foi2NlajXDDBt/hoLEVB/jnBvhdGOP6CTuWhs56XV16S3/R?= =?us-ascii?Q?FeNeXzfOjgiJIecSCuPNqu+TMprPW3spyLxUqN4gxQpERTM9nQ1sQTXa7vU6?= =?us-ascii?Q?thFbQac7AAi55XQjTLVvUmQo4YhzbVHOQXELhlhKsd3tw/iwFxH0UXxnBUV+?= =?us-ascii?Q?M2u3dh4iPNdGEtCINmRc6Q4N/XgcENmJTfmhhIRjIMXolBkxBb/YlB8Ck2UE?= =?us-ascii?Q?PJHjmSC5r1ezmyqhbzW2wlkvyk9A0xhdFcoKpwpbc7MoTdgBxQ6YWuJhQnPR?= =?us-ascii?Q?liYqVMYNTyGDbFNj7fGlbFzxSrfRBgxfO2B1uve4PXnMl9C13BN7YbSkSz/O?= =?us-ascii?Q?mlwnLxzpLQftJ05yMY/uR4H7DaIjglDeoOL8hOe5?= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: AS8PR08MB7718.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 853034a9-24d3-4648-0036-08dbaae61084 X-MS-Exchange-CrossTenant-originalarrivaltime: 01 Sep 2023 12:22:09.9323 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: vJfo+dXVqqpxRy4NyY7mFZ6IKPZ16TqxuF/2ukEk5r0JwYOZPetlTEalk/ApSqgwXdVot+9FqapSyFkaTVvphw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9300 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 > -----Original Message----- > From: Konstantin Ananyev > Sent: Friday, September 1, 2023 1:25 AM > To: Feifei Wang ; Konstantin Ananyev > > Cc: dev@dpdk.org; nd ; Honnappa Nagarahalli > ; Ruifeng Wang > ; Yuying Zhang ; Beilei > Xing ; nd > Subject: RE: [PATCH v11 2/4] net/i40e: implement mbufs recycle mode >=20 >=20 >=20 > > > > > > Define specific function implementation for i40e driver. > > > Currently, mbufs recycle mode can support 128bit vector path and avx2 > path. > > > And can be enabled both in fast free and no fast free mode. > > > > > > Suggested-by: Honnappa Nagarahalli > > > Signed-off-by: Feifei Wang > > > Reviewed-by: Ruifeng Wang > > > Reviewed-by: Honnappa Nagarahalli > > > --- > > > drivers/net/i40e/i40e_ethdev.c | 1 + > > > drivers/net/i40e/i40e_ethdev.h | 2 + > > > .../net/i40e/i40e_recycle_mbufs_vec_common.c | 147 > > > ++++++++++++++++++ > > > drivers/net/i40e/i40e_rxtx.c | 32 ++++ > > > drivers/net/i40e/i40e_rxtx.h | 4 + > > > drivers/net/i40e/meson.build | 1 + > > > 6 files changed, 187 insertions(+) > > > create mode 100644 drivers/net/i40e/i40e_recycle_mbufs_vec_common.c > > > > > > diff --git a/drivers/net/i40e/i40e_ethdev.c > > > b/drivers/net/i40e/i40e_ethdev.c index 8271bbb394..50ba9aac94 100644 > > > --- a/drivers/net/i40e/i40e_ethdev.c > > > +++ b/drivers/net/i40e/i40e_ethdev.c > > > @@ -496,6 +496,7 @@ static const struct eth_dev_ops i40e_eth_dev_ops > =3D { > > > .flow_ops_get =3D i40e_dev_flow_ops_get, > > > .rxq_info_get =3D i40e_rxq_info_get, > > > .txq_info_get =3D i40e_txq_info_get, > > > + .recycle_rxq_info_get =3D i40e_recycle_rxq_info_get, > > > .rx_burst_mode_get =3D i40e_rx_burst_mode_get, > > > .tx_burst_mode_get =3D i40e_tx_burst_mode_get, > > > .timesync_enable =3D i40e_timesync_enable, > > > diff --git a/drivers/net/i40e/i40e_ethdev.h > > > b/drivers/net/i40e/i40e_ethdev.h index 6f65d5e0ac..af758798e1 100644 > > > --- a/drivers/net/i40e/i40e_ethdev.h > > > +++ b/drivers/net/i40e/i40e_ethdev.h > > > @@ -1355,6 +1355,8 @@ void i40e_rxq_info_get(struct rte_eth_dev > > > *dev, uint16_t queue_id, > > > struct rte_eth_rxq_info *qinfo); > > > void i40e_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id, > > > struct rte_eth_txq_info *qinfo); > > > +void i40e_recycle_rxq_info_get(struct rte_eth_dev *dev, uint16_t > queue_id, > > > + struct rte_eth_recycle_rxq_info *recycle_rxq_info); > > > int i40e_rx_burst_mode_get(struct rte_eth_dev *dev, uint16_t queue_i= d, > > > struct rte_eth_burst_mode *mode); int > > > i40e_tx_burst_mode_get(struct rte_eth_dev *dev, uint16_t queue_id, > > > diff -- git a/drivers/net/i40e/i40e_recycle_mbufs_vec_common.c > > > b/drivers/net/i40e/i40e_recycle_mbufs_vec_common.c > > > new file mode 100644 > > > index 0000000000..5663ecccde > > > --- /dev/null > > > +++ b/drivers/net/i40e/i40e_recycle_mbufs_vec_common.c > > > @@ -0,0 +1,147 @@ > > > +/* SPDX-License-Identifier: BSD-3-Clause > > > + * Copyright (c) 2023 Arm Limited. > > > + */ > > > + > > > +#include > > > +#include > > > + > > > +#include "base/i40e_prototype.h" > > > +#include "base/i40e_type.h" > > > +#include "i40e_ethdev.h" > > > +#include "i40e_rxtx.h" > > > + > > > +#pragma GCC diagnostic ignored "-Wcast-qual" > > > + > > > +void > > > +i40e_recycle_rx_descriptors_refill_vec(void *rx_queue, uint16_t > > > +nb_mbufs) { > > > + struct i40e_rx_queue *rxq =3D rx_queue; > > > + struct i40e_rx_entry *rxep; > > > + volatile union i40e_rx_desc *rxdp; > > > + uint16_t rx_id; > > > + uint64_t paddr; > > > + uint64_t dma_addr; > > > + uint16_t i; > > > + > > > + rxdp =3D rxq->rx_ring + rxq->rxrearm_start; > > > + rxep =3D &rxq->sw_ring[rxq->rxrearm_start]; > > > + > > > + for (i =3D 0; i < nb_mbufs; i++) { > > > + /* Initialize rxdp descs. */ > > > + paddr =3D (rxep[i].mbuf)->buf_iova + > > > RTE_PKTMBUF_HEADROOM; > > > + dma_addr =3D rte_cpu_to_le_64(paddr); > > > + /* flush desc with pa dma_addr */ > > > + rxdp[i].read.hdr_addr =3D 0; > > > + rxdp[i].read.pkt_addr =3D dma_addr; > > > + } > > > + > > > + /* Update the descriptor initializer index */ > > > + rxq->rxrearm_start +=3D nb_mbufs; > > > + rx_id =3D rxq->rxrearm_start - 1; > > > + > > > + if (unlikely(rxq->rxrearm_start >=3D rxq->nb_rx_desc)) { > > > + rxq->rxrearm_start =3D 0; > > > + rx_id =3D rxq->nb_rx_desc - 1; > > > + } > > > + > > > + rxq->rxrearm_nb -=3D nb_mbufs; > > > + > > > + rte_io_wmb(); > > > + /* Update the tail pointer on the NIC */ > > > + I40E_PCI_REG_WRITE_RELAXED(rxq->qrx_tail, rx_id); } > > > + > > > +uint16_t > > > +i40e_recycle_tx_mbufs_reuse_vec(void *tx_queue, > > > + struct rte_eth_recycle_rxq_info *recycle_rxq_info) { > > > + struct i40e_tx_queue *txq =3D tx_queue; > > > + struct i40e_tx_entry *txep; > > > + struct rte_mbuf **rxep; > > > + int i, n; > > > + uint16_t nb_recycle_mbufs; > > > + uint16_t avail =3D 0; > > > + uint16_t mbuf_ring_size =3D recycle_rxq_info->mbuf_ring_size; > > > + uint16_t mask =3D recycle_rxq_info->mbuf_ring_size - 1; > > > + uint16_t refill_requirement =3D recycle_rxq_info->refill_requiremen= t; > > > + uint16_t refill_head =3D *recycle_rxq_info->refill_head; > > > + uint16_t receive_tail =3D *recycle_rxq_info->receive_tail; > > > + > > > + /* Get available recycling Rx buffers. */ > > > + avail =3D (mbuf_ring_size - (refill_head - receive_tail)) & mask; > > > + > > > + /* Check Tx free thresh and Rx available space. */ > > > + if (txq->nb_tx_free > txq->tx_free_thresh || avail <=3D txq->tx_rs_= thresh) > > > + return 0; > > > + > > > + /* check DD bits on threshold descriptor */ > > > + if ((txq->tx_ring[txq->tx_next_dd].cmd_type_offset_bsz & > > > + > > > rte_cpu_to_le_64(I40E_TXD_QW1_DTYPE_MASK)) !=3D > > > + > > > rte_cpu_to_le_64(I40E_TX_DESC_DTYPE_DESC_DONE)) > > > + return 0; > > > + > > > + n =3D txq->tx_rs_thresh; > > > + nb_recycle_mbufs =3D n; > > > + > > > + /* Mbufs recycle mode can only support no ring buffer wrapping > > > around. > > > + * Two case for this: > > > + * > > > + * case 1: The refill head of Rx buffer ring needs to be aligned wi= th > > > + * mbuf ring size. In this case, the number of Tx freeing buffers > > > + * should be equal to refill_requirement. > > > + * > > > + * case 2: The refill head of Rx ring buffer does not need to be al= igned > > > + * with mbuf ring size. In this case, the update of refill head can= not > > > + * exceed the Rx mbuf ring size. > > > + */ > > > + if (refill_requirement !=3D n || > > > + (!refill_requirement && (refill_head + n > mbuf_ring_size))) > > > + return 0; > > > + > > > + /* First buffer to free from S/W ring is at index > > > + * tx_next_dd - (tx_rs_thresh-1). > > > + */ > > > + txep =3D &txq->sw_ring[txq->tx_next_dd - (n - 1)]; > > > + rxep =3D recycle_rxq_info->mbuf_ring; > > > + rxep +=3D refill_head; > > > + > > > + if (txq->offloads & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE) { > > > + /* Avoid txq contains buffers from unexpected mempool. */ > > > + if (unlikely(recycle_rxq_info->mp > > > + !=3D txep[0].mbuf->pool)) > > > + return 0; > > > + > > > + /* Directly put mbufs from Tx to Rx. */ > > > + for (i =3D 0; i < n; i++) > > > + rxep[i] =3D txep[i].mbuf; > > > + } else { > > > + for (i =3D 0; i < n; i++) { > > > + rxep[i] =3D rte_pktmbuf_prefree_seg(txep[i].mbuf); > > > + > > > + /* If Tx buffers are not the last reference or from > > > + * unexpected mempool, previous copied buffers are > > > + * considered as invalid. > > > + */ > > > + if (unlikely((rxep[i] =3D=3D NULL && refill_requirement) || > > [Konstantin] > > Could you pls remind me why it is ok to have rxep[i]=3D=3DNULL when > > refill_requirement is not set? > > > > If reill_requirement is not zero, it means each tx freed buffer must > > be valid and can be put into Rx sw_ring. Then the refill head of Rx > > buffer ring can be aligned with mbuf ring size. Briefly speaking the nu= mber > of Tx valid freed buffer must be equal to Rx refill_requirement. For exam= ple, > i40e driver. > > > > If reill_requirement is zero, it means that the refill head of Rx > > buffer ring does not need to be aligned with mbuf ring size, thus if > > Tx have n valid freed buffers, we just need to put these n buffers into= Rx sw- > ring, and not to be equal to the Rx setting rearm number. For example, ml= x5 > driver. > > > > In conclusion, above difference is due to pmd drivers have different > strategies to update their Rx rearm(refill) head. > > For i40e driver, if rearm_head exceed 1024, it will be set as 0 due to = the > number of each rearm is a fixed value by default. > > For mlx5 driver. Its rearm_head can exceed 1024, and use mask to achiev= e > real index. Thus its rearm number can be a different value. >=20 > Ok, but if rte_pktmbuf_prefree_seg(txep[i].mbuf), it means that this mbuf= is > not free yet and can't be reused. > Shouldn't we then set nb_recycle_mbufs =3D 0 in that case too? > Or probably would be enough to skip that mbuf? > Might be something like that: >=20 > for (i =3D 0, j =3D 0; i < n; i++) { >=20 > rxep[j] =3D rte_pktmbuf_prefree_seg(txep[i].mbuf); > if (rxep[j] =3D=3D NULL || recycle_rxq_info->mp !=3D rxep[j].mbuf->pool)= ) { > if (refill_requirement) { > nb_recycle_mbufs =3D 0; > break; > } > } else > j++; > } >=20 > /* now j contains actual number of recycled mbufs */ >=20 > ? >=20 > > > > > + recycle_rxq_info->mp !=3D txep[i].mbuf- > > > >pool)) > > > + nb_recycle_mbufs =3D 0; > > > + } > > > + /* If Tx buffers are not the last reference or > > > + * from unexpected mempool, all recycled buffers > > > + * are put into mempool. > > > + */ > > > + if (nb_recycle_mbufs =3D=3D 0) > > > + for (i =3D 0; i < n; i++) { > > > + if (rxep[i] !=3D NULL) > > > + rte_mempool_put(rxep[i]->pool, > > > rxep[i]); > > > + } > > > + } > > > + [Konstantin] After another thought, it might be easier and cleaner just to: if (rxep[j] =3D=3D NULL || recycle_rxq_info->mp !=3D rxep[j].mbuf->pool) nb_recycle_mbufs =3D 0; Anyway, from my understanding - if rte_pktmbuf_prefree_seg(mbuf) returns=20 NULL, then we can't recycle that mbuf.=09 [Feifei] Agree with that 'rte_pktmbuf_prefree_seg(mbuf) returns NULL, then = we can't recycle that mbuf'. Firstly, we should know for i40e driver, the number of free mbufs is fixed= , it must equal to 'tx_rs_thresh' This means if we start to free Tx mbufs, it cannot be interrupted until the= given amount of mbufs are freed. In the meanwhile, doing prefree operation for a Tx mbuf can be looked at th= is mbuf is freed from this TX sw-ring if the API returns NULL. This is due to that call 'prefree_seg' function m= eans update the mbuf refcnt.=20 So let's come back our recycle mbuf case. Here we consider that the case if we have 32 mbufs need to be freed, and we= firstly do the pre-free. And then first 8 mbufs is good and return value is not none. But the 9th mb= uf is bad, its refcnt is more than 1. So we just update its refcnt and cannot put it into Rx sw-ring. For Tx sw-r= ing, this mbuf has been freed. Then we should continue to do pre-free operation for the next Tx mbufs to e= nsure the given amount of mbufs are freed.=20 Do a conclusion for this, this is because if we start to do pre-free operat= ion, the Tx mbuf refcnt value maybe changed, so we cannot stop or break until finish all the pre-free ope= ration. Finally, in the case that Rx refill_request is not zero, but the valid mbuf= amount is less than this value, we must put back this Tx mbufs into mempool. Above is the reason why I do not directly jump out of the loop if some mbuf= return value is NULL. > > > + /* Update counters for Tx. */ > > > + txq->nb_tx_free =3D (uint16_t)(txq->nb_tx_free + txq->tx_rs_thresh)= ; > > > + txq->tx_next_dd =3D (uint16_t)(txq->tx_next_dd + txq->tx_rs_thresh)= ; > > > + if (txq->tx_next_dd >=3D txq->nb_tx_desc) > > > + txq->tx_next_dd =3D (uint16_t)(txq->tx_rs_thresh - 1); > > > + > > > + return nb_recycle_mbufs; > > > +} > > > diff --git a/drivers/net/i40e/i40e_rxtx.c > > > b/drivers/net/i40e/i40e_rxtx.c index b4f65b58fa..a9c9eb331c 100644 > > > --- a/drivers/net/i40e/i40e_rxtx.c > > > +++ b/drivers/net/i40e/i40e_rxtx.c > > > @@ -3199,6 +3199,30 @@ i40e_txq_info_get(struct rte_eth_dev *dev, > > > uint16_t queue_id, > > > qinfo->conf.offloads =3D txq->offloads; } > > > > > > +void > > > +i40e_recycle_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id= , > > > + struct rte_eth_recycle_rxq_info *recycle_rxq_info) { > > > + struct i40e_rx_queue *rxq; > > > + struct i40e_adapter *ad =3D > > > + I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); > > > + > > > + rxq =3D dev->data->rx_queues[queue_id]; > > > + > > > + recycle_rxq_info->mbuf_ring =3D (void *)rxq->sw_ring; > > > + recycle_rxq_info->mp =3D rxq->mp; > > > + recycle_rxq_info->mbuf_ring_size =3D rxq->nb_rx_desc; > > > + recycle_rxq_info->receive_tail =3D &rxq->rx_tail; > > > + > > > + if (ad->rx_vec_allowed) { > > > + recycle_rxq_info->refill_requirement =3D > > > RTE_I40E_RXQ_REARM_THRESH; > > > + recycle_rxq_info->refill_head =3D &rxq->rxrearm_start; > > > + } else { > > > + recycle_rxq_info->refill_requirement =3D rxq->rx_free_thresh; > > > + recycle_rxq_info->refill_head =3D &rxq->rx_free_trigger; > > > + } > > > +} > > > + > > > #ifdef RTE_ARCH_X86 > > > static inline bool > > > get_avx_supported(bool request_avx512) @@ -3293,6 +3317,8 @@ > > > i40e_set_rx_function(struct rte_eth_dev *dev) > > > dev->rx_pkt_burst =3D ad->rx_use_avx2 ? > > > i40e_recv_scattered_pkts_vec_avx2 : > > > i40e_recv_scattered_pkts_vec; > > > + dev->recycle_rx_descriptors_refill =3D > > > + i40e_recycle_rx_descriptors_refill_vec; > > > } > > > } else { > > > if (ad->rx_use_avx512) { > > > @@ -3311,9 +3337,12 @@ i40e_set_rx_function(struct rte_eth_dev *dev) > > > dev->rx_pkt_burst =3D ad->rx_use_avx2 ? > > > i40e_recv_pkts_vec_avx2 : > > > i40e_recv_pkts_vec; > > > + dev->recycle_rx_descriptors_refill =3D > > > + i40e_recycle_rx_descriptors_refill_vec; > > > } > > > } > > > #else /* RTE_ARCH_X86 */ > > > + dev->recycle_rx_descriptors_refill =3D > > > +i40e_recycle_rx_descriptors_refill_vec; > > > if (dev->data->scattered_rx) { > > > PMD_INIT_LOG(DEBUG, > > > "Using Vector Scattered Rx (port %d).", @@ > > > -3481,15 +3510,18 @@ i40e_set_tx_function(struct rte_eth_dev *dev) > > > dev->tx_pkt_burst =3D ad->tx_use_avx2 ? > > > i40e_xmit_pkts_vec_avx2 : > > > i40e_xmit_pkts_vec; > > > + dev->recycle_tx_mbufs_reuse =3D > > > i40e_recycle_tx_mbufs_reuse_vec; > > > } > > > #else /* RTE_ARCH_X86 */ > > > PMD_INIT_LOG(DEBUG, "Using Vector Tx (port %d).", > > > dev->data->port_id); > > > dev->tx_pkt_burst =3D i40e_xmit_pkts_vec; > > > + dev->recycle_tx_mbufs_reuse =3D > > > i40e_recycle_tx_mbufs_reuse_vec; > > > #endif /* RTE_ARCH_X86 */ > > > } else { > > > PMD_INIT_LOG(DEBUG, "Simple tx finally be used."); > > > dev->tx_pkt_burst =3D i40e_xmit_pkts_simple; > > > + dev->recycle_tx_mbufs_reuse =3D > > > i40e_recycle_tx_mbufs_reuse_vec; > > > } > > > dev->tx_pkt_prepare =3D i40e_simple_prep_pkts; > > > } else { > > > diff --git a/drivers/net/i40e/i40e_rxtx.h > > > b/drivers/net/i40e/i40e_rxtx.h index a8686224e5..b191f23e1f 100644 > > > --- a/drivers/net/i40e/i40e_rxtx.h > > > +++ b/drivers/net/i40e/i40e_rxtx.h > > > @@ -236,6 +236,10 @@ uint32_t i40e_dev_rx_queue_count(void > > > *rx_queue); int i40e_dev_rx_descriptor_status(void *rx_queue, > > > uint16_t offset); int i40e_dev_tx_descriptor_status(void *tx_queue, > > > uint16_t offset); > > > > > > +uint16_t i40e_recycle_tx_mbufs_reuse_vec(void *tx_queue, > > > + struct rte_eth_recycle_rxq_info *recycle_rxq_info); void > > > +i40e_recycle_rx_descriptors_refill_vec(void *rx_queue, uint16_t > > > +nb_mbufs); > > > + > > > uint16_t i40e_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkt= s, > > > uint16_t nb_pkts); > > > uint16_t i40e_recv_scattered_pkts_vec(void *rx_queue, diff --git > > > a/drivers/net/i40e/meson.build b/drivers/net/i40e/meson.build index > > > 8e53b87a65..3b1a233c84 100644 > > > --- a/drivers/net/i40e/meson.build > > > +++ b/drivers/net/i40e/meson.build > > > @@ -34,6 +34,7 @@ sources =3D files( > > > 'i40e_tm.c', > > > 'i40e_hash.c', > > > 'i40e_vf_representor.c', > > > + 'i40e_recycle_mbufs_vec_common.c', > > > 'rte_pmd_i40e.c', > > > ) > > > > > > -- > > > 2.25.1