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 E43C6432E4; Thu, 9 Nov 2023 13:27:06 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D1F5B402E5; Thu, 9 Nov 2023 13:27:06 +0100 (CET) Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) by mails.dpdk.org (Postfix) with ESMTP id 1F48A40267 for ; Thu, 9 Nov 2023 13:27:05 +0100 (CET) Received: from kwepemm000004.china.huawei.com (unknown [172.30.72.53]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4SR1LK74QxzMmPd; Thu, 9 Nov 2023 20:22:33 +0800 (CST) Received: from [10.67.121.59] (10.67.121.59) by kwepemm000004.china.huawei.com (7.193.23.18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.31; Thu, 9 Nov 2023 20:27:03 +0800 Message-ID: <2191ca3c-ad30-7734-529b-2a5a4cc0ab63@huawei.com> Date: Thu, 9 Nov 2023 20:27:02 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.2.0 Subject: Re: [RESEND v7 3/3] ring: add telemetry cmd for ring info To: Jie Hai , , , , , , , CC: , References: <20230117091049.20194-1-haijie1@huawei.com> <20231109102046.1277893-1-haijie1@huawei.com> <20231109102046.1277893-4-haijie1@huawei.com> From: "lihuisong (C)" In-Reply-To: <20231109102046.1277893-4-haijie1@huawei.com> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [10.67.121.59] X-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To kwepemm000004.china.huawei.com (7.193.23.18) X-CFilter-Loop: Reflected 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 Acked-by: Huisong Li 在 2023/11/9 18:20, Jie Hai 写道: > This patch supports dump of ring information by its name. > An example using this command is shown below: > > --> /ring/info,MP_mb_pool_0 > { > "/ring/info": { > "name": "MP_mb_pool_0", > "socket": 0, > "flags": "0x0", > "producer_type": "MP", > "consumer_type": "MC", > "size": 262144, > "mask": "0x3ffff", > "capacity": 262143, > "used_count": 153197, > "mz_name": "RG_MP_mb_pool_0", > "mz_len": 2097536, > "mz_hugepage_sz": 1073741824, > "mz_socket_id": 0, > "mz_flags": "0x0" > } > } > > Signed-off-by: Jie Hai > Reviewed-by: Honnappa Nagarahalli > Acked-by: Konstantin Ananyev > Acked-by: Huisong Li > Acked-by: Chengwen Feng > Acked-by: Morten Brørup > --- > lib/ring/rte_ring.c | 95 +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 95 insertions(+) > > diff --git a/lib/ring/rte_ring.c b/lib/ring/rte_ring.c > index 6a10280fb093..5ee15037548e 100644 > --- a/lib/ring/rte_ring.c > +++ b/lib/ring/rte_ring.c > @@ -453,8 +453,103 @@ ring_handle_list(const char *cmd __rte_unused, > return 0; > } > > +static const char * > +ring_prod_sync_type_to_name(struct rte_ring *r) > +{ > + switch (r->prod.sync_type) { > + case RTE_RING_SYNC_MT: > + return "MP"; > + case RTE_RING_SYNC_ST: > + return "SP"; > + case RTE_RING_SYNC_MT_RTS: > + return "MP_RTS"; > + case RTE_RING_SYNC_MT_HTS: > + return "MP_HTS"; > + default: > + return "Unknown"; > + } > +} > + > +static const char * > +ring_cons_sync_type_to_name(struct rte_ring *r) > +{ > + switch (r->cons.sync_type) { > + case RTE_RING_SYNC_MT: > + return "MC"; > + case RTE_RING_SYNC_ST: > + return "SC"; > + case RTE_RING_SYNC_MT_RTS: > + return "MC_RTS"; > + case RTE_RING_SYNC_MT_HTS: > + return "MC_HTS"; > + default: > + return "Unknown"; > + } > +} > + > +struct ring_info_cb_arg { > + char *ring_name; > + struct rte_tel_data *d; > +}; > + > +static void > +ring_info_cb(struct rte_ring *r, void *arg) > +{ > + struct ring_info_cb_arg *ring_arg = (struct ring_info_cb_arg *)arg; > + struct rte_tel_data *d = ring_arg->d; > + const struct rte_memzone *mz; > + > + if (strncmp(r->name, ring_arg->ring_name, RTE_RING_NAMESIZE)) > + return; > + > + rte_tel_data_add_dict_string(d, "name", r->name); > + rte_tel_data_add_dict_int(d, "socket", r->memzone->socket_id); > + rte_tel_data_add_dict_uint_hex(d, "flags", r->flags, 0); > + rte_tel_data_add_dict_string(d, "producer_type", > + ring_prod_sync_type_to_name(r)); > + rte_tel_data_add_dict_string(d, "consumer_type", > + ring_cons_sync_type_to_name(r)); > + rte_tel_data_add_dict_uint(d, "size", r->size); > + rte_tel_data_add_dict_uint_hex(d, "mask", r->mask, 0); > + rte_tel_data_add_dict_uint(d, "capacity", r->capacity); > + rte_tel_data_add_dict_uint(d, "used_count", rte_ring_count(r)); > + > + mz = r->memzone; > + if (mz == NULL) > + return; > + rte_tel_data_add_dict_string(d, "mz_name", mz->name); > + rte_tel_data_add_dict_uint(d, "mz_len", mz->len); > + rte_tel_data_add_dict_uint(d, "mz_hugepage_sz", mz->hugepage_sz); > + rte_tel_data_add_dict_int(d, "mz_socket_id", mz->socket_id); > + rte_tel_data_add_dict_uint_hex(d, "mz_flags", mz->flags, 0); > +} > + > +static int > +ring_handle_info(const char *cmd __rte_unused, const char *params, > + struct rte_tel_data *d) > +{ > + char name[RTE_RING_NAMESIZE] = {0}; > + struct ring_info_cb_arg ring_arg; > + > + if (params == NULL || strlen(params) == 0 || > + strlen(params) >= RTE_RING_NAMESIZE) > + return -EINVAL; > + > + rte_strlcpy(name, params, RTE_RING_NAMESIZE); > + > + ring_arg.ring_name = name; > + ring_arg.d = d; > + > + rte_tel_data_start_dict(d); > + ring_walk(ring_info_cb, &ring_arg); > + > + return 0; > +} > + > RTE_INIT(ring_init_telemetry) > { > rte_telemetry_register_cmd("/ring/list", ring_handle_list, > "Returns list of available rings. Takes no parameters"); > + rte_telemetry_register_cmd("/ring/info", ring_handle_info, > + "Returns ring info. Parameters: ring_name."); > }