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 D155CA0093; Fri, 16 Dec 2022 11:21:29 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CB68442D2E; Fri, 16 Dec 2022 11:21:22 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mails.dpdk.org (Postfix) with ESMTP id 491CF42D1A for ; Fri, 16 Dec 2022 11:21:20 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1671186079; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SIGugc23W4x6F+KHwfIrjh5QUQxrEikZkq8+e8Kg6Ik=; b=HpExWg/zhRiu5uz+Qb1+sKyFuZgqyLe/rZmz7RocDZILe/sOLTG2bvgS3MExf2olNBNRcz gFyC8PvvmCB24Q90KutHVZTyQ5eMxD6eK9M9EXbUbAkEblWP30Qz/wb0ksfrfw6gZHCVls zm6l/NnvABo7YKS1XLmG5RjuwloLMOI= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-215-8hHEA9JROMatpskWg3Ha5Q-1; Fri, 16 Dec 2022 05:21:16 -0500 X-MC-Unique: 8hHEA9JROMatpskWg3Ha5Q-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 552C7811E6E; Fri, 16 Dec 2022 10:21:16 +0000 (UTC) Received: from ringo.home (unknown [10.39.208.36]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2509751EF; Fri, 16 Dec 2022 10:21:14 +0000 (UTC) From: Robin Jarry To: dev@dpdk.org Cc: Tyler Retzlaff , Kevin Laatz , Robin Jarry , =?UTF-8?q?Morten=20Br=C3=B8rup?= Subject: [PATCH v5 2/4] eal: allow applications to report their cpu usage Date: Fri, 16 Dec 2022 11:21:07 +0100 Message-Id: <20221216102109.64142-3-rjarry@redhat.com> In-Reply-To: <20221216102109.64142-1-rjarry@redhat.com> References: <20221123102612.1688865-1-rjarry@redhat.com> <20221216102109.64142-1-rjarry@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.5 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Allow applications to register a callback that will be invoked in rte_lcore_dump() and when requesting lcore info in the telemetry API. The callback is expected to return the number of TSC cycles that have passed since application start and the number of these cycles that were spent doing busy work. Signed-off-by: Robin Jarry Acked-by: Morten Brørup --- v4 -> v5: The callback now takes a pointer to a rte_lcore_usage structure. I chose not to include any API version tracking mechanism since the unsupported/unused fields can simply be left to zero. This is only telemetry after all. lib/eal/common/eal_common_lcore.c | 33 ++++++++++++++++++++++++++--- lib/eal/include/rte_lcore.h | 35 +++++++++++++++++++++++++++++++ lib/eal/version.map | 1 + 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/lib/eal/common/eal_common_lcore.c b/lib/eal/common/eal_common_lcore.c index 16548977dce8..210636d21d6b 100644 --- a/lib/eal/common/eal_common_lcore.c +++ b/lib/eal/common/eal_common_lcore.c @@ -2,6 +2,7 @@ * Copyright(c) 2010-2014 Intel Corporation */ +#include #include #include @@ -422,11 +423,21 @@ rte_lcore_iterate(rte_lcore_iterate_cb cb, void *arg) return ret; } +static rte_lcore_usage_cb lcore_usage_cb; + +void +rte_lcore_register_usage_cb(rte_lcore_usage_cb cb) +{ + lcore_usage_cb = cb; +} + static int lcore_dump_cb(unsigned int lcore_id, void *arg) { struct rte_config *cfg = rte_eal_get_configuration(); - char cpuset[RTE_CPU_AFFINITY_STR_LEN]; + char cpuset[RTE_CPU_AFFINITY_STR_LEN], usage_str[256]; + struct rte_lcore_usage usage; + rte_lcore_usage_cb usage_cb; const char *role; FILE *f = arg; int ret; @@ -446,11 +457,19 @@ lcore_dump_cb(unsigned int lcore_id, void *arg) break; } + memset(&usage, 0, sizeof(usage)); + usage_str[0] = '\0'; + usage_cb = lcore_usage_cb; + if (usage_cb != NULL && usage_cb(lcore_id, &usage) == 0) { + snprintf(usage_str, sizeof(usage_str), ", busy cycles %"PRIu64"/%"PRIu64, + usage.busy_cycles, usage.total_cycles); + } ret = eal_thread_dump_affinity(&lcore_config[lcore_id].cpuset, cpuset, sizeof(cpuset)); - fprintf(f, "lcore %u, socket %u, role %s, cpuset %s%s\n", lcore_id, + fprintf(f, "lcore %u, socket %u, role %s, cpuset %s%s%s\n", lcore_id, rte_lcore_to_socket_id(lcore_id), role, cpuset, - ret == 0 ? "" : "..."); + ret == 0 ? "" : "...", usage_str); + return 0; } @@ -489,7 +508,9 @@ lcore_telemetry_info_cb(unsigned int lcore_id, void *arg) { struct lcore_telemetry_info *info = arg; struct rte_config *cfg = rte_eal_get_configuration(); + struct rte_lcore_usage usage; struct rte_tel_data *cpuset; + rte_lcore_usage_cb usage_cb; const char *role; unsigned int cpu; @@ -522,6 +543,12 @@ lcore_telemetry_info_cb(unsigned int lcore_id, void *arg) if (CPU_ISSET(cpu, &lcore_config[lcore_id].cpuset)) rte_tel_data_add_array_int(cpuset, cpu); rte_tel_data_add_dict_container(info->d, "cpuset", cpuset, 0); + memset(&usage, 0, sizeof(usage)); + usage_cb = lcore_usage_cb; + if (usage_cb != NULL && usage_cb(lcore_id, &usage) == 0) { + rte_tel_data_add_dict_u64(info->d, "busy_cycles", usage.busy_cycles); + rte_tel_data_add_dict_u64(info->d, "total_cycles", usage.total_cycles); + } return 0; } diff --git a/lib/eal/include/rte_lcore.h b/lib/eal/include/rte_lcore.h index 6938c3fd7b81..a92313577355 100644 --- a/lib/eal/include/rte_lcore.h +++ b/lib/eal/include/rte_lcore.h @@ -328,6 +328,41 @@ typedef int (*rte_lcore_iterate_cb)(unsigned int lcore_id, void *arg); int rte_lcore_iterate(rte_lcore_iterate_cb cb, void *arg); +/** + * CPU usage statistics. + */ +struct rte_lcore_usage { + uint64_t total_cycles; + /**< The total amount of time since application start, in TSC cycles. */ + uint64_t busy_cycles; + /**< The amount of busy time since application start, in TSC cycles. */ +}; + +/** + * Callback to allow applications to report CPU usage. + * + * @param [in] lcore_id + * The lcore to consider. + * @param [out] usage + * Counters representing this lcore usage. This can never be NULL. + * @return + * - 0 if fields in usage were updated successfully. The fields that the + * application does not support should be left to their default value. + * - a negative value if the information is not available or if any error occurred. + */ +typedef int (*rte_lcore_usage_cb)(unsigned int lcore_id, struct rte_lcore_usage *usage); + +/** + * Register a callback from an application to be called in rte_lcore_dump() and + * the /eal/lcore/info telemetry endpoint handler. Applications are expected to + * report CPU usage statistics via this callback. + * + * @param cb + * The callback function. + */ +__rte_experimental +void rte_lcore_register_usage_cb(rte_lcore_usage_cb cb); + /** * List all lcores. * diff --git a/lib/eal/version.map b/lib/eal/version.map index 7ad12a7dc985..30fd216a12ea 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -440,6 +440,7 @@ EXPERIMENTAL { rte_thread_detach; rte_thread_equal; rte_thread_join; + rte_lcore_register_usage_cb; }; INTERNAL { -- 2.38.1