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 7B3ED4577D; Fri, 9 Aug 2024 22:35:19 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 690AD42DC9; Fri, 9 Aug 2024 22:35:19 +0200 (CEST) Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2046.outbound.protection.outlook.com [40.107.20.46]) by mails.dpdk.org (Postfix) with ESMTP id 35CA442D9F for ; Fri, 9 Aug 2024 22:35:18 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=i4AfaNFV0qmLaejO5yabUm95+hlNzFW287KW5jwUd2A2vl2eIEpDkH92V5vblKqs5txQjFsxQkqC/FJP/w5kJpakdrPCXJjBY9TJOQhdehpPS0n3N5sj+7dYGUBKL2adPqXukfkvCoZ/yOwcg3vTSyPmvOe7489a5Sj2Qq/s72Ec1d0nxGLfI9jbR0FTnJoF5+ZBYx0BUGAWnassGxliV7LWZI9PUUpsAAFFS6fa0dx6YDnBriqWfvT2bpyK/XojUOfEJ2WqLV3x7Exo4UZE/PJxmPAkg7ZH7xNx5RtzW38nagC83JpPoi8tjcUHmkBgkapp1PNtYnfIBL00EVLXqw== 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=7wmoJD5ugfsUdTfCgFtK/20ke/JPHqCOnjOKM2M4elI=; b=FSuSQ2mRNyOYJExROeVigyZDG9CfmB9wsmQ7mmcUIMRLiI3IXtw52xr3Ozk+rJLkH61sdZj3C6z3un7wxfz1dFvzmf49YjjQtgOox168OCgsQOuXd2sbXVL2GvjcAoUB8J7TVfGRV1m3hHV6B2aryBS/+rG+oNA76pLTfvQP7ZcUrJTJ/wAanW0ATRJzQf2ZUVV6T/8BFMZ0eHnwxftzbFhJ8v5vcHsPf2xmYBCBwE0VyAeAngLlaBG52S7HJLGcdOjDSIR6UNQ/dReU5yQBVikriT5JwWKnHN+JdT5rqhZniaBxox9JPfCc4gUCi3mouu9JRyBbnfm9sIINWDjN3A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 192.176.1.74) smtp.rcpttodomain=dpdk.org smtp.mailfrom=ericsson.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=ericsson.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ericsson.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7wmoJD5ugfsUdTfCgFtK/20ke/JPHqCOnjOKM2M4elI=; b=Lvtuz8sISOnUmFNf3Ok+kOiPT27X0RWf1QeSS/tdWEodt4YnQKA+xwwD+V0GPEkN+x0eR25LVOFVoAbPQtpjk3H4rhHbjcxMkrR/a0nYgK9cTAd21FQFjjRLRot+tv05fFqSoHWaMyxEOZCQJRMfhA22ix6FkcD7368CYgN4PDAc4clhVbi2oixQ3qRlWQF5Yf3+S+Lvur96XEKYuYRrEX07YHPYJTZCxbtDIiKAbmretw02+WVZOmsaylJF6xMBwU+lJHBVVMwYj6mIJ92U54Zodp5ceOdauGtgcUUQCWmOnU+gfKpw+xUp6uWYCOUVLfJURIVV3PaPGGJerqKxqA== Received: from AM8P190CA0021.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:219::26) by PA4PR07MB7309.eurprd07.prod.outlook.com (2603:10a6:102:d0::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7849.15; Fri, 9 Aug 2024 20:35:15 +0000 Received: from AM1PEPF000252E1.eurprd07.prod.outlook.com (2603:10a6:20b:219:cafe::ae) by AM8P190CA0021.outlook.office365.com (2603:10a6:20b:219::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7849.15 via Frontend Transport; Fri, 9 Aug 2024 20:35:15 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 192.176.1.74) smtp.mailfrom=ericsson.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ericsson.com; Received-SPF: Pass (protection.outlook.com: domain of ericsson.com designates 192.176.1.74 as permitted sender) receiver=protection.outlook.com; client-ip=192.176.1.74; helo=oa.msg.ericsson.com; pr=C Received: from oa.msg.ericsson.com (192.176.1.74) by AM1PEPF000252E1.mail.protection.outlook.com (10.167.16.59) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7849.8 via Frontend Transport; Fri, 9 Aug 2024 20:35:14 +0000 Received: from seliicinfr00049.seli.gic.ericsson.se (153.88.142.248) by smtp-central.internal.ericsson.com (100.87.178.67) with Microsoft SMTP Server id 15.2.1544.11; Fri, 9 Aug 2024 22:35:14 +0200 Received: from breslau.. (seliicwb00002.seli.gic.ericsson.se [10.156.25.100]) by seliicinfr00049.seli.gic.ericsson.se (Postfix) with ESMTP id E2FAB380061; Fri, 9 Aug 2024 22:35:13 +0200 (CEST) From: =?UTF-8?q?Mattias=20R=C3=B6nnblom?= To: CC: , , Stefan Sundkvist , =?UTF-8?q?Mattias=20R=C3=B6nnblom?= Subject: [PATCH] service: extend service function call statistics Date: Fri, 9 Aug 2024 22:25:39 +0200 Message-ID: <20240809202539.590510-1-mattias.ronnblom@ericsson.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240125191529.388570-1-mattias.ronnblom@ericsson.com> References: <20240125191529.388570-1-mattias.ronnblom@ericsson.com> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM1PEPF000252E1:EE_|PA4PR07MB7309:EE_ X-MS-Office365-Filtering-Correlation-Id: d1b14319-fd7a-439c-9b53-08dcb8b2c5ff X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|82310400026|376014|1800799024|36860700013; X-Microsoft-Antispam-Message-Info: =?utf-8?B?cEw2VUZrbEdVbmZnRGgzakw0OGg2YVY1RmpYZkNoOGpXU2VVVGF0TWpRN3Vi?= =?utf-8?B?OTdYQklwaGlYcklMV0VuTVZkNUhKY3pndGpIMXNDZkpua2ZNRlhWblArVnQ0?= =?utf-8?B?bHdyd1haV3BIT0Vna0djZStEZ3lybUFxNW94RExob0dSeUZHR3M0K0VQN1JS?= =?utf-8?B?WDBEYmxrbVk4L21KK0NkeC9kWEZGMUVmWlRYcVV5UWxyc1BDaWlyeW0xTEM0?= =?utf-8?B?TVN4dGNKdmRzV0JCSHM2OVFINk4xc04zdHBqQnIxelk1TWQwOFVISDVWQnVI?= =?utf-8?B?Z21rbFJDWU5aYmZlcXVpZ0Z3WnFsR1JRdlRiLy80R2IraDV2TldrMnFDMzky?= =?utf-8?B?Qy9uUk9hRERIVXVCbUlPaTI4cGplVHZMRzlrU3ZMZUs4bGI0LzNUSnZiTGdZ?= =?utf-8?B?c29FTTZXdHQxdGtCWDBMLytUcUdTUFM0azEybVFsNmNhdStXS2hFeDB3cDZI?= =?utf-8?B?YllpNnRhVGFrYVdDMkhJaXBucTR3citDREd4QVZrVUpEbTlRVEFYelNrVzc3?= =?utf-8?B?T0JqTHlwT0MvMG9MbmpzeWMwVTZwNDd4enE2S3dxL2dSbWxhUWVHS3paMnJZ?= =?utf-8?B?aXhNZUlwVWlDVWpSR2lJd3RDUVdtWW56QTBQK0dxbEY0RDFoanFUR2FlVXBC?= =?utf-8?B?WFROeUJnUkFJUGtKVE90MmVpVnlvbHNKRmpXNERiYWZDTkRlc3BXSWdham5h?= =?utf-8?B?bjhBeUZjdmNteWFVU1pVZ1dYNUt4akJTNndDazVVUU5TUzdhSnVnWFJBVXRp?= =?utf-8?B?YkRNbzBZRVlOQTJrdjk4QTNuaFljL3c3ZG5HUW5lSWJWbzVWc2R5cnBLZENx?= =?utf-8?B?T0JyblkzbXdKbm5HSWwwRTFhVlYzQnNyd0pPMGpGRXFHZXFtWkJ5Y21iclpk?= =?utf-8?B?Qlc4SlVXY3NON0lLRkhoTTEzQ0grNHdrSk1KSDFIK2pGZnVBbnZCT0FLdlZl?= =?utf-8?B?elhwQWdLd3BvMEszc1UrRDh0NUdUV21zWHFzcUUxa2JoTjllK29ia09wTkVj?= =?utf-8?B?dWt2K3A1NXpPeWVRZHFCVE1GNUxYVmdtSlN3TXcxS1hhRFlhQ3JnM2oxWGpx?= =?utf-8?B?U3B1RlNwdksvcXZ3QkhEalQxZXhRMzlPdHhscEhrZTFqa0paR3NKSGVrUVB3?= =?utf-8?B?cGtpUUVtQjBzMjhNcHZ5dFFZQUxKWmF1ZE90TnJMY0doaTVrdDNiWGRrUVNO?= =?utf-8?B?anI3SzhCVjdiLytXV2g2eDJzSlNabWg0ZTU4SzFVVm9OYjVSZUV6M1RzYjNh?= =?utf-8?B?UW5SRGdUczBPRzRod24zTUNJd2w0NHIxNWxMVmhCRVYwYllqNElRdHNoVFZ0?= =?utf-8?B?MngyWWI2NGE3RGNFMXZmQXd6RFc4NHlBR09jL045bEtLSnV4UEN4bnBLK3hT?= =?utf-8?B?TUJGakxldGhnN0J3NWlVQ0EwQ3lUSFZYc1RKRTF1LytVM2dGUkNIUFpxVEdO?= =?utf-8?B?VEVEcmJxMWdtdDkvaS9hS2xlNFVwcVluaElFQmFORnBnZnV6eTQ4VW9SK1Zo?= =?utf-8?B?ejRLZXFmblpWbHJWZU94UEo4NVQ4d0k1MUYrK0FLUmRHd1lmcHVnbXNyeXdC?= =?utf-8?B?anNzVlJzd2hHTXJZV2kwZ2tpWkloNSsyUWRFUEpwOHhqQnhDN01SYmxBbXhp?= =?utf-8?B?cjdXZ2JTRXFGVWM1YzhyRmE2dTNLL3M0TkV1MUcrLzBmdW1zVnI0ZHYveGVv?= =?utf-8?B?MkwyYi9EVmZRUEt4ZHRDbEVCd2lFeE9YRTdvSFNHYXQwTzNMeHgvZE82OFVw?= =?utf-8?B?MWJMcTBPdlZmMWdTNHZOT1U2eFZMdFIxMDR6cUdXd2xZMDluQ0p2TG0wNGdj?= =?utf-8?B?VHAzUHNiNjNtVkR5TisySFJyK1Ixa1VBWll3YUsvWGNvMTRPaWw2cndYdHM5?= =?utf-8?B?VVBVUDZlTlUvbXhjajl6QVBjRTNPMGZydTdXR0UzU3FaL1E9PQ==?= X-Forefront-Antispam-Report: CIP:192.176.1.74; CTRY:SE; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:oa.msg.ericsson.com; PTR:office365.se.ericsson.net; CAT:NONE; SFS:(13230040)(82310400026)(376014)(1800799024)(36860700013); DIR:OUT; SFP:1101; X-OriginatorOrg: ericsson.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Aug 2024 20:35:14.4851 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d1b14319-fd7a-439c-9b53-08dcb8b2c5ff X-MS-Exchange-CrossTenant-Id: 92e84ceb-fbfd-47ab-be52-080c6b87953f X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=92e84ceb-fbfd-47ab-be52-080c6b87953f; Ip=[192.176.1.74]; Helo=[oa.msg.ericsson.com] X-MS-Exchange-CrossTenant-AuthSource: AM1PEPF000252E1.eurprd07.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR07MB7309 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 Add two new per-service counters. RTE_SERVICE_ATTR_IDLE_CALL_COUNT tracks the number of service function invocations where no work was performed. RTE_SERVICE_ATTR_ERROR_CALL_COUNT tracks the number invocations resulting in an error. The semantics of RTE_SERVICE_ATTR_CALL_COUNT remains the same (i.e., counting all invocations, regardless of return value). The new statistics may be useful for both debugging and profiling (e.g., calculate the average per-call processing latency for non-idle service calls). Service core tests are extended to cover the new counters, and coverage for RTE_SERVICE_ATTR_CALL_COUNT is improved. The documentation for the CYCLES attributes are updated to reflect their actual semantics. Signed-off-by: Mattias Rönnblom -- PATCH: * Update release notes. --- app/test/test_service_cores.c | 70 +++++++++++++++++++------- doc/guides/rel_notes/release_24_11.rst | 11 ++++ lib/eal/common/rte_service.c | 70 +++++++++++++++++++++----- lib/eal/include/rte_service.h | 24 +++++++-- 4 files changed, 142 insertions(+), 33 deletions(-) diff --git a/app/test/test_service_cores.c b/app/test/test_service_cores.c index 010ab82893..7ae6bbb179 100644 --- a/app/test/test_service_cores.c +++ b/app/test/test_service_cores.c @@ -3,11 +3,12 @@ */ #include +#include #include -#include #include +#include #include -#include +#include #include #include @@ -16,8 +17,10 @@ /* used as the service core ID */ static uint32_t slcore_id; -/* used as timestamp to detect if a service core is running */ -static uint64_t service_tick; +/* track service call count */ +static uint64_t service_calls; +static uint64_t service_idle_calls; +static uint64_t service_error_calls; /* used as a flag to check if a function was run */ static uint32_t service_remote_launch_flag; @@ -46,9 +49,21 @@ testsuite_teardown(void) static int32_t dummy_cb(void *args) { RTE_SET_USED(args); - service_tick++; + + service_calls++; + + switch (rte_rand_max(3)) { + case 0: + return 0; + case 1: + service_idle_calls++; + return -EAGAIN; + default: + service_error_calls++; + return -ENOENT; + } + rte_delay_ms(SERVICE_DELAY); - return 0; } static int32_t dummy_mt_unsafe_cb(void *args) @@ -121,6 +136,10 @@ unregister_all(void) rte_service_lcore_reset_all(); rte_eal_mp_wait_lcore(); + service_calls = 0; + service_idle_calls = 0; + service_error_calls = 0; + return TEST_SUCCESS; } @@ -295,12 +314,19 @@ service_attr_get(void) "Valid attr_get() call didn't return success"); TEST_ASSERT_EQUAL(0, attr_value, "attr_get() call didn't set correct cycles (zero)"); - /* check correct call count */ + /* check correct call counts */ const int attr_calls = RTE_SERVICE_ATTR_CALL_COUNT; TEST_ASSERT_EQUAL(0, rte_service_attr_get(id, attr_calls, &attr_value), "Valid attr_get() call didn't return success"); - TEST_ASSERT_EQUAL(0, attr_value, - "attr_get() call didn't get call count (zero)"); + TEST_ASSERT_EQUAL(0, attr_value, "Call count was not zero"); + const int attr_idle_calls = RTE_SERVICE_ATTR_IDLE_CALL_COUNT; + TEST_ASSERT_EQUAL(0, rte_service_attr_get(id, attr_idle_calls, &attr_value), + "Valid attr_get() call didn't return success"); + TEST_ASSERT_EQUAL(0, attr_value, "Idle call count was not zero"); + const int attr_error_calls = RTE_SERVICE_ATTR_ERROR_CALL_COUNT; + TEST_ASSERT_EQUAL(0, rte_service_attr_get(id, attr_error_calls, &attr_value), + "Valid attr_get() call didn't return success"); + TEST_ASSERT_EQUAL(0, attr_value, "Error call count was not zero"); /* Call service to increment cycle count */ TEST_ASSERT_EQUAL(0, rte_service_lcore_add(slcore_id), @@ -331,8 +357,13 @@ service_attr_get(void) TEST_ASSERT_EQUAL(0, rte_service_attr_get(id, attr_calls, &attr_value), "Valid attr_get() call didn't return success"); - TEST_ASSERT_EQUAL(1, (attr_value > 0), - "attr_get() call didn't get call count (zero)"); + TEST_ASSERT_EQUAL(service_calls, attr_value, "Unexpected call count"); + TEST_ASSERT_EQUAL(0, rte_service_attr_get(id, attr_idle_calls, &attr_value), + "Valid attr_get() call didn't return success"); + TEST_ASSERT_EQUAL(service_idle_calls, attr_value, "Unexpected idle call count"); + TEST_ASSERT_EQUAL(0, rte_service_attr_get(id, attr_error_calls, &attr_value), + "Valid attr_get() call didn't return success"); + TEST_ASSERT_EQUAL(service_error_calls, attr_value, "Unexpected error call count"); TEST_ASSERT_EQUAL(0, rte_service_attr_reset_all(id), "Valid attr_reset_all() return success"); @@ -341,11 +372,16 @@ service_attr_get(void) "Valid attr_get() call didn't return success"); TEST_ASSERT_EQUAL(0, attr_value, "attr_get() call didn't set correct cycles (zero)"); - /* ensure call count > zero */ + /* ensure call counts are zero */ TEST_ASSERT_EQUAL(0, rte_service_attr_get(id, attr_calls, &attr_value), "Valid attr_get() call didn't return success"); - TEST_ASSERT_EQUAL(0, (attr_value > 0), - "attr_get() call didn't get call count (zero)"); + TEST_ASSERT_EQUAL(0, attr_value, "Call count was not reset"); + TEST_ASSERT_EQUAL(0, rte_service_attr_get(id, attr_idle_calls, &attr_value), + "Valid attr_get() call didn't return success"); + TEST_ASSERT_EQUAL(0, attr_value, "Idle call count was not reset"); + TEST_ASSERT_EQUAL(0, rte_service_attr_get(id, attr_error_calls, &attr_value), + "Valid attr_get() call didn't return success"); + TEST_ASSERT_EQUAL(0, attr_value, "Error call count was not reset"); return unregister_all(); } @@ -533,10 +569,10 @@ service_lcore_en_dis_able(void) static int service_lcore_running_check(void) { - uint64_t tick = service_tick; + uint64_t calls = service_calls; rte_delay_ms(SERVICE_DELAY * 100); - /* if (tick != service_tick) we know the lcore as polled the service */ - return tick != service_tick; + bool service_polled = calls != service_calls; + return service_polled; } static int diff --git a/doc/guides/rel_notes/release_24_11.rst b/doc/guides/rel_notes/release_24_11.rst index 0ff70d9057..eb3a1070e4 100644 --- a/doc/guides/rel_notes/release_24_11.rst +++ b/doc/guides/rel_notes/release_24_11.rst @@ -55,6 +55,17 @@ New Features Also, make sure to start the actual text at the margin. ======================================================= +* **Extended service cores statistics.** + + Two new per-service counters are added to the service cores framework. + + `RTE_SERVICE_ATTR_IDLE_CALL_COUNT` tracks the number of service function + invocations where no actual work was performed. + + `RTE_SERVICE_ATTR_ERROR_CALL_COUNT` tracks the number invocations + resulting in an error. + + The new statistics are useful for debugging and profiling. Removed Items ------------- diff --git a/lib/eal/common/rte_service.c b/lib/eal/common/rte_service.c index 56379930b6..ab671daa6d 100644 --- a/lib/eal/common/rte_service.c +++ b/lib/eal/common/rte_service.c @@ -57,6 +57,8 @@ struct __rte_cache_aligned rte_service_spec_impl { struct service_stats { RTE_ATOMIC(uint64_t) calls; + RTE_ATOMIC(uint64_t) idle_calls; + RTE_ATOMIC(uint64_t) error_calls; RTE_ATOMIC(uint64_t) cycles; }; @@ -369,6 +371,16 @@ rte_service_runstate_get(uint32_t id) } +static void +service_counter_add(uint64_t *counter, uint64_t value) +{ + /* The lcore service worker thread is the only writer, and + * thus only a non-atomic load and an atomic store is needed, + * and not the more expensive atomic add. + */ + rte_atomic_store_explicit(counter, *counter + value, rte_memory_order_relaxed); +} + static inline void service_runner_do_callback(struct rte_service_spec_impl *s, struct core_state *cs, uint32_t service_idx) @@ -380,27 +392,23 @@ service_runner_do_callback(struct rte_service_spec_impl *s, uint64_t start = rte_rdtsc(); int rc = s->spec.callback(userdata); - /* The lcore service worker thread is the only writer, - * and thus only a non-atomic load and an atomic store - * is needed, and not the more expensive atomic - * add. - */ struct service_stats *service_stats = &cs->service_stats[service_idx]; + service_counter_add(&service_stats->calls, 1); + + if (rc == -EAGAIN) + service_counter_add(&service_stats->idle_calls, 1); + else if (rc != 0) + service_counter_add(&service_stats->error_calls, 1); + if (likely(rc != -EAGAIN)) { uint64_t end = rte_rdtsc(); uint64_t cycles = end - start; - rte_atomic_store_explicit(&cs->cycles, cs->cycles + cycles, - rte_memory_order_relaxed); - rte_atomic_store_explicit(&service_stats->cycles, - service_stats->cycles + cycles, - rte_memory_order_relaxed); + service_counter_add(&cs->cycles, cycles); + service_counter_add(&service_stats->cycles, cycles); } - - rte_atomic_store_explicit(&service_stats->calls, - service_stats->calls + 1, rte_memory_order_relaxed); } else { s->spec.callback(userdata); } @@ -867,6 +875,24 @@ lcore_attr_get_service_calls(uint32_t service_id, unsigned int lcore) rte_memory_order_relaxed); } +static uint64_t +lcore_attr_get_service_idle_calls(uint32_t service_id, unsigned int lcore) +{ + struct core_state *cs = &lcore_states[lcore]; + + return rte_atomic_load_explicit(&cs->service_stats[service_id].idle_calls, + rte_memory_order_relaxed); +} + +static uint64_t +lcore_attr_get_service_error_calls(uint32_t service_id, unsigned int lcore) +{ + struct core_state *cs = &lcore_states[lcore]; + + return rte_atomic_load_explicit(&cs->service_stats[service_id].error_calls, + rte_memory_order_relaxed); +} + static uint64_t lcore_attr_get_service_cycles(uint32_t service_id, unsigned int lcore) { @@ -899,6 +925,18 @@ attr_get_service_calls(uint32_t service_id) return attr_get(service_id, lcore_attr_get_service_calls); } +static uint64_t +attr_get_service_idle_calls(uint32_t service_id) +{ + return attr_get(service_id, lcore_attr_get_service_idle_calls); +} + +static uint64_t +attr_get_service_error_calls(uint32_t service_id) +{ + return attr_get(service_id, lcore_attr_get_service_error_calls); +} + static uint64_t attr_get_service_cycles(uint32_t service_id) { @@ -918,6 +956,12 @@ rte_service_attr_get(uint32_t id, uint32_t attr_id, uint64_t *attr_value) case RTE_SERVICE_ATTR_CALL_COUNT: *attr_value = attr_get_service_calls(id); return 0; + case RTE_SERVICE_ATTR_IDLE_CALL_COUNT: + *attr_value = attr_get_service_idle_calls(id); + return 0; + case RTE_SERVICE_ATTR_ERROR_CALL_COUNT: + *attr_value = attr_get_service_error_calls(id); + return 0; case RTE_SERVICE_ATTR_CYCLES: *attr_value = attr_get_service_cycles(id); return 0; diff --git a/lib/eal/include/rte_service.h b/lib/eal/include/rte_service.h index e49a7a877e..89057df585 100644 --- a/lib/eal/include/rte_service.h +++ b/lib/eal/include/rte_service.h @@ -374,15 +374,32 @@ int32_t rte_service_lcore_count_services(uint32_t lcore); int32_t rte_service_dump(FILE *f, uint32_t id); /** - * Returns the number of cycles that this service has consumed + * Returns the number of cycles that this service has consumed. Only + * cycles spent in non-idle calls (i.e., calls not returning -EAGAIN) + * count. */ #define RTE_SERVICE_ATTR_CYCLES 0 /** - * Returns the count of invocations of this service function + * Returns the total number of invocations of this service function + * (regardless of return value). */ #define RTE_SERVICE_ATTR_CALL_COUNT 1 +/** + * Returns the number of invocations of this service function where the + * service reported having not performed any useful work (i.e., + * returned -EAGAIN). + */ +#define RTE_SERVICE_ATTR_IDLE_CALL_COUNT 2 + +/** + * Returns the number of invocations of this service function where the + * service reported an error (i.e., the return value was neither 0 nor + * -EAGAIN). + */ +#define RTE_SERVICE_ATTR_ERROR_CALL_COUNT 3 + /** * Get an attribute from a service. * @@ -408,7 +425,8 @@ int32_t rte_service_attr_reset_all(uint32_t id); /** * Returns the total number of cycles that the lcore has spent on - * running services. + * running services. Only non-idle calls (i.e., calls not returning + * -EAGAIN) count toward this total. */ #define RTE_SERVICE_LCORE_ATTR_CYCLES 1 -- 2.34.1