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 B9C6CA0545; Thu, 30 Jun 2022 07:52:12 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 59A5840223; Thu, 30 Jun 2022 07:52:12 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id ABB9F400EF for ; Thu, 30 Jun 2022 07:52:10 +0200 (CEST) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25TLbjSe008800; Wed, 29 Jun 2022 22:52:09 -0700 Received: from nam04-mw2-obe.outbound.protection.outlook.com (mail-mw2nam04lp2176.outbound.protection.outlook.com [104.47.73.176]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3h0kgcc49q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 29 Jun 2022 22:52:09 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QYOP6s1Eil5/4eEM8aN/t+3pj//xGsIiWIrY69wdGDhQby9yIT+AoBNyp6gFzwGUFM2KOd2ZiZOmDsYbJa5uwGji4BiDyeDFtY42rB19/AnXIG70/vVi2OgK7QTkhPtT1vr5VD0zjALJX6DoSw//DY6Xk5v1F8z5VrKl0o9ouhwx3k635vbn5FfYUk1hU41KLs7emxhQYYUP9PX6XwymHFJ1/2SE35O9EiM+MAU3gsXLkQKMqUqOBNVfevo+RwrX3M++0AZyiws6ylc2srfYl2gcxgopzmEsCWtgPX/6U96dKkqJPWR2vfvrXIlOy2rXrTOhPO2HMcKyjV9HIqrlww== 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=qeoJtryrcYvdw4rgLsoZymGbVdCwlRwrMGzplj7F5zQ=; b=hvXL1/BNkrahWuXDGNtMRc7OaWZ3FLRbePHP8Ne+s9IqFdtSmzuf6nFph6Jrjh5VyYr7rE4eFxBHztj5PrUJ2WpXT1kolm18cWChDDdspLnrILZdVoRTLK3KXjh60L46IE4yjN52nJrxpo965ZpdX7YQQ0cZPWZtiGdyRqDpyBbNYd6prMEuj6eyMgYwPmlFsY+FLvrkm//9pSh6JfaRnUeWbtZcOZ2r4D+RkLtFV6Oec78YRkfdwYzF3sSDNrDTjaq0zHcPLf+tHgxCHCmOKBR6baE+m/5MWI+uXRhql3vzDme83XxLiqdk0Ty7nG6UeTCZizddG48QmyAEE9/H+A== 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=qeoJtryrcYvdw4rgLsoZymGbVdCwlRwrMGzplj7F5zQ=; b=iqIBNk6DbYobmtpgx7ZLIXRS2w2YT8bxg7TiObRlY+P6iGGc1jFg2TqPcJFLiP05ioSr62gwTFvwQvfic5PnHGIqyiQez2AVuVxJpZ78zrG6+ELkOR57hcObqUJM5ITSMpsMjKZn0EISHFeKrXy8Tcxigg3tPJRnR6HVzM3Kmy4= Received: from PH0PR18MB5167.namprd18.prod.outlook.com (2603:10b6:510:168::7) by SA1PR18MB4582.namprd18.prod.outlook.com (2603:10b6:806:1d1::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5395.15; Thu, 30 Jun 2022 05:52:06 +0000 Received: from PH0PR18MB5167.namprd18.prod.outlook.com ([fe80::694d:ceb9:bc7b:dbfa]) by PH0PR18MB5167.namprd18.prod.outlook.com ([fe80::694d:ceb9:bc7b:dbfa%5]) with mapi id 15.20.5395.014; Thu, 30 Jun 2022 05:52:06 +0000 From: Amit Prakash Shukla To: Anatoly Burakov , "david.marchand@redhat.com" , "bruce.richardson@intel.com" CC: "dev@dpdk.org" , Jerin Jacob Kollanukkaran Subject: RE: [PATCH v4 1/2] mem: telemetry support for memseg and element information Thread-Topic: [PATCH v4 1/2] mem: telemetry support for memseg and element information Thread-Index: AQHYcCL8vGgRzBvCo0WblTGzoVZTC61O+hGggBivORA= Date: Thu, 30 Jun 2022 05:52:06 +0000 Message-ID: References: <20220519063038.637836-1-amitprakashs@marvell.com> <20220525103352.1806937-1-amitprakashs@marvell.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: abf56d3f-de1b-4bf1-a76e-08da5a5caa19 x-ms-traffictypediagnostic: SA1PR18MB4582:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: yJAGNPzpKF4iMGYEkN6a51slwwYu+/UaoONKEyNP8B4s/Q/DqnxvtqQ93WxVXyUoCqIOPwUY4suwk3qkIMOBDN9Zw64tx4IPAPIBU37nIYcxnarGDRFyQUD0I0+DHcT/Wfs3ywKY8tIB0kx7s1Sm4DnVRlqIpG/urUpzzbQFyiQYgphEhWQFkk0RxB8D3MgtGgTUovmAXherR1bYQTy7oLy+6/6fVW+BeX1yyFHFcUG0qLQPtgLynIirTUZDJ3TjwMJDnXo3c8MJh7typgKxMabzHN4BO9wgrPt8Jfsyve1h5t9QDYTx8rXTtY5TXiCwACWsltP+NFz5qMkdXwxHzJ0ffNtTOuTTajfTci1rKqnW5nNS5IaebSO8WqdczDtE5t8CfjPtdiaF/yk3vUcrr0JMwIMTx58UrMR4DB2pshhHDNobXBnkEhePgJ95pLtPZdRsCyp9JgLA0RPOnJvYQrh0gIaT9iiwNy/wvn+2OHN0xAc70x3ty2ueJqrast/Mm9h4f3pVr+TGx2bOEK0LzKjGo+ym+mtYKcWj9Hr/qNd6BJ79kmxu4D3nB0Dh5jgYDiRaEs9vvCXzqhZPhgEcBPMYXT5/G4NrpVwI9Jiv1niaeb3OwPyiAbBTAq3H5SGxyOgsSa2A1lZkkuUXYpyrWPZL+3qiyjzQPkE9qJGGwf+SPUfikapgHwj7AoH/rBN0TQ0jUZ7p8r6dppttxGDzYQ49u629HgCD1PcJ/JLYpjwaflvBioZTa6tw1Te74GJ/WOevzc8QJtBCBIp/GuMk1LvboJfdQyIrmCo4Oe2fp1F6XY0iho1oVjMFLABlTzVN x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PH0PR18MB5167.namprd18.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230016)(4636009)(39860400002)(396003)(346002)(366004)(136003)(376002)(4326008)(8676002)(122000001)(316002)(38070700005)(55016003)(66946007)(64756008)(76116006)(66556008)(66476007)(66446008)(83380400001)(186003)(71200400001)(26005)(9686003)(30864003)(41300700001)(86362001)(33656002)(5660300002)(2906002)(53546011)(55236004)(110136005)(38100700002)(54906003)(107886003)(8936002)(52536014)(478600001)(7696005)(6506007)(579004); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?1DhgZWkyvyKcfJqMy577PpjpHIUdXoFf8MKGkxHMtgO/CNj6Z8SG0U3ltrZv?= =?us-ascii?Q?u+uclencr9a2id8B+/Bt59Z49kH0Gn4n3JDW9aTt/+4njTAWjrstmoxcuGwK?= =?us-ascii?Q?2QVehDcAqfvH+yI6wFLNBSsy61z3P95XMitAn5RUaZFL0hS2bMNYU1IOXGQC?= =?us-ascii?Q?1O4Jy5bKGnw18oWKuVcAp+ySjwmW4rCq11VQQD7vuR6CcPbPyArMzYvWaxIf?= =?us-ascii?Q?1QqVjLxnBEGrs54rRweAej9Zpu8rYvWL9uYQJGI5PILuwfWv4srrbNBaM00W?= =?us-ascii?Q?fHLpoaItJxGqTBwbyEemgyWOnd/WLpj6kfIqayDrDhVTqpml0zGP0Bdi3s/k?= =?us-ascii?Q?MZSfXUHCnjicaQmGpDAnUD7s90l1oLtRLbo1ojknwzqPk4ETPk56Jn67d3aM?= =?us-ascii?Q?usa1wK12+ljV44HL8oaYaUVUTBlIDQqEHdkGnTwIN/K3Ic6QpHfyx6r2XCWY?= =?us-ascii?Q?cOBMuyjka6z7XX0HTgslbrlBe2Hkne6qhgqSnwpUp+WSY3bchIKVa8xG9xEU?= =?us-ascii?Q?Kwa2EFBLGi0yogy4+CWkqYhbvqj2FbeopO4hCmNV0EhAvk87hCve8EeXZcgO?= =?us-ascii?Q?aHuabgzxu5cIJJfVcsrNHZaQPAJg0eDURK+vzCecrC7Ja1AuOs8COftr2DHJ?= =?us-ascii?Q?8KrZdxCWCH6RWLmnJFobSY9aGHcmUhtJxnx2UTe9FIBcEJBaYdorH3zoFbII?= =?us-ascii?Q?qEy+euWccATWwEbtbs+YszWByP7ZdF8725CcFfXLhWNioHXGqQD8bm73RZnN?= =?us-ascii?Q?l4vHhB17jEYjrBwaUL98Dh6CRii9zHw1AiAS4opjTbsdAkNu57xLhN45NcGH?= =?us-ascii?Q?P+aqwH+4/hLLulkfdlEOM7a0IC5SaAU1AEnHkhJDB/trwW8FTMshzdlyhCt2?= =?us-ascii?Q?mdt3xY81AaqHsJnr1dR0Wk6Hz1iPAw5myKdYwg8oR+65C+1N9lWhO7FSEAyp?= =?us-ascii?Q?fyPbWFCDQdeUAdbWi16y5kOK2Am8G07k/Q/4ZoEcuX7clmMi0fmZiaXxQvE6?= =?us-ascii?Q?T3Oj9Tt4pZRVD/5ILpwpqNnktYdkD0Sxsb7I3bZBNWQX2tzfMCvkYc0gOIOt?= =?us-ascii?Q?rDOkevwT3WMfjFhESk6lcAGPDcQoqvplxm31y+PEaCAXWhtNrt5HaaleT01D?= =?us-ascii?Q?5dqdddxfoPUUUGK28qsHTs/oEWU/YQig7bO6ASe/ff/O025hAQQzy6NffHJ+?= =?us-ascii?Q?ZLQqg+zPE46p17FWGiYIz3/OjNooWmwOzOl2aWR8Khzbr1IVdDEBGPEI98wK?= =?us-ascii?Q?kUTrHMkbLAPnVcJ+oxjhbTJf3vOdg1DaQ1OQjiLGox/8r/16mdiXjSmffQD4?= =?us-ascii?Q?WjYdh87Hbdt3D5V9VGehUU5ssDfbRsZDdTNuhjS2+dXCM6W/XwchfdTqDx31?= =?us-ascii?Q?K1bCIwoFqc8vbFNs7wL5ek3J+cghsIJYYxsptsTVvD5k0Aal/oNYNJPhCGnh?= =?us-ascii?Q?G7ZM6wYl8YKmrk4Gs7XIgULdAwqYbr9scp/ycuHnSPWfBFoYlxwjn6JOeA9t?= =?us-ascii?Q?zVkSvm+hNBK+9vW276BYACEpSq+vLY+UcvIHujvsBIKK3GQTjMwnX5UOOSTy?= =?us-ascii?Q?occWb4HLO6RRgB8t4tk5SUaoHRpyKA5dKP6JH8Fv?= 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: PH0PR18MB5167.namprd18.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: abf56d3f-de1b-4bf1-a76e-08da5a5caa19 X-MS-Exchange-CrossTenant-originalarrivaltime: 30 Jun 2022 05:52:06.3489 (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: WOs7fnsvFbuSDzB/wuUsflDA5FfQ5F16zbYy8F1EeUoKDH4SbgOmVNPz7aCbHUbEwDqbM1/rd9jah6MAXhhMl8ZG4mMSIxNCotfCSPstpic= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR18MB4582 X-Proofpoint-GUID: R1Kl4DuakE2Nvr2mlcgF7Hyz1wMsEF28 X-Proofpoint-ORIG-GUID: R1Kl4DuakE2Nvr2mlcgF7Hyz1wMsEF28 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-06-30_02,2022-06-28_01,2022-06-22_01 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 Ping. > -----Original Message----- > From: Amit Prakash Shukla > Sent: Tuesday, June 14, 2022 6:21 PM > To: Amit Prakash Shukla ; Anatoly Burakov > > Cc: dev@dpdk.org; Jerin Jacob Kollanukkaran ; > bruce.richardson@intel.com > Subject: RE: [PATCH v4 1/2] mem: telemetry support for memseg and > element information >=20 > Ping. >=20 > > -----Original Message----- > > From: Amit Prakash Shukla > > Sent: Wednesday, May 25, 2022 4:04 PM > > To: Anatoly Burakov > > Cc: dev@dpdk.org; Jerin Jacob Kollanukkaran ; > > bruce.richardson@intel.com; Amit Prakash Shukla > > > > Subject: [PATCH v4 1/2] mem: telemetry support for memseg and element > > information > > > > Changes adds telemetry support to display memory occupancy in memseg > > and the information of the elements allocated from a memseg based on > > arguments provided by user. This patch adds following endpoints: > > > > 1. /eal/memseg_list_array > > The command displays the memseg list from which the memory has been > > allocated. > > Example: > > --> /eal/memseg_list_array > > {"/eal/memseg_list_array": [0, 1]} > > > > 2. /eal/memseg_list_info, > > The command outputs the memsegs, from which the memory is allocated, > > for the memseg_list given as input. Command also supports help. > > Example: > > --> /eal/memseg_list_info,help > > {"/eal/memseg_list_info": "/eal/memseg_list_info,"} > > > > --> /eal/memseg_list_info,1 > > {"/eal/memseg_list_info": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, \ > > 12, 13, 14, 15]} > > > > 3. /eal/memseg_info,, > > The command outputs the memseg information based on the memseg-list > > and the memseg-id given as input. Command also supports help. > > Example: > > --> /eal/memseg_info,help > > {"/eal/memseg_info": "/eal/memseg_info,, \ > id>"} > > > > --> /eal/memseg_info,0,10 > > {"/eal/memseg_info": {"Memseg_list_index": 0, \ > > "Memseg_index": 10, "Memseg_list_len": 64, \ > > "Start_addr": "0x260000000", "End_addr": "0x280000000", \ > > "Size": 536870912}} > > > > --> /eal/memseg_info,1,15 > > {"/eal/memseg_info": {"Memseg_list_index": 1, \ > > "Memseg_index": 15, "Memseg_list_len": 64, \ > > "Start_addr": "0xb20000000", "End_addr": "0xb40000000", \ > > "Size": 536870912}} > > > > 4. /eal/element_list,,, > > The command outputs number of elements in a memseg based on the > heap- > > id, memseg-list-id and memseg-id given as input. > > Command also supports help. > > Example: > > --> /eal/element_list,help > > {"/eal/element_list": "/eal/element_list,, \ > id>,"} > > > > --> /eal/element_list,0,0,63 > > {"/eal/element_list": {"Element_count": 52}} > > > > --> /eal/element_list,0,1,15 > > {"/eal/element_list": {"Element_count": 52}} > > > > 5. /eal/element_info,,,, \ > > , > > The command outputs element information like element start address, > > end address, to which memseg it belongs, element state, element size. > > User can give a range of elements to be printed. Command also supports > help. > > Example: > > --> /eal/element_info,help > > {"/eal/element_info": "/eal/element_info,, \ > id>,,,"} > > > > --> /eal/element_info,0,1,15,1,2 > > {"/eal/element_info": {"element.1": {"msl_id": 1, \ > > "ms_id": 15, "memseg_start_addr": "0xb20000000", \ > > "memseg_end_addr": "0xb40000000", \ > > "element_start_addr": "0xb201fe680", \ > > "element_end_addr": "0xb20bfe700", \ > > "element_size": 10485888, "element_state": "Busy"}, \ > > "element.2": {"msl_id": 1, "ms_id": 15, \ > > "memseg_start_addr": "0xb20000000", \ > > "memseg_end_addr": "0xb40000000", \ > > "element_start_addr": "0xb20bfe700", \ > > "element_end_addr": "0xb215fe780", "element_size": 10485888, \ > > "element_state": "Busy"}, "Element_count": 2}} > > > > Signed-off-by: Amit Prakash Shukla > > --- > > v2: > > - Fixed compilation error related int-to-pointer-cast > > - Changes for code review suggestions > > > > v3: > > - Commit message changes > > - Renaming end-points > > - Changing input parameters to comma-seperated > > - Reverting telemetry output buffer size > > > > v4: > > - Patch-2 adds telemetry support to display system memory > > > > lib/eal/common/eal_common_memory.c | 482 > > ++++++++++++++++++++++++++++- > > 1 file changed, 477 insertions(+), 5 deletions(-) > > > > diff --git a/lib/eal/common/eal_common_memory.c > > b/lib/eal/common/eal_common_memory.c > > index 688dc615d7..e66de6a872 100644 > > --- a/lib/eal/common/eal_common_memory.c > > +++ b/lib/eal/common/eal_common_memory.c > > @@ -26,6 +26,7 @@ > > #include "eal_memcfg.h" > > #include "eal_options.h" > > #include "malloc_heap.h" > > +#include "malloc_elem.h" > > > > /* > > * Try to mmap *size bytes in /dev/zero. If it is successful, return > > the @@ - > > 1113,11 +1114,17 @@ rte_eal_memory_init(void) } > > > > #ifndef RTE_EXEC_ENV_WINDOWS > > -#define EAL_MEMZONE_LIST_REQ "/eal/memzone_list" > > -#define EAL_MEMZONE_INFO_REQ "/eal/memzone_info" > > -#define EAL_HEAP_LIST_REQ "/eal/heap_list" > > -#define EAL_HEAP_INFO_REQ "/eal/heap_info" > > -#define ADDR_STR 15 > > +#define EAL_MEMZONE_LIST_REQ "/eal/memzone_list" > > +#define EAL_MEMZONE_INFO_REQ > "/eal/memzone_info" > > +#define EAL_HEAP_LIST_REQ "/eal/heap_list" > > +#define EAL_HEAP_INFO_REQ "/eal/heap_info" > > +#define EAL_MEMSEG_LIST_ARR_REQ > > "/eal/memseg_list_array" > > +#define EAL_MEMSEG_LIST_INFO_REQ "/eal/memseg_list_info" > > +#define EAL_MEMSEG_INFO_REQ "/eal/memseg_info" > > +#define EAL_ELEMENT_LIST_REQ "/eal/element_list" > > +#define EAL_ELEMENT_INFO_REQ "/eal/element_info" > > +#define ADDR_STR 15 > > + > > > > /* Telemetry callback handler to return heap stats for requested heap > > id. */ static int @@ -1265,6 +1272,454 @@ > > handle_eal_memzone_list_request(const char *cmd __rte_unused, > > return 0; > > } > > > > +static int > > +handle_eal_memseg_list_array_request(const char *cmd __rte_unused, > > + const char *params __rte_unused, > > + struct rte_tel_data *d) > > +{ > > + struct rte_mem_config *mcfg; > > + int i; > > + > > + rte_tel_data_start_array(d, RTE_TEL_INT_VAL); > > + > > + rte_mcfg_mem_read_lock(); > > + mcfg =3D rte_eal_get_configuration()->mem_config; > > + > > + for (i =3D 0; i < RTE_MAX_MEMSEG_LISTS; i++) { > > + struct rte_memseg_list *msl =3D &mcfg->memsegs[i]; > > + if (msl->memseg_arr.count =3D=3D 0) > > + continue; > > + > > + rte_tel_data_add_array_int(d, i); > > + } > > + rte_mcfg_mem_read_unlock(); > > + > > + return 0; > > +} > > + > > +static int > > +handle_eal_memseg_list_info_request(const char *cmd __rte_unused, > > + const char *params, struct rte_tel_data *d) > > { > > + struct rte_mem_config *mcfg; > > + struct rte_memseg_list *msl; > > + struct rte_fbarray *arr; > > + uint32_t ms_list_idx; > > + int ms_idx; > > + > > + if (params =3D=3D NULL || strlen(params) =3D=3D 0) > > + return -1; > > + > > + if (strncasecmp(params, "help", strlen(params)) =3D=3D 0) { > > + char buff[RTE_TEL_MAX_SINGLE_STRING_LEN]; > > + snprintf(buff, RTE_TEL_MAX_SINGLE_STRING_LEN, > > + "%s,", > > EAL_MEMSEG_LIST_INFO_REQ); > > + rte_tel_data_string(d, buff); > > + return 0; > > + } > > + > > + if (!isdigit(*params)) > > + return -1; > > + > > + ms_list_idx =3D strtoul(params, NULL, 10); > > + if (ms_list_idx >=3D RTE_MAX_MEMSEG_LISTS) > > + return -1; > > + > > + rte_tel_data_start_array(d, RTE_TEL_INT_VAL); > > + > > + rte_mcfg_mem_read_lock(); > > + mcfg =3D rte_eal_get_configuration()->mem_config; > > + msl =3D &mcfg->memsegs[ms_list_idx]; > > + if (msl->memseg_arr.count =3D=3D 0) > > + goto done; > > + > > + arr =3D &msl->memseg_arr; > > + > > + ms_idx =3D rte_fbarray_find_next_used(arr, 0); > > + while (ms_idx >=3D 0) { > > + rte_tel_data_add_array_int(d, ms_idx); > > + ms_idx =3D rte_fbarray_find_next_used(arr, ms_idx + 1); > > + } > > + > > +done: > > + rte_mcfg_mem_read_unlock(); > > + > > + return 0; > > +} > > + > > +static int > > +handle_eal_memseg_info_request(const char *cmd __rte_unused, > > + const char *params, struct rte_tel_data *d) { > > + struct rte_mem_config *mcfg; > > + uint64_t ms_start_addr, ms_end_addr, ms_size; > > + struct rte_memseg_list *msl; > > + const struct rte_memseg *ms; > > + struct rte_fbarray *arr; > > + char addr[ADDR_STR]; > > + uint32_t ms_list_idx =3D 0; > > + uint32_t ms_idx =3D 0; > > + uint32_t msl_len; > > + char dlim[2] =3D ","; > > + char *token; > > + char *params_args; > > + > > + if (params =3D=3D NULL || strlen(params) =3D=3D 0) > > + return -1; > > + > > + if (strncasecmp(params, "help", strlen(params)) =3D=3D 0) { > > + char buff[RTE_TEL_MAX_SINGLE_STRING_LEN]; > > + snprintf(buff, RTE_TEL_MAX_SINGLE_STRING_LEN, > > + "%s,,", > > + EAL_MEMSEG_INFO_REQ); > > + rte_tel_data_string(d, buff); > > + return 0; > > + } > > + > > + /* strtok expects char * and param is const char *. Hence on using > > + * params as "const char *" compiler throws warning. > > + */ > > + params_args =3D strdup(params); > > + token =3D strtok(params_args, dlim); > > + if (token =3D=3D NULL || !isdigit(*token)) { > > + free(params_args); > > + return -1; > > + } > > + > > + ms_list_idx =3D strtoul(token, NULL, 10); > > + if (ms_list_idx >=3D RTE_MAX_MEMSEG_LISTS) { > > + free(params_args); > > + return -1; > > + } > > + > > + token =3D strtok(NULL, dlim); > > + if (token =3D=3D NULL || !isdigit(*token)) { > > + free(params_args); > > + return -1; > > + } > > + ms_idx =3D strtoul(token, NULL, 10); > > + > > + free(params_args); > > + > > + rte_mcfg_mem_read_lock(); > > + > > + mcfg =3D rte_eal_get_configuration()->mem_config; > > + msl =3D &mcfg->memsegs[ms_list_idx]; > > + if (msl->memseg_arr.count =3D=3D 0) { > > + rte_mcfg_mem_read_unlock(); > > + return -1; > > + } > > + > > + arr =3D &msl->memseg_arr; > > + msl_len =3D arr->len; > > + > > + ms =3D rte_fbarray_get(arr, ms_idx); > > + if (ms =3D=3D NULL) { > > + rte_mcfg_mem_read_unlock(); > > + RTE_LOG(DEBUG, EAL, "Error fetching requested > > memseg.\n"); > > + return -1; > > + } > > + > > + ms_start_addr =3D ms->addr_64; > > + ms_end_addr =3D (uint64_t)RTE_PTR_ADD(ms_start_addr, ms->len); > > + ms_size =3D ms->hugepage_sz; > > + > > + rte_mcfg_mem_read_unlock(); > > + > > + rte_tel_data_start_dict(d); > > + rte_tel_data_add_dict_int(d, "Memseg_list_index", ms_list_idx); > > + rte_tel_data_add_dict_int(d, "Memseg_index", ms_idx); > > + rte_tel_data_add_dict_int(d, "Memseg_list_len", msl_len); > > + snprintf(addr, ADDR_STR, "0x%"PRIx64, ms_start_addr); > > + rte_tel_data_add_dict_string(d, "Start_addr", addr); > > + snprintf(addr, ADDR_STR, "0x%"PRIx64, ms_end_addr); > > + rte_tel_data_add_dict_string(d, "End_addr", addr); > > + rte_tel_data_add_dict_int(d, "Size", ms_size); > > + > > + return 0; > > +} > > + > > +static int > > +handle_eal_element_list_request(const char *cmd __rte_unused, > > + const char *params, struct rte_tel_data *d) { > > + struct rte_mem_config *mcfg; > > + struct rte_memseg_list *msl; > > + const struct rte_memseg *ms; > > + struct malloc_elem *elem; > > + struct malloc_heap *heap; > > + uint64_t ms_start_addr, ms_end_addr; > > + uint64_t elem_start_addr, elem_end_addr; > > + uint32_t ms_list_idx =3D 0; > > + uint32_t heap_id =3D 0; > > + uint32_t ms_idx =3D 0; > > + char dlim[2] =3D ","; > > + int elem_count =3D 0; > > + char *token; > > + char *params_args; > > + > > + if (params =3D=3D NULL || strlen(params) =3D=3D 0) > > + return -1; > > + > > + if (strncasecmp(params, "help", strlen(params)) =3D=3D 0) { > > + char buff[RTE_TEL_MAX_SINGLE_STRING_LEN]; > > + snprintf(buff, RTE_TEL_MAX_SINGLE_STRING_LEN, > > + "%s,,,", > > + EAL_ELEMENT_LIST_REQ); > > + rte_tel_data_string(d, buff); > > + return 0; > > + } > > + > > + /* strtok expects char * and param is const char *. Hence on using > > + * params as "const char *" compiler throws warning. > > + */ > > + params_args =3D strdup(params); > > + token =3D strtok(params_args, dlim); > > + if (token =3D=3D NULL || !isdigit(*token)) { > > + free(params_args); > > + return -1; > > + } > > + > > + heap_id =3D strtoul(token, NULL, 10); > > + if (heap_id >=3D RTE_MAX_HEAPS) { > > + free(params_args); > > + return -1; > > + } > > + > > + token =3D strtok(NULL, dlim); > > + if (token =3D=3D NULL || !isdigit(*token)) { > > + free(params_args); > > + return -1; > > + } > > + > > + ms_list_idx =3D strtoul(token, NULL, 10); > > + if (ms_list_idx >=3D RTE_MAX_MEMSEG_LISTS) { > > + free(params_args); > > + return -1; > > + } > > + > > + token =3D strtok(NULL, dlim); > > + if (token =3D=3D NULL || !isdigit(*token)) { > > + free(params_args); > > + return -1; > > + } > > + > > + ms_idx =3D strtoul(token, NULL, 10); > > + > > + free(params_args); > > + > > + rte_mcfg_mem_read_lock(); > > + > > + mcfg =3D rte_eal_get_configuration()->mem_config; > > + msl =3D &mcfg->memsegs[ms_list_idx]; > > + ms =3D rte_fbarray_get(&msl->memseg_arr, ms_idx); > > + if (ms =3D=3D NULL) { > > + rte_mcfg_mem_read_unlock(); > > + RTE_LOG(DEBUG, EAL, "Error fetching requested > > memseg.\n"); > > + return -1; > > + } > > + > > + ms_start_addr =3D ms->addr_64; > > + ms_end_addr =3D (uint64_t)RTE_PTR_ADD(ms_start_addr, ms->len); > > + rte_mcfg_mem_read_unlock(); > > + > > + rte_tel_data_start_dict(d); > > + > > + heap =3D &mcfg->malloc_heaps[heap_id]; > > + rte_spinlock_lock(&heap->lock); > > + > > + elem =3D heap->first; > > + while (elem) { > > + elem_start_addr =3D (uint64_t)elem; > > + elem_end_addr =3D > > + (uint64_t)RTE_PTR_ADD(elem_start_addr, elem- > > >size); > > + > > + if ((uint64_t)elem_start_addr >=3D ms_start_addr && > > + (uint64_t)elem_end_addr <=3D ms_end_addr) > > + elem_count++; > > + elem =3D elem->next; > > + } > > + > > + rte_spinlock_unlock(&heap->lock); > > + > > + rte_tel_data_add_dict_int(d, "Element_count", elem_count); > > + > > + return 0; > > +} > > + > > +static int > > +handle_eal_element_info_request(const char *cmd __rte_unused, > > + const char *params, struct rte_tel_data *d) { > > + struct rte_mem_config *mcfg; > > + struct rte_memseg_list *msl; > > + const struct rte_memseg *ms; > > + struct malloc_elem *elem; > > + struct malloc_heap *heap; > > + struct rte_tel_data *c; > > + uint64_t ms_start_addr, ms_end_addr; > > + uint64_t elem_start_addr, elem_end_addr; > > + uint32_t ms_list_idx =3D 0; > > + uint32_t heap_id =3D 0; > > + uint32_t ms_idx =3D 0; > > + uint32_t start_elem =3D 0, end_elem =3D 0; > > + uint32_t count =3D 0, elem_count =3D 0; > > + char dlim[2] =3D ","; > > + char str[ADDR_STR]; > > + char *params_args; > > + char *token; > > + > > + if (params =3D=3D NULL || strlen(params) =3D=3D 0) > > + return -1; > > + > > + if (strncasecmp(params, "help", strlen(params)) =3D=3D 0) { > > + char buff[RTE_TEL_MAX_SINGLE_STRING_LEN]; > > + snprintf(buff, RTE_TEL_MAX_SINGLE_STRING_LEN, > > + "%s,,,," > > + ",", > > + EAL_ELEMENT_INFO_REQ); > > + rte_tel_data_string(d, buff); > > + return 0; > > + } > > + > > + /* strtok expects char * and param is const char *. Hence on using > > + * params as "const char *" compiler throws warning. > > + */ > > + params_args =3D strdup(params); > > + token =3D strtok(params_args, dlim); > > + if (token =3D=3D NULL || !isdigit(*token)) { > > + free(params_args); > > + return -1; > > + } > > + > > + heap_id =3D strtoul(token, NULL, 10); > > + if (heap_id >=3D RTE_MAX_HEAPS) { > > + free(params_args); > > + return -1; > > + } > > + > > + token =3D strtok(NULL, dlim); > > + if (token =3D=3D NULL || !isdigit(*token)) { > > + free(params_args); > > + return -1; > > + } > > + > > + ms_list_idx =3D strtoul(token, NULL, 10); > > + if (ms_list_idx >=3D RTE_MAX_MEMSEG_LISTS) { > > + free(params_args); > > + return -1; > > + } > > + > > + token =3D strtok(NULL, dlim); > > + if (token =3D=3D NULL || !isdigit(*token)) { > > + free(params_args); > > + return -1; > > + } > > + > > + ms_idx =3D strtoul(token, NULL, 10); > > + > > + token =3D strtok(NULL, dlim); > > + if (token =3D=3D NULL || !isdigit(*token)) { > > + free(params_args); > > + return -1; > > + } > > + > > + start_elem =3D strtoul(token, NULL, 10); > > + > > + token =3D strtok(NULL, dlim); > > + if (token =3D=3D NULL || !isdigit(*token)) { > > + free(params_args); > > + return -1; > > + } > > + > > + end_elem =3D strtoul(token, NULL, 10); > > + > > + free(params_args); > > + > > + if (end_elem < start_elem) > > + return -1; > > + > > + rte_mcfg_mem_read_lock(); > > + > > + mcfg =3D rte_eal_get_configuration()->mem_config; > > + msl =3D &mcfg->memsegs[ms_list_idx]; > > + ms =3D rte_fbarray_get(&msl->memseg_arr, ms_idx); > > + if (ms =3D=3D NULL) { > > + rte_mcfg_mem_read_unlock(); > > + RTE_LOG(DEBUG, EAL, "Error fetching requested > > memseg.\n"); > > + return -1; > > + } > > + > > + ms_start_addr =3D ms->addr_64; > > + ms_end_addr =3D (uint64_t)RTE_PTR_ADD(ms_start_addr, ms->len); > > + > > + rte_mcfg_mem_read_unlock(); > > + > > + rte_tel_data_start_dict(d); > > + > > + heap =3D &mcfg->malloc_heaps[heap_id]; > > + rte_spinlock_lock(&heap->lock); > > + > > + elem =3D heap->first; > > + while (elem) { > > + elem_start_addr =3D (uint64_t)elem; > > + elem_end_addr =3D > > + (uint64_t)RTE_PTR_ADD(elem_start_addr, elem- > > >size); > > + > > + if (elem_start_addr < ms_start_addr || > > + elem_end_addr > ms_end_addr) { > > + elem =3D elem->next; > > + continue; > > + } > > + > > + if (count < start_elem) { > > + elem =3D elem->next; > > + count++; > > + continue; > > + } > > + > > + c =3D rte_tel_data_alloc(); > > + if (c =3D=3D NULL) > > + break; > > + > > + rte_tel_data_start_dict(c); > > + rte_tel_data_add_dict_int(c, "msl_id", ms_list_idx); > > + rte_tel_data_add_dict_int(c, "ms_id", ms_idx); > > + snprintf(str, ADDR_STR, "0x%"PRIx64, ms_start_addr); > > + rte_tel_data_add_dict_string(c, "memseg_start_addr", str); > > + snprintf(str, ADDR_STR, "0x%"PRIx64, ms_end_addr); > > + rte_tel_data_add_dict_string(c, "memseg_end_addr", str); > > + snprintf(str, ADDR_STR, "0x%"PRIx64, elem_start_addr); > > + rte_tel_data_add_dict_string(c, "element_start_addr", str); > > + snprintf(str, ADDR_STR, "0x%"PRIx64, elem_end_addr); > > + rte_tel_data_add_dict_string(c, "element_end_addr", str); > > + rte_tel_data_add_dict_int(c, "element_size", elem->size); > > + snprintf(str, ADDR_STR, "%s", elem->state =3D=3D 0 ? "Free" : > > + elem->state =3D=3D 1 ? "Busy" : elem->state =3D=3D 2 ? > > + "Pad" : "Error"); > > + rte_tel_data_add_dict_string(c, "element_state", str); > > + > > + snprintf(str, ADDR_STR, "%s.%u", "element", count); > > + if (rte_tel_data_add_dict_container(d, str, c, 0) !=3D 0) { > > + rte_tel_data_free(c); > > + break; > > + } > > + > > + elem_count++; > > + count++; > > + if (count > end_elem) > > + break; > > + > > + elem =3D elem->next; > > + } > > + > > + rte_spinlock_unlock(&heap->lock); > > + > > + rte_tel_data_add_dict_int(d, "Element_count", elem_count); > > + > > + return 0; > > +} > > + > > RTE_INIT(memory_telemetry) > > { > > rte_telemetry_register_cmd( > > @@ -1279,5 +1734,22 @@ RTE_INIT(memory_telemetry) > > rte_telemetry_register_cmd( > > EAL_HEAP_INFO_REQ, > > handle_eal_heap_info_request, > > "Returns malloc heap stats. Parameters: int > heap_id"); > > + rte_telemetry_register_cmd( > > + EAL_MEMSEG_LIST_ARR_REQ, > > + handle_eal_memseg_list_array_request, > > + "Returns hugepage list. Takes no parameters"); > > + rte_telemetry_register_cmd( > > + EAL_MEMSEG_LIST_INFO_REQ, > > + handle_eal_memseg_list_info_request, > > + "Returns memseg list. Parameters: int > > memseg_list_id"); > > + rte_telemetry_register_cmd( > > + EAL_MEMSEG_INFO_REQ, > > handle_eal_memseg_info_request, > > + "Returns memseg info. Parameter: int > > memseg_list_id,int memseg_id"); > > + rte_telemetry_register_cmd(EAL_ELEMENT_LIST_REQ, > > + handle_eal_element_list_request, > > + "Returns element info. Parameters: int heap_id, int > > memseg_list_id, int memseg_id"); > > + rte_telemetry_register_cmd(EAL_ELEMENT_INFO_REQ, > > + handle_eal_element_info_request, > > + "Returns element info. Parameters: int heap_id, > > memseg_list_id, > > +memseg_id, start_elem_id, end_elem_id"); > > } > > #endif > > -- > > 2.25.1