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 397E8431DC; Mon, 23 Oct 2023 06:11:25 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C335740284; Mon, 23 Oct 2023 06:11:24 +0200 (CEST) Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by mails.dpdk.org (Postfix) with ESMTP id 5EAAD40262 for ; Mon, 23 Oct 2023 06:11:22 +0200 (CEST) Received: from dggpeml100024.china.huawei.com (unknown [172.30.72.57]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4SDM8z6rKdzVllX; Mon, 23 Oct 2023 12:07:31 +0800 (CST) Received: from localhost.localdomain (10.50.163.32) by dggpeml100024.china.huawei.com (7.185.36.115) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.31; Mon, 23 Oct 2023 12:11:19 +0800 From: Chengwen Feng To: , CC: Subject: [PATCH] eal: support lcore usage ratio Date: Mon, 23 Oct 2023 04:08:11 +0000 Message-ID: <20231023040811.46038-1-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.50.163.32] X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) To dggpeml100024.china.huawei.com (7.185.36.115) 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 Current, the lcore usage only display two key fields: busy_cycles and total_cycles, which is inconvenient to obtain the usage ratio immediately. So adds lcore usage ratio field. Signed-off-by: Chengwen Feng --- lib/eal/common/eal_common_lcore.c | 34 ++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/lib/eal/common/eal_common_lcore.c b/lib/eal/common/eal_common_lcore.c index ceda714ca5..d1d0da2dd0 100644 --- a/lib/eal/common/eal_common_lcore.c +++ b/lib/eal/common/eal_common_lcore.c @@ -446,6 +446,12 @@ rte_lcore_register_usage_cb(rte_lcore_usage_cb cb) lcore_usage_cb = cb; } +static float +calc_usage_ratio(const struct rte_lcore_usage *usage) +{ + return (usage->busy_cycles * 100.0) / (usage->total_cycles == 0 ? 1 : usage->total_cycles); +} + static int lcore_dump_cb(unsigned int lcore_id, void *arg) { @@ -462,8 +468,9 @@ lcore_dump_cb(unsigned int lcore_id, void *arg) /* Guard against concurrent modification of lcore_usage_cb. */ usage_cb = lcore_usage_cb; if (usage_cb != NULL && usage_cb(lcore_id, &usage) == 0) { - if (asprintf(&usage_str, ", busy cycles %"PRIu64"/%"PRIu64, - usage.busy_cycles, usage.total_cycles) < 0) { + if (asprintf(&usage_str, ", busy cycles %"PRIu64"/%"PRIu64" (ratio %.3f%%)", + usage.busy_cycles, usage.total_cycles, + calc_usage_ratio(&usage)) < 0) { return -ENOMEM; } } @@ -511,11 +518,19 @@ struct lcore_telemetry_info { struct rte_tel_data *d; }; +static void +format_usage_ratio(char *buf, uint16_t size, const struct rte_lcore_usage *usage) +{ + float ratio = calc_usage_ratio(usage); + snprintf(buf, size, "%.3f%%", ratio); +} + static int lcore_telemetry_info_cb(unsigned int lcore_id, void *arg) { struct rte_config *cfg = rte_eal_get_configuration(); struct lcore_telemetry_info *info = arg; + char ratio_str[RTE_TEL_MAX_STRING_LEN]; struct rte_lcore_usage usage; struct rte_tel_data *cpuset; rte_lcore_usage_cb usage_cb; @@ -544,6 +559,8 @@ lcore_telemetry_info_cb(unsigned int lcore_id, void *arg) if (usage_cb != NULL && usage_cb(lcore_id, &usage) == 0) { rte_tel_data_add_dict_uint(info->d, "total_cycles", usage.total_cycles); rte_tel_data_add_dict_uint(info->d, "busy_cycles", usage.busy_cycles); + format_usage_ratio(ratio_str, sizeof(ratio_str), &usage); + rte_tel_data_add_dict_string(info->d, "usage_ratio", ratio_str); } return 0; @@ -574,11 +591,13 @@ struct lcore_telemetry_usage { struct rte_tel_data *lcore_ids; struct rte_tel_data *total_cycles; struct rte_tel_data *busy_cycles; + struct rte_tel_data *usage_ratio; }; static int lcore_telemetry_usage_cb(unsigned int lcore_id, void *arg) { + char ratio_str[RTE_TEL_MAX_STRING_LEN]; struct lcore_telemetry_usage *u = arg; struct rte_lcore_usage usage; rte_lcore_usage_cb usage_cb; @@ -591,6 +610,8 @@ lcore_telemetry_usage_cb(unsigned int lcore_id, void *arg) rte_tel_data_add_array_uint(u->lcore_ids, lcore_id); rte_tel_data_add_array_uint(u->total_cycles, usage.total_cycles); rte_tel_data_add_array_uint(u->busy_cycles, usage.busy_cycles); + format_usage_ratio(ratio_str, sizeof(ratio_str), &usage); + rte_tel_data_add_array_string(u->usage_ratio, ratio_str); } return 0; @@ -603,15 +624,19 @@ handle_lcore_usage(const char *cmd __rte_unused, const char *params __rte_unused struct lcore_telemetry_usage usage; struct rte_tel_data *total_cycles; struct rte_tel_data *busy_cycles; + struct rte_tel_data *usage_ratio; struct rte_tel_data *lcore_ids; lcore_ids = rte_tel_data_alloc(); total_cycles = rte_tel_data_alloc(); busy_cycles = rte_tel_data_alloc(); - if (lcore_ids == NULL || total_cycles == NULL || busy_cycles == NULL) { + usage_ratio = rte_tel_data_alloc(); + if (lcore_ids == NULL || total_cycles == NULL || busy_cycles == NULL || + usage_ratio == NULL) { rte_tel_data_free(lcore_ids); rte_tel_data_free(total_cycles); rte_tel_data_free(busy_cycles); + rte_tel_data_free(usage_ratio); return -ENOMEM; } @@ -619,12 +644,15 @@ handle_lcore_usage(const char *cmd __rte_unused, const char *params __rte_unused rte_tel_data_start_array(lcore_ids, RTE_TEL_UINT_VAL); rte_tel_data_start_array(total_cycles, RTE_TEL_UINT_VAL); rte_tel_data_start_array(busy_cycles, RTE_TEL_UINT_VAL); + rte_tel_data_start_array(usage_ratio, RTE_TEL_STRING_VAL); rte_tel_data_add_dict_container(d, "lcore_ids", lcore_ids, 0); rte_tel_data_add_dict_container(d, "total_cycles", total_cycles, 0); rte_tel_data_add_dict_container(d, "busy_cycles", busy_cycles, 0); + rte_tel_data_add_dict_container(d, "usage_ratio", usage_ratio, 0); usage.lcore_ids = lcore_ids; usage.total_cycles = total_cycles; usage.busy_cycles = busy_cycles; + usage.usage_ratio = usage_ratio; return rte_lcore_iterate(lcore_telemetry_usage_cb, &usage); } -- 2.17.1