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 1C92B45B90; Mon, 21 Oct 2024 08:33:38 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C90C8402F0; Mon, 21 Oct 2024 08:33:28 +0200 (CEST) Received: from NAM02-DM3-obe.outbound.protection.outlook.com (mail-dm3nam02on2101.outbound.protection.outlook.com [40.107.95.101]) by mails.dpdk.org (Postfix) with ESMTP id BBD374027C for ; Mon, 21 Oct 2024 08:33:25 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=eiTafVtzZIxv51g6ML2lzHHotRQiL5cbKRa6b5XjoBv3RHhmDsUu21UNUkbMK0ma/x7Fg+V+gry5QsBUnC69zh04Uy3Hq7oOzz7nmWELWC1GaSFelEoKYX00txyUzB3eBZ42jSXAD3qHAeJrpYTx9BLzW6seN9ZwbU6yuWevnPEWaV9e8WmTwSSG1frm0a4ZNoRfOP4QjrLM+LOK/GT/rH7eWpbf9gaMvqb9i2hvXwJBfL2uGi1rue2hPH1kZGrdHPfQCZzBitvVRWh6tjbQA1Q9xkLjpEKBWnjb5Q/IMBoGtyyQMKyPk9/i4tjLvMeXM4CKsexvKQ7H1bQVwYb/hQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=51NcDCs1BsUt7MDr6j9uFAMY0BzVOkn9q9/czmajW4k=; b=tOgiW1u41I8w5jd59JqntgcQbQfc2XfszzrWkaBURcRubsEHc3NwBrIXxmxmu1owrnFzb+zGDygsSgIShCV9loP2TeHXP1Adu7bggj1hyhnAwDGeo7NpTj08a+f5yQMfbSraQvnIKOKNUR/0uSthh/v54iMXk+3Ztof8PyBSF13WPB9qRy1FCxythcW1ATxV6dvfcaluJga22rBhpMcittLEsga111rgNDBabFXB7UAeGpsWA3w+01JDfx/huZSez/mHV5IlkULLmYkwDM+sIpFCFWKiOZmWoNdT9XnkzDIrNrNI6KIlCsezZ9Sd7/IiK5wRLwqWqJTJyC1dauKWlw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com; dkim=pass header.d=corigine.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=51NcDCs1BsUt7MDr6j9uFAMY0BzVOkn9q9/czmajW4k=; b=j/8kdOZHYcRp2Ksiwh4ecvxqfdNJYXAuv8DflR2ar7zv+/G9M7LZ1tz3dT0kGvf1gc8+AjIS0AF3GGBENrB+dWTtvA/yzC0GptLTRj/GoMX5My97M5JWljI/+u47UKfbQNTQ+V2ngGxOYHbpFe+ZPlcVzCUbEv+2xSeA0zKcdJk= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=corigine.com; Received: from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) by CH3PR13MB7023.namprd13.prod.outlook.com (2603:10b6:610:20a::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8069.28; Mon, 21 Oct 2024 06:33:24 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::b900:5f05:766f:833]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::b900:5f05:766f:833%5]) with mapi id 15.20.8069.024; Mon, 21 Oct 2024 06:33:24 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Peng Zhang , Chaoyong He , Long Wu Subject: [PATCH 2/9] net/nfp: extract the function to initialize the PF Date: Mon, 21 Oct 2024 14:32:54 +0800 Message-Id: <20241021063301.4146214-3-chaoyong.he@corigine.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20241021063301.4146214-1-chaoyong.he@corigine.com> References: <20241021063301.4146214-1-chaoyong.he@corigine.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: SG2PR03CA0118.apcprd03.prod.outlook.com (2603:1096:4:91::22) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|CH3PR13MB7023:EE_ X-MS-Office365-Filtering-Correlation-Id: 6910eae7-03e5-4db0-0a32-08dcf19a4391 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|1800799024|52116014|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?BzazbOdyyG2qbog4B8sZp673STLIYdibKgP12xRVagOoSgFm1L0kAqkz6B5Y?= =?us-ascii?Q?3qyzOqBSuJVzBIhiHeaAzCPD9kn8ZtwMV/Oz1JoTSGtAQ/n9QsG+iC69iDV+?= =?us-ascii?Q?PTAYH05XjSNP8Yrg+TCnQ3z/qXSOdLwdAWpOLb7Q2TcdVd9fRol0/fIZNsYi?= =?us-ascii?Q?0Fa3SPOeRUpVqe4TqsU8QxPrl8dojxeR4exjiR/vIUY8O3oa2D282AHP2xsP?= =?us-ascii?Q?E1D3FQK6rQgLFb4Lmrh88rv+0uwS8eyH+fJBPZ0CD6Glj03/GeC06jeDIlv+?= =?us-ascii?Q?h6CqNe+Jr5WGrx4ic5ytPRPoeS2hF0uG1y26pWASDM11+L1K8TWukJjIzbLS?= =?us-ascii?Q?F+L13OxUotshTeft7x7BuPalBf4c1XLDnO4R1Ahvvq2ceH3lhG6w2YLSpvCd?= =?us-ascii?Q?GvZVAExcNDywGczSEBY4AKAtHdU3W9dLK0RiFpWyy6h792Sx3cVi2aZ1wIGI?= =?us-ascii?Q?e/sc9Jt8WXbUIdsvXoo63rXRH8tMj8iNk/1vYHcP+GJZgj4Gm+O41xyFZPI8?= =?us-ascii?Q?eeT9ZOAFiZLBl4769ISMcDqT3rllRqJNaIilIVZL3z8FAfGe39FJDNPnaDNG?= =?us-ascii?Q?nuGiK2OeQc3jdvWNIep3I5/663fkqOB7mOHR6UntZi4KX9Wv6PRlpAofalHO?= =?us-ascii?Q?nIlmyNF4aKK0/129C28hLi0ksZOQNnp2Xminqq/KCVmddRUaumPvM+/PhGX0?= =?us-ascii?Q?0DGqNlEoCrNrmgw28jY14/kB5/ZosTX4ESdv8FtPnXLC06HdGuXJP5LVWm/7?= =?us-ascii?Q?N7RqWEZpO1TpVpTLTa/oaTczbD2DRXxk/5vmhTz/wUTyed2pRI+HxcPrxSlJ?= =?us-ascii?Q?5q7qVY+YEiuMHMZpgz8TR/q8gUJXkrT5UkD6tb8g4Kpg5wFRMfSDuxWo+Fd+?= =?us-ascii?Q?3sbO62ZptkYydoFs7nNeFbMlA2IY012m7a8crHoFU1k5KbWCvvFWwA0tMC1g?= =?us-ascii?Q?xZCbluTH0v6s7XEoKjolwnDXh8lmpOGtaeEcohrQzlemLnrtaf8GwSJZxrt4?= =?us-ascii?Q?gbEP/z9oAidPmt4TP77vbF/TAauA19K7CnsAd3yW2o8+gTY0vXJgVGPPTCtq?= =?us-ascii?Q?8npcxXT/KMu1uypFP+ixb4RTRi9OSxRYs7FsMkc9wXO0eJIQvZSQmTU4kF4T?= =?us-ascii?Q?8+NxFp8fWfQ02zKYQCG0X68dIY8Opfmc8dOFuxnjs7vLnWnDfqcw5UQPkGgl?= =?us-ascii?Q?jJHsSURh2RKlDSIFvMuKjHMDwBSxVkZH9BIkty0DcFZnkFiYvBKeIqe3f+KA?= =?us-ascii?Q?8t8Bxf68E998V20Cdow2iz8zGdNPtp6KUOVPDabJlurgWMSJAFyArVYdSsya?= =?us-ascii?Q?xKCIPoAotE3o2UBDith+3NfqYtMWwv+XpZ/f71H2C41L8TDmO6BtGpULeCsZ?= =?us-ascii?Q?hZZKcPw=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(1800799024)(52116014)(376014)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?wCQWdEvA8Ut/YUlNN0GyPQcSYLYSirfPCPo44ACQC6ghOCKzfr2xJ17DjvSa?= =?us-ascii?Q?TeqSSMyUH/TIEUZ4aJwycK5sHQfTseawHm/Uu1GNlPVeIFc8osCTbZbiq21V?= =?us-ascii?Q?CpRPCTeTivvbsnUUviX17Di/1BMFKI46DPQsNYSbAANV6RLrdO19KTtd/fPv?= =?us-ascii?Q?4Yk+ydYmufBVhFkXAN50U4Axy6uL/sa++i0KYxwkh/4Q3IqdBGyRMrPPkDL4?= =?us-ascii?Q?jt9Wscbz7qOeTMIUtFm0iddOJ/TzOUfEB3KGhcsujYLdjpOCL9JKWYQTZQ1g?= =?us-ascii?Q?fjbYDnv8GXy5cHP+ZCDcUnXiUEULpOSsFG+mwYHPmbcC0c3tI5GdPTd0n4Gy?= =?us-ascii?Q?TmqvGR+vBThIpRVJ7AvSFaVT8Ca6UV4YErR37CsZrAcVnSQdG8pQMz2vj/cY?= =?us-ascii?Q?CxDkThVld9I3sqHu8axaxpHYWyee4Lcovrq5DO/Wcwn/NmlM7IzPTEuZRiPU?= =?us-ascii?Q?nHapk4CKmne3ZTxAQhn0V3+39bafHp2WgSI5ad6p/VesyVpddEsqkpl3/Dqn?= =?us-ascii?Q?he6hpS/U4/2TgK3G/Yac76jicmaMTBj6BH15VomXJtgmkkYwC+mkuzW5xTtO?= =?us-ascii?Q?YUz1v8gPOACRVyQ9A5mZy3Rqwj12rED0+tF3lg1cABBqU8yczGUa2Pqx4KwA?= =?us-ascii?Q?hedIqB2GURTAzSstsAnse5BpKl2tHrhpvepJF84VGlh9WuGJW+fTE2nS/Q5k?= =?us-ascii?Q?0Sr4qH3arVB89kW+q36oWhN0KxmiB+0yjDEGklQsBFz5j9p+TiAMy5JI9Lys?= =?us-ascii?Q?/it/+kOnns1HJUeOgwcBm1+A+rsLe9Vb9rNGamCiJAVQtkXs1r7RpmQ0Vso4?= =?us-ascii?Q?iBFHmoDLf03c039n1n7k2Q0kZeABCWvem38goRa7FzTqsRJ+IONnQQsF9LIB?= =?us-ascii?Q?VqsV+mdm9kxaAVbnB/Hd4aw678JPK2KkJUxiKoAxfCxKyH5LfooI7jajNjKk?= =?us-ascii?Q?qqXGZ+9owAnfiAhVJwQXsoA6XfdU8l6ZtsYKo9GZR1W8SlvA+pfFDN2arP/n?= =?us-ascii?Q?9jIWEE6or9sqPgKU4q3QJJDrzHG348Q7HB7Oqi9y31kBuv9MbvRFI+2bI1jh?= =?us-ascii?Q?zpmdWJWHvYKdOX4tjjbPzXy26oYFw5ZSSA4ZB8cD+H5oovR79WIj5Tgl5qad?= =?us-ascii?Q?OgehE0cKZkL7SVyOBFvmKiWJXwxr/lYW76ewBNm04EGmaGNc1ejUpmz8/2/s?= =?us-ascii?Q?GGskA3ptabqM+tI1nLZngcnsPc/W96NewD6VRmMpVbUUJ5ivR6/zs57ypTnT?= =?us-ascii?Q?Nw+oPtBzlLmOJV1EnTC6ZlT2w0u5W4A+G09+9U3KEky1Fwj5kn9s1D5g8c14?= =?us-ascii?Q?7NrYtMZAIc/gJpTNaKqWWOSK3Ljdy0Jfnq5626Kuf/bYihdHC2hXJRp1qfk8?= =?us-ascii?Q?GemJGi4IVv3oymsI6Yh8zD5MtiynaEFsCrnYf9nRLbq/ZZ9Ff4B8UPtXj+hP?= =?us-ascii?Q?kCdrw+032k4YTw8iaUyA0VNhHCHBAVSKfsRQXGIoxOL8ZfBFhYZGHM6taNw3?= =?us-ascii?Q?0fKUnEVUXrJ9jcom006vWD2/kcS7+2lCNC71vhl6Rw0651+0pStJHoFgIoRX?= =?us-ascii?Q?eaRFBUK8Fa5H1Bh8CJhzjmUUhVdekMf5zEyxRK+FmIYrmt+oAIfGsliqofn+?= =?us-ascii?Q?nQ=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6910eae7-03e5-4db0-0a32-08dcf19a4391 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Oct 2024 06:33:24.2563 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: fe128f2c-073b-4c20-818e-7246a585940c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: kEKVvaqSCbWncuNYOgIBrb0C9FKyZRAxWfsiCV3418GqR+ZAEfqk/4xX6yJDEGW5luagDgWG9a02P2Rm2S8i2Fi64y93mJNWMcUvqCbhh/g= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR13MB7023 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 From: Peng Zhang Extract the helper function to initialize the basic information of the PF representor port. The logic of check VF is updated because of changing the order of some logics in the initialization function. Signed-off-by: Peng Zhang Reviewed-by: Chaoyong He Reviewed-by: Long Wu --- .../net/nfp/flower/nfp_flower_representor.c | 114 +++++++++++------- drivers/net/nfp/nfp_net_common.c | 2 +- 2 files changed, 71 insertions(+), 45 deletions(-) diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c index af5f7fa4af..f76e780840 100644 --- a/drivers/net/nfp/flower/nfp_flower_representor.c +++ b/drivers/net/nfp/flower/nfp_flower_representor.c @@ -389,6 +389,12 @@ nfp_flower_repr_close_queue(struct rte_eth_dev *eth_dev, } } +static void +nfp_flower_repr_base_uninit(struct nfp_flower_representor *repr) +{ + rte_free(repr->repr_xstats_base); +} + static int nfp_flower_repr_uninit(struct rte_eth_dev *eth_dev) { @@ -396,7 +402,7 @@ nfp_flower_repr_uninit(struct rte_eth_dev *eth_dev) struct nfp_flower_representor *repr; repr = eth_dev->data->dev_private; - rte_free(repr->repr_xstats_base); + nfp_flower_repr_base_uninit(repr); rte_free(repr->ring); if (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT) { @@ -616,6 +622,63 @@ nfp_flower_pf_repr_init(struct rte_eth_dev *eth_dev, return 0; } +static int +nfp_flower_repr_base_init(struct rte_eth_dev *eth_dev, + struct nfp_flower_representor *repr, + struct nfp_repr_init *repr_init) +{ + int ret; + struct nfp_flower_representor *init_repr_data; + + /* Cast the input representor data to the correct struct here */ + init_repr_data = repr_init->flower_repr; + + /* Copy data here from the input representor template */ + repr->vf_id = init_repr_data->vf_id; + repr->switch_domain_id = init_repr_data->switch_domain_id; + repr->port_id = init_repr_data->port_id; + repr->nfp_idx = init_repr_data->nfp_idx; + repr->repr_type = init_repr_data->repr_type; + repr->app_fw_flower = init_repr_data->app_fw_flower; + + snprintf(repr->name, sizeof(repr->name), "%s", init_repr_data->name); + + /* This backer port is that of the eth_device created for the PF vNIC */ + eth_dev->data->backer_port_id = 0; + + /* Allocating memory for mac addr */ + eth_dev->data->mac_addrs = rte_zmalloc("mac_addr", RTE_ETHER_ADDR_LEN, 0); + if (eth_dev->data->mac_addrs == NULL) { + PMD_INIT_LOG(ERR, "Failed to allocate memory for repr MAC."); + return -ENOMEM; + } + + rte_ether_addr_copy(&init_repr_data->mac_addr, &repr->mac_addr); + rte_ether_addr_copy(&init_repr_data->mac_addr, eth_dev->data->mac_addrs); + + /* Send reify message to hardware to inform it about the new repr */ + ret = nfp_flower_cmsg_repr_reify(init_repr_data->app_fw_flower, repr); + if (ret != 0) { + PMD_INIT_LOG(WARNING, "Failed to send repr reify message."); + goto mac_cleanup; + } + + /* Allocate memory for extended statistics counters */ + repr->repr_xstats_base = rte_zmalloc("rte_eth_xstat", + sizeof(struct rte_eth_xstat) * nfp_net_xstats_size(eth_dev), 0); + if (repr->repr_xstats_base == NULL) { + PMD_INIT_LOG(ERR, "No memory for xstats base on device %s!", repr->name); + ret = -ENOMEM; + goto mac_cleanup; + } + + return 0; + +mac_cleanup: + rte_free(eth_dev->data->mac_addrs); + return ret; +} + static int nfp_flower_repr_init(struct rte_eth_dev *eth_dev, void *init_params) @@ -654,50 +717,24 @@ nfp_flower_repr_init(struct rte_eth_dev *eth_dev, return -ENOMEM; } - /* Copy data here from the input representor template */ - repr->idx = init_repr_data->idx; - repr->vf_id = init_repr_data->vf_id; - repr->switch_domain_id = init_repr_data->switch_domain_id; - repr->port_id = init_repr_data->port_id; - repr->nfp_idx = init_repr_data->nfp_idx; - repr->repr_type = init_repr_data->repr_type; - repr->app_fw_flower = init_repr_data->app_fw_flower; - - strlcpy(repr->name, init_repr_data->name, sizeof(repr->name)); - eth_dev->dev_ops = &nfp_flower_repr_dev_ops; eth_dev->rx_pkt_burst = nfp_flower_repr_rx_burst; eth_dev->tx_pkt_burst = nfp_flower_repr_tx_burst; eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR | RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; + ret = nfp_flower_repr_base_init(eth_dev, repr, repr_init); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Flower repr base init failed."); + goto ring_cleanup; + } + if (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT) eth_dev->data->representor_id = repr->vf_id; else eth_dev->data->representor_id = repr->vf_id + app_fw_flower->num_phyport_reprs + 1; - /* This backer port is that of the eth_device created for the PF vNIC */ - eth_dev->data->backer_port_id = 0; - - /* Allocating memory for mac addr */ - eth_dev->data->mac_addrs = rte_zmalloc("mac_addr", RTE_ETHER_ADDR_LEN, 0); - if (eth_dev->data->mac_addrs == NULL) { - PMD_INIT_LOG(ERR, "Failed to allocate memory for repr MAC."); - ret = -ENOMEM; - goto ring_cleanup; - } - - rte_ether_addr_copy(&init_repr_data->mac_addr, &repr->mac_addr); - rte_ether_addr_copy(&init_repr_data->mac_addr, eth_dev->data->mac_addrs); - - /* Send reify message to hardware to inform it about the new repr */ - ret = nfp_flower_cmsg_repr_reify(app_fw_flower, repr); - if (ret != 0) { - PMD_INIT_LOG(WARNING, "Failed to send repr reify message."); - goto mac_cleanup; - } - /* Add repr to correct array */ if (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT) { index = NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM(repr->port_id); @@ -712,19 +749,8 @@ nfp_flower_repr_init(struct rte_eth_dev *eth_dev, (repr->nfp_idx * NFP_MAC_STATS_SIZE); } - /* Allocate memory for extended statistics counters */ - repr->repr_xstats_base = rte_zmalloc("rte_eth_xstat", - sizeof(struct rte_eth_xstat) * nfp_net_xstats_size(eth_dev), 0); - if (repr->repr_xstats_base == NULL) { - PMD_INIT_LOG(ERR, "No memory for xstats base on device %s!", repr->name); - ret = -ENOMEM; - goto mac_cleanup; - } - return 0; -mac_cleanup: - rte_free(eth_dev->data->mac_addrs); ring_cleanup: rte_free(repr->ring); diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c index 766583d597..ccfb4b39f1 100644 --- a/drivers/net/nfp/nfp_net_common.c +++ b/drivers/net/nfp/nfp_net_common.c @@ -1039,7 +1039,7 @@ nfp_net_xstats_size(const struct rte_eth_dev *dev) if (rte_eth_dev_is_repr(dev)) { repr = dev->data->dev_private; - if (repr->mac_stats == NULL) + if (nfp_flower_repr_is_vf(repr)) vf_flag = true; } else { hw = dev->data->dev_private; -- 2.39.1