From nobody Sun Sep 27 02:52:24 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011061.outbound.protection.outlook.com [52.101.70.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4149A355F53; Thu, 27 Aug 2026 07:24:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.61 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787815457; cv=fail; b=QBwSqBsbbcamSZlaahk3aEMgykhCsaQj6epUPahUGHbrS/oEIzXhBCC3JN5X5sAAFPwqL1I5K8w/cPyETaSSthyaqUx3fb39xt/L9edwhLpJ9tpTJZ9492a2PmS0QV8VEEvM5YWtkCn7Wy9hZsSnfVh/9NmDEgtei7G3uDZqUkc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787815457; c=relaxed/simple; bh=p5oFt5dMsFqZ14fhJwuilHYeN1go6CA0+780+TEhQmQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Wra5IFnu+1LYHWqPH8tHKJ2yeP2wNoHYxg7nuTzHF8SH5ryFJ3reFEnMsLwyTq+OQccRCChS4eEGzJKti+B70/jj9odzHqSYSfu17G+8u+kyERIynpS5BsbQ3nfQJzwEk3qymRxB5cZebOpvLbdzMEulALJSYc78QjnVwXW1ww0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com; spf=pass smtp.mailfrom=siemens.com; dkim=pass (2048-bit key) header.d=siemens.com header.i=@siemens.com header.b=ei2YBWcm; arc=fail smtp.client-ip=52.101.70.61 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=siemens.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=siemens.com header.i=@siemens.com header.b="ei2YBWcm" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=F9eYc6R65YdgLKKmlkm/Ri3ZKJQx2x3xmonVJmhh52kwZeXNC/ZalsEQmVwmWWKQtQQhYjWKpYP5TEBjwJ73uTtSQKG410nN0p5TKzf1K46PWCmoXYJ5iqx+4Ggm9OboneCtWBoDsfsmbMBX9doPqde8mlCwdfME2rl+1AqfLSQRT2egmXy7WXQ+KOD6MjrTrVA02E6xSLiQUlh0gKYl2t4sCAD+byAdjTRIz97ZlNcREgwOkEqEXku1IRCouYokRqhRkRqerfFJmw8uoSZnvF5L8TTVQTwjim+o69otCajlWQYWdku5kbhblCtI1ZfhjOC+z31+NlbKrQQdDNpDpA== 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=g33wKqR9KESKIpXxUioT/XopYhYnLSY3wKWfD2CjqYw=; b=uzKbjnaLcY/GVTa3VsEjyhstfbTVbLWhhMMy9khG3eq++lrH5XR9jyogL0S2/ILsWpIdfGplZkov8xYn7iwwmpZiXugJhC5s+zq6sVzVzlTVUq2mVkZbVDwXXzs0n0YnOj/kbF34IfpX3A2wNeexkilm82GwPMLVF0+qI/pE77i/bmxaLMsYOS8QGFHzxy2lt6hJKHNhDtPcc1U2c91KMjhm6HN0MOu4RbbansReV5lE0mIec9EpmrH/PSKRuccPHwsWM40tburuN0qHGc6p17GrpLzimt5aQr7sWCD81Lz75+usuGIGL2xYrdTvlhwbkchZ3Lfy58KfzJiLNJMNYw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=siemens.com; dmarc=pass action=none header.from=siemens.com; dkim=pass header.d=siemens.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=siemens.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=g33wKqR9KESKIpXxUioT/XopYhYnLSY3wKWfD2CjqYw=; b=ei2YBWcmHSRNdL1lh2ZojtWQ4en18/1EQdXuaD8iG4y/F+C1X7qeV9jQwwSPOFRnXq1TveMlFS+anpz1oMcKlux71lXE1CFp4Etb45FudbcEBGLBxOKQ//r8GAps4+XzyYg280fYhMwW4Kjv5hDGkil+maBRcpz2W23FYcSG/IeKoA5rPVq1kGOuR0fAoQMcurnY2rHFYWGbQxNSyFma6cfRTkkPDa/P58h0W9X7oP/lw13rpCfvlZqFJe/16jYFmY2giMNDaHFeGea7OX2VfOO9SkmJoRs4D3Ldr2XakxZBsrtqWUEeC/I7ZM2owI753rgYyMVlcuQB8bRRomm1Cg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=siemens.com; Received: from AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:3dd::5) by GV1PR10MB8608.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:150:1d1::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.10; Thu, 27 Aug 2026 07:24:09 +0000 Received: from AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM ([fe80::5f49:b0e9:d295:22d8]) by AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM ([fe80::5f49:b0e9:d295:22d8%6]) with mapi id 15.21.0339.008; Thu, 27 Aug 2026 07:24:09 +0000 From: Tobias Schaffner To: Steven Rostedt , Gabriele Monaco Cc: Jonathan Corbet , Shuah Khan , Masami Hiramatsu , Mathieu Desnoyers , Jan Kiszka , Philippe Gerum , linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Tobias Schaffner Subject: [RFC 1/3] rv: add per-edge dwell-time statistics primitive Date: Thu, 27 Aug 2026 09:23:58 +0200 Message-ID: <20260827072400.45734-2-tobias.schaffner@siemens.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260827072400.45734-1-tobias.schaffner@siemens.com> References: <20260827072400.45734-1-tobias.schaffner@siemens.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR3P281CA0071.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4b::7) To AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:3dd::5) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM9PR10MB4992:EE_|GV1PR10MB8608:EE_ X-MS-Office365-Filtering-Correlation-Id: ad5df11b-45df-4438-33be-08df040c2f48 X-MS-Exchange-AtpMessageProperties: SA X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|23010399003|10070799003|366016|6133799003|10067099003|56012099006|11063799006|55112099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: O00Te+I7c+NEuFAOjC2xI8kjCbeBaBTcK2j2tYp3BWlQM989mBMhbFa+1LSFKNLHw0jSyj0p2tJULAGXQZu8w0XDrgNK7Sk8pCYzeAQwMW2Mqi1buQ2sIz/o7ZU5DNsGGFVOeYAzWLeXjGjw6YXjgr2v6FBqpUE9oeiC31JEMMEmfen7k7BQkY7NBuRvwCqIyDfUpIXxqaQaKKmS9OJ5TaQS5kLIMCBhE6ZO+1mV6gNEw/Kd/asg9U36+SqLspX8M12/y87Uo2jCwwGp6nI11g2HBtqKaRGwUP7vyXTnkiQ7WF7OYpf6HA1du0/5qPcMP+o9+rtB8Em98yEXAldxH6GFyDN0llC+2gKTT6HrLEfBDlWblpRQp4zal5PEKFlrQG0bGw2SUPnGYeNU8AFgsydab+GA1qEZCi3mSNevzeuM0bAH02gxXy7LUxLr73k6dLuT9CAtSVYzdTJQCtAjKhnqDIOjv29VkMnIu7lVh1hkF0z+Sp78iatM5ycfmqUHj5OwyUWGmyYVtuqEDdPzh/0UwLaXfMo+Ow/ApqRQZwY/+BuNcvWqNtBazni9uPXBmRsk4x9M3YxlqC++JNEE3n7xXViB6nvQ6zc3b1bQwh12J3S58zJz9UpwKY1wjd6SQKKIoLg8O2pEjAK4zFKPBqJleXQgLkNIXZgzsoYfl6Y= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(23010399003)(10070799003)(366016)(6133799003)(10067099003)(56012099006)(11063799006)(55112099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?B/96TLB8zyM2H8f2/MBYGLjT26e4nRjFwuYL22ORIsZBTd9IrpYLm0H44UbD?= =?us-ascii?Q?p8qjYoKREDTE2kF8PXD0iHtsrE6Wr/KKZ2NZFwuy9G7yXYsOoWr+Zbkawho5?= =?us-ascii?Q?IsoX3Wtl/g0Nl6ETgyZnmRdrsJWFTx0Br1HvpceCH0/SIVDyEly8GyvWbS76?= =?us-ascii?Q?tuIh0BPYGmrN4lv2TaJ9fW12WZIoxOe5KXH1usnv+OqPdWFVzVytZclfBZ8A?= =?us-ascii?Q?p078Bsz1mfIBboEARyVnwW1V51QX8pp/SIWrXRitLgmKxKKMdUCMVwIdzq8E?= =?us-ascii?Q?E3KLRVmwniKyBQOsn0E2kXBKX/g46idxkGzm/qal4t9UygcM2AaUcmdIUzyx?= =?us-ascii?Q?HV+s4SHj4aMrYy3GQ+vrUmen6TF2mmy94nJJBiiM9Kavh7Hibtzhr6XBWZnh?= =?us-ascii?Q?uiyMGLqQC6JufwfH0neY/qFXJ75zsF5pYYDSN/L39julO4OGm+7bWyR6sVwy?= =?us-ascii?Q?bKP8HZ/qkv18AtM30G/QoJJcDjNQf4txbHGiqpiG6TD+k13PSsWfQv7OUCNZ?= =?us-ascii?Q?fQeMl6bASMuRyjcQtrMurkeotIMZpd/T8ln6/ZNvzIyJdKAx4uk4hSvziIm1?= =?us-ascii?Q?8OJkZzSxoRRmT9veEL+KgpQWIUZyWgBxV+eIz0QDOPEbpwAkJqmcbKKfhGKb?= =?us-ascii?Q?rl41ayJylcO0zNxPDqRD18yYn68FP0Cg2r9QClzNW1FOio1mxSQZiY9+fYDk?= =?us-ascii?Q?jmhBve7mp1leoHzABB5l9XEn3is4GckesEFk2tHFhPDodq/kZqiW+Mrxv3yw?= =?us-ascii?Q?Pgb6b3ohgpr3ktL0bT7udVVe6aEc178y8oNmTSTu6Hegq/wpg/I9VOzewLWv?= =?us-ascii?Q?D64vFGCWGIl7/ONS9cy0/05sadQgOH+FZMdSG/W0I//kBqcqGOaF3HWGvYnu?= =?us-ascii?Q?87MXJyfWRMHXD81L+Jwu/lu7W2i1qR55YJSOeEO/d4+FN6mYIZIlhKZKOMz5?= =?us-ascii?Q?W6cznMTz0Dvzw9cppvd5iMvvkxPJ9UTr7MMiTA+nZ8uAcztWhHqaLIS2CQf3?= =?us-ascii?Q?p4WfupeqPEQrVU7yHfEKyhKbqbBrDE1YkHMALUo92FAUvEtXmwnGCXgq6jwd?= =?us-ascii?Q?cQpiZLjnTxn0k/LePxD1D40NhAXWNnC4GbfLcMVeHtITSt+fW3eeIi5Uuq52?= =?us-ascii?Q?KEMSIVUeHYH+VUrIvnlJ8aedY6GVKs1Scj70jaPcBivCih19C1epBcyQhHfl?= =?us-ascii?Q?6kMRhxB8y1tR+XDypiyxmyjrxW6+x+czS1XWBYHoWD68GxLyzBg9nhLamz+E?= =?us-ascii?Q?h+LrL1HWYTFTxlGlnNE5JpcOzcDj34DSmBH0ElWsw08gq7gIAFvOuTJyzuXJ?= =?us-ascii?Q?4C7Lgcfti901X4YIgQ2k4VE5wJI9CYJF8eoB1WnRDOKlEKY6AA3HsLGtNFAY?= =?us-ascii?Q?gZd446Hwl/0+JHpSyEi2PpqIYpkOZWoW1hZUuAbwiNhmMAvldhQHtHyfVvQ+?= =?us-ascii?Q?eTIlH3/0lhx5FxLrQokDnbiC5YEiBNVF7iiSFkfjpXcTyN2D1+VJIyMxWbGd?= =?us-ascii?Q?IboiFdMN4CXKKZGFbG/Z+HFX3Rhd8QzMg+H00xkd9cDoDIwdisR0eMXu/Skc?= =?us-ascii?Q?4SPD6uhPged94ZTwBF7gvspmkEpLOyr7bXW0+gLlid9564hiTBUgUOKxd1EW?= =?us-ascii?Q?ecgADpex/fNucq8MHTCVmaeCTzeX4zS/Fkp0ve51vMJqwKh/Q/bCDpPTHxmR?= =?us-ascii?Q?UvSLVNiG7RzEAH2HTFuSjqX62pWO1ncM/8IkDKGxu3i4pAWB9Y+BlXflSkgu?= =?us-ascii?Q?ptSwu8WFprv/8li9IL1a1/qGgCiJ0Mjyw9SL4ONcafFZwm4FwGFIqgRDo35Y?= X-MS-Exchange-AntiSpam-MessageData-1: OYVnDow/5q9/9nWHA90mGXTJ+ky5rjcWIiM= X-OriginatorOrg: siemens.com X-MS-Exchange-CrossTenant-Network-Message-Id: ad5df11b-45df-4438-33be-08df040c2f48 X-MS-Exchange-CrossTenant-AuthSource: AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 07:24:09.0941 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 38ae3bcd-9579-4fd4-adda-b42e1495d55a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: RN7yJzv4H4M6J40nl8OjCv0Yui2sC3Jj6fB5UzOZjOllE1pDY3vfL3Nhg/jjgjiX0q+oYmhgiUqXZ60rwZdX45M479CGlpney6Npl3kV5CQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV1PR10MB8608 Content-Type: text/plain; charset="utf-8" Add a small primitive that records, per automaton edge, how long the monitor dwelled before taking it with a count, a sum and a maximum. The counters are per-CPU and lock-free, so a monitor's hot path can update them without disabling interrupts and without perturbing the very latency being measured. Signed-off-by: Tobias Schaffner --- MAINTAINERS | 1 + include/linux/rv_edge_stat.h | 45 ++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 include/linux/rv_edge_stat.h diff --git a/MAINTAINERS b/MAINTAINERS index 8014b9f8253e..04589dda0873 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -23654,6 +23654,7 @@ L: linux-trace-kernel@vger.kernel.org S: Maintained F: Documentation/trace/rv/ F: include/linux/rv.h +F: include/linux/rv_edge_stat.h F: include/rv/ F: kernel/trace/rv/ F: tools/testing/selftests/verification/ diff --git a/include/linux/rv_edge_stat.h b/include/linux/rv_edge_stat.h new file mode 100644 index 000000000000..751de8074dcc --- /dev/null +++ b/include/linux/rv_edge_stat.h @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Per-edge dwell-time statistics for RV monitors. + * + * Copyright (C) 2026 Siemens AG + * Author: Tobias Schaffner + */ +#ifndef _LINUX_RV_EDGE_STAT_H +#define _LINUX_RV_EDGE_STAT_H + +#include +#include +#include + +/* + * Per-CPU counters kept in local64_t so accounting is safe against interr= upt + * and NMI nesting on the owning CPU without disabling interrupts -- the s= ame + * approach the trace ring buffer uses. Only the owning CPU writes. + */ +struct rv_edge_stat { + local64_t count; + local64_t sum_ns; + local64_t max_ns; +}; + +static __always_inline +void rv_edge_stat_account(struct rv_edge_stat *s, u64 dwell_ns) +{ + s64 max; + + local64_inc(&s->count); + local64_add(dwell_ns, &s->sum_ns); + + /* Keep the largest dwell; retry only if a nested update raced us. */ + max =3D local64_read(&s->max_ns); + while (dwell_ns > (u64)max) { + s64 prev =3D local64_cmpxchg(&s->max_ns, max, dwell_ns); + + if (prev =3D=3D max) + break; + max =3D prev; + } +} + +#endif /* _LINUX_RV_EDGE_STAT_H */ --=20 2.43.0 From nobody Sun Sep 27 02:52:24 2026 Received: from DUZPR83CU001.outbound.protection.outlook.com (mail-northeuropeazon11012048.outbound.protection.outlook.com [52.101.66.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D00D23C4F3; Thu, 27 Aug 2026 07:24:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.66.48 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787815457; cv=fail; b=CDvuHgHNlOBUE4DZNfep6/heuUDnP8ZI0EVEobw1anVWiYEJp2lomciEkgRgjQwexWOb40PPSJC4VCpWmMg1hXnc4rLJAbyRmYevsIZiuuYf4bu3xFIXS8cC0OYwl3IK8v3AW1bRtPac++AVP0YYYHGbMCmfnx1HJDUj5BNv+CE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787815457; c=relaxed/simple; bh=CbH24tSQgZD3/J7kO7ij8xOxjR/yQS4KjCu+nX4cVFE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=VAvb9VY03egqXXb9S0Q1Og0cAbSUQZ3iohXq3zYzcK7J++oyWrz1h77gK5fmvf4ocd/aW0P24sfST1AJsE48UmsTmqLw/OfyB/1BrYv78uzTV/nbIHgOarEBjBfHKBuDjPOt73v/BNPL0bnUYB2GlFxyxRGLanVLfJSd4rLOPt0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com; spf=pass smtp.mailfrom=siemens.com; dkim=pass (2048-bit key) header.d=siemens.com header.i=@siemens.com header.b=QNzKNAxw; arc=fail smtp.client-ip=52.101.66.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=siemens.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=siemens.com header.i=@siemens.com header.b="QNzKNAxw" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RE7yIlhiG5CmL/s689I4AdTLkFeSNYRHNS+vtQtYyppJ7WN4VxvXBKYRSzZgtkYHu9iYq+OCEZAGKLmC5v6Xj32aAUS/XQo3uuBCsFxDmDwn8V8P9i7zaU/laM4bD9zrsijOZ6dvoO8OSln5VXU5ZdpvdguSxu66mklUd8WMjGPzH9oow61DycdgWTH9JcLc5HyGEH1zbypw3HQG5x6+9ThYawiRFuscTiIqAMlqBYvkmXRoJTLBoJvwfqd7yu8JjuhphxG6NaHhCvNBgvRIBsBqgWTcnoW+CftZaRTk1zeGooke7/HZha9iCiUgMZTZSoTvPloWnxfRXztBjm++DQ== 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=eBaOH7eUoOkbG0PfDgQCuWbEC5Th9YF5kltGbORhnDA=; b=DSTaY9SrdZCBqI8HLNqRZ+yaCG+bJ3wGJ8oXhcXXOt7mVmktsockkMjU+GVV9MbpUeZSzggvUvK+5Kz3ydPt9HWwLkRWeF+0eli0DjHuv6wXOTuGG51rjPZTO18bw6TZeqjafjAi5os+6sx/7L9id9Uaz0TTUQnm8GnyEnxmvQq3REMTKTNSmqDyQV6nyIw2rBS4/QuRG/h4KC4SqUB2u5mBUM8oqV5ZlSdq/BUeDwkZmS1E/oLhZ7qEaZ/G95AnneC/tecPclN2xynxKVtEzemr1H3zToK4+dbu9r7sX793cLQV8uhO0kG0wx/bUe+pho1a+N3bzQkbqBNI1xAc6w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=siemens.com; dmarc=pass action=none header.from=siemens.com; dkim=pass header.d=siemens.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=siemens.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=eBaOH7eUoOkbG0PfDgQCuWbEC5Th9YF5kltGbORhnDA=; b=QNzKNAxwTng1hT+zj/PZHF9nSnNIt3qheMnxC25819odAtzzsXFcYMEdp+6MoL9VmdR99xw9JqQu1YzGYIbXzKg40n2lyecoK8GW7rWzB97hR5hBHHx0en+yUT9jBbtm1K68jDe4DiQjp7+18x6ylcbjD1UQ3yjSMzM3C8IdGv8GJdxgwKq58Wbm0KdJZEnq25l8ps4ObN77rJwQNwIkTBgNsxAwoPTCPqlMnwz4bxD+iKLL/d0k4vdyLwnnqUbDZ8WpnB0o/LFwIuM+Xn0KKU9AstglHsXy0tUmI/zRsOttUI3jOUHIUutFRrfbuM29VeeCrkKsxIe8p6BetfxnMw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=siemens.com; Received: from AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:3dd::5) by VI1PR10MB3343.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:803:13e::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.10; Thu, 27 Aug 2026 07:24:10 +0000 Received: from AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM ([fe80::5f49:b0e9:d295:22d8]) by AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM ([fe80::5f49:b0e9:d295:22d8%6]) with mapi id 15.21.0339.008; Thu, 27 Aug 2026 07:24:10 +0000 From: Tobias Schaffner To: Steven Rostedt , Gabriele Monaco Cc: Jonathan Corbet , Shuah Khan , Masami Hiramatsu , Mathieu Desnoyers , Jan Kiszka , Philippe Gerum , linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Tobias Schaffner Subject: [RFC 2/3] rv: add per-monitor edge-stat facility and stats file Date: Thu, 27 Aug 2026 09:23:59 +0200 Message-ID: <20260827072400.45734-3-tobias.schaffner@siemens.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260827072400.45734-1-tobias.schaffner@siemens.com> References: <20260827072400.45734-1-tobias.schaffner@siemens.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR3P281CA0071.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4b::7) To AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:3dd::5) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM9PR10MB4992:EE_|VI1PR10MB3343:EE_ X-MS-Office365-Filtering-Correlation-Id: 58cd89ad-3aa4-439f-5231-08df040c2fc1 X-MS-Exchange-AtpMessageProperties: SA X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|23010399003|10070799003|366016|6133799003|10067099003|56012099006|11063799006|22082099003|18002099003|55112099003; X-Microsoft-Antispam-Message-Info: BbQk9ZGf3phwhV1V0WU37H4bqVannewEwx1KEOoZcn/l6QGl158X1WVVMoRDaZdtlEpghsS9QVlzdRkpwVvN8DZMaV/H2ud7m8DsIJE5A/ZyqG2lKx1Zx8DAlmVGDR3FexQOLlojBCt1GGVgjtIQL1ecjbnj/FuuVvz5N+TEvjfdg18oAaw5h0gjYtwt0T150feSPRr/zTJjLlgloTomL0vx6uv0w/GWynsuOSx3hk4VwrZwOIx3C81E18ep9xxrFqTSSgcd/tPCBIlU5fI6JhnjELETgXx5dfNPEIB3Bu4tqxbE/A6iV27YFqHsZNUymDBguq3ejX7BAnUkMTN2N7Rv09JGRckVAuQcNglS3SvseqcBX7BBIUzdarWrTZD4Mx8YNv9+mPI5Wyff49QyU929Fo186PeIhJkhA2Y2smsm7gU+KB12qAq+kCMazrJ87TaGv/i47nKHdol2tdPMYkgZkXtvi8QZppWJQycHQFVs8O7DygPmv3v2C1jYIJbTyYRiK5+YwMjbMuUc/FmbFj2m63OX6BpfgXO6rBJ06+jghzxJ8aY2ClXSTVYIGXPWkNlcmS0OoGf1+vB0B6tSmA5QPd5Bi0+6aX5nxC+hDS6/dDfVaxL6StYmJSQm0bpHkhFd2+q9Ex2gAx3mz42IESUfrP1ZcwnktYNMeMB1HGI= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(23010399003)(10070799003)(366016)(6133799003)(10067099003)(56012099006)(11063799006)(22082099003)(18002099003)(55112099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?LYE2yg5BGQhdVLl419fyJBAlDDGQRQv01KrTij8SKUZc1Cc7dhagt3g14B+N?= =?us-ascii?Q?RqdozvFJLbP/KCBRBoAB7KdaEqrb5VPH/h7F+FrqPlpCibMKoxbTPW0hu9nt?= =?us-ascii?Q?Kh80zqPVF5Inv4YhV66J8Y15qKux3Ns4gQ4UFf2UcTHQPDkTU/HDvW1Tu9M3?= =?us-ascii?Q?3xOBOZxH82k2ShTzWLxsIcL9YwCjT+/6UZi/NnQo+c/tCXLzwrJ9kfVq2JqX?= =?us-ascii?Q?vOQj8RBGZCInvIUTrS9eAAfNKWBCH9OqpfisEyVhADleBGCUFUDWBMqA/rDD?= =?us-ascii?Q?odaZEdDlPM1FntMKKar4SkkuG2w4RU6IV6/SRgDsADLOuF1oJm3p4Snzyyix?= =?us-ascii?Q?toWRimwkBNT2lwQbB2Jm26ikSy3S4ytHMHvsqBAYRnafD2GfMxp+UOf93GjO?= =?us-ascii?Q?nclaXw7SZv/1GceI9IC3SYWBvLek3E3zKXwv06V8Bwgs4yZ9pfmjZ2UMl3c2?= =?us-ascii?Q?IWSmMaaL5q80swTpkTGPgACJGlpSMlYG03AOIuaxIFBU3QqyRaPzORQ0accd?= =?us-ascii?Q?3GJD99naIWpUdwiZRtydToq8zpEMo8L2jpajJUyzwXvH7Kx9Gq7WZLq+QZd0?= =?us-ascii?Q?fejxSubaccBETArt0eJV4o5UsQjk9wD13ofyY47HHQ64hqU2luol+533APV1?= =?us-ascii?Q?+WAXY4Aji0uoyhPhJCKju08t6YD1hoxQZFS0R1u8W5l0oW1DgTipfoMH/iaP?= =?us-ascii?Q?byups19zEGXL/jYOyqU3//8Hcsnm4hJN3rPOBeC54mqPChVLQyEAhPL10322?= =?us-ascii?Q?cL0P0IbK7mlt7Gz9ER4T2hNoDsqFgKwgFmYTBrmuKAcUl9jmykkb1kcMqVm4?= =?us-ascii?Q?XwvPjZKdE6LZel9k27hNDPbXXIyHZ8b0orD4vcbtXsiS1omKYSZ1A0o3swsV?= =?us-ascii?Q?6UEoYDf8leXdO+EDn7+GLu3DLGu0/TajneYPhMiGdX3OnL9sB4MM3bTX73yP?= =?us-ascii?Q?m9aW31Iywm9ZhznOTZPCdnCplTjhF9oqAOJJK7nPJwzonqzPBO8t+lFzg9Y2?= =?us-ascii?Q?SsRXb3A3nbWYPrS7Z+6EA8Mla2mPIw86QE/3LAqXJ1NyFOo1lQ+nnJMS+Mtx?= =?us-ascii?Q?mtuDMM3tFuh61Rz8AdrsR/0WqjxQUj1qc/E50bSvtFUCM1mkn77gWnrxAuOZ?= =?us-ascii?Q?6FWgVl78i+BN22PZ4Mmaf5n5AqZSS4Hz90ijnSPFvxiNnG2EBq4eD4FI2dcz?= =?us-ascii?Q?J3Odr40CvS9xBLNz2S89NPMfkYaW2GOtTh14+1g0tN5cfSLFnGcLcdAMf5Rt?= =?us-ascii?Q?hy+CxmI7fWqEDD5jmz0iV9Rak8bvu5PJtN4uFVBGZ7f/qWjiFOpuZ87bEVbF?= =?us-ascii?Q?TtkNwQ5RXAPHOL+1F1EMq/hOT4pu19X41Z2+TS8GU+uL7/sRv78qWnvQTmGs?= =?us-ascii?Q?tnaY1piYFp7SRO1rgnoF5qMPE/Fok5Cd5coSdZbUoIzzSdak75qeZX261hv5?= =?us-ascii?Q?hMEAinLO0nt+pIiF+SiLVzL/DxDfvkFZlPKKka9VFzaAt/PMxnY9E123ILyn?= =?us-ascii?Q?QxTTtTJFwpEIxN/SEK05wF3U8y9NCL7nUonfWEqgqgj6VXKP2N4njxMOjSjn?= =?us-ascii?Q?pigkpMMnzagvh52PjX4hdl/lYS6Ztg1+UUUJPPCa1acCYPJ+3n8hSLpflBYU?= =?us-ascii?Q?LcgZrM2PeM0v6KxVbLMtmzzi9psJx+x4j1Raapv05slgW4nlSzeV9GX3h6Z8?= =?us-ascii?Q?WYQ66lSgHjAaWW87qOujT9dizopNzFKlJE4rOTRWutgjoQjuzzjcbaDx3KOh?= =?us-ascii?Q?ApABoeVJOaeisvDwX4n88LUx5xWVG1J6/X3V9Q2hbGest58Dra69PzwDA2w7?= X-MS-Exchange-AntiSpam-MessageData-1: 45HfX1hUhW81Dr5pKJFNuzybuLelj7rjf4s= X-OriginatorOrg: siemens.com X-MS-Exchange-CrossTenant-Network-Message-Id: 58cd89ad-3aa4-439f-5231-08df040c2fc1 X-MS-Exchange-CrossTenant-AuthSource: AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 07:24:09.8487 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 38ae3bcd-9579-4fd4-adda-b42e1495d55a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: p7L61pyw9/2mN5GwHpSle26p5z+Spdgb9XbOZFHFrEPeW3tl4WdsnKV/OY8gDGmz6H55U4w23EsbKrSj8HJpwU/wayrya1Ny8cSwbWBKl3g= X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR10MB3343 Content-Type: text/plain; charset="utf-8" Add CONFIG_RV_EDGE_STAT, an optional feature that records how long a monitor's automaton dwells in a state and exposes it per edge through a per-monitor "stats" tracefs file. The core allocates a per-CPU buffer on first enable and reports, per edge and per CPU, the count, maximum and summed dwell time. Only the owning CPU writes the counters, so a reader snapshots them with local64_read() with no IPI and no locking on the accounting path. Signed-off-by: Tobias Schaffner --- .../trace/rv/runtime-verification.rst | 24 ++++ include/linux/rv.h | 14 +++ include/linux/rv_edge_stat.h | 25 +++- kernel/trace/rv/Kconfig | 11 ++ kernel/trace/rv/rv.c | 116 +++++++++++++++++- 5 files changed, 184 insertions(+), 6 deletions(-) diff --git a/Documentation/trace/rv/runtime-verification.rst b/Documentatio= n/trace/rv/runtime-verification.rst index c700dde9259c..194b2f9db461 100644 --- a/Documentation/trace/rv/runtime-verification.rst +++ b/Documentation/trace/rv/runtime-verification.rst @@ -229,3 +229,27 @@ For example:: nop [panic] printk + +**monitors/MONITOR/stats** + +Present only when the kernel is built with CONFIG_RV_EDGE_STAT=3Dy and *MO= NITOR* +is a per-cpu DA/HA (automaton) monitor. It reports how long the automaton +dwells in each state before leaving it, timed with local_clock() and accou= nted +per outgoing edge and per CPU. + +- The first line is a header naming the columns. +- Each following line describes one edge on one CPU:: + + cpu edge label count max_ns sum_ns + + *count* is the number of times the edge was taken, *max_ns* and *sum_ns*= are + the worst and total dwell in nanoseconds, and *label* is "state:event". + +The counters are reset each time the monitor is enabled. + +For example:: + + # cat monitors/wip/stats + # cpu edge label count max_ns sum_ns + 0 0 preemptive:preempt_disable 4210 183200 95501200 + 0 4 non_preemptive:preempt_enable 4208 42600 3812900 diff --git a/include/linux/rv.h b/include/linux/rv.h index 541ba404926a..7eeecce17e50 100644 --- a/include/linux/rv.h +++ b/include/linux/rv.h @@ -136,6 +136,16 @@ struct rv_reactor { }; #endif =20 +/** + * struct rv_edge_cfg - per-edge dwell-time statistics for a monitor + * @n_edges: number of automaton edges (STATE_MAX * EVENT_MAX) + * @edge_name: optional, write a human name for @edge into @buf (may be NU= LL) + */ +struct rv_edge_cfg { + unsigned int n_edges; + void (*edge_name)(unsigned int edge, char *buf, size_t len); +}; + struct rv_monitor { const char *name; const char *description; @@ -146,6 +156,10 @@ struct rv_monitor { #ifdef CONFIG_RV_REACTORS struct rv_reactor *reactor; __printf(1, 0) void (*react)(const char *msg, va_list args); +#endif +#ifdef CONFIG_RV_EDGE_STAT + const struct rv_edge_cfg *edge_cfg; + void __percpu *edge_pcpu; #endif struct list_head list; struct rv_monitor *parent; diff --git a/include/linux/rv_edge_stat.h b/include/linux/rv_edge_stat.h index 751de8074dcc..fda30ff728a1 100644 --- a/include/linux/rv_edge_stat.h +++ b/include/linux/rv_edge_stat.h @@ -9,14 +9,11 @@ #define _LINUX_RV_EDGE_STAT_H =20 #include +#include +#include #include #include =20 -/* - * Per-CPU counters kept in local64_t so accounting is safe against interr= upt - * and NMI nesting on the owning CPU without disabling interrupts -- the s= ame - * approach the trace ring buffer uses. Only the owning CPU writes. - */ struct rv_edge_stat { local64_t count; local64_t sum_ns; @@ -42,4 +39,22 @@ void rv_edge_stat_account(struct rv_edge_stat *s, u64 dw= ell_ns) } } =20 +#ifdef CONFIG_RV_EDGE_STAT +/** + * rv_edge_account - record a dwell of @dwell_ns on @edge of monitor @mon + * + * Cheap and lock-free: the local64_t counters make this safe against inte= rrupt + * and NMI nesting on the current CPU without disabling interrupts, so it = does + * not perturb the latency being measured. The caller only needs to stay o= n its + * CPU for the call (as tracepoint probes already do). + */ +static __always_inline void +rv_edge_account(struct rv_monitor *mon, unsigned int edge, u64 dwell_ns) +{ + struct rv_edge_stat *e =3D this_cpu_ptr(mon->edge_pcpu); + + rv_edge_stat_account(&e[edge], dwell_ns); +} +#endif /* CONFIG_RV_EDGE_STAT */ + #endif /* _LINUX_RV_EDGE_STAT_H */ diff --git a/kernel/trace/rv/Kconfig b/kernel/trace/rv/Kconfig index 3884b14df375..9d76dff394ca 100644 --- a/kernel/trace/rv/Kconfig +++ b/kernel/trace/rv/Kconfig @@ -59,6 +59,17 @@ config RV_PER_TASK_MONITORS This option configures the maximum number of per-task RV monitors that = can run simultaneously. =20 +config RV_EDGE_STAT + bool "Per-edge dwell-time statistics" + depends on RV + help + Record per-edge dwell-time statistics for per-cpu DA/HA monitors and + expose them through a per-monitor "stats" tracefs file. This times + each monitored automaton transition with local_clock(), so leave it + off if you do not need the statistics. + + If unsure, say N. + source "kernel/trace/rv/monitors/wip/Kconfig" source "kernel/trace/rv/monitors/wwnr/Kconfig" =20 diff --git a/kernel/trace/rv/rv.c b/kernel/trace/rv/rv.c index ee4e68102f17..88a0bbaec4d0 100644 --- a/kernel/trace/rv/rv.c +++ b/kernel/trace/rv/rv.c @@ -142,6 +142,12 @@ #include #include #include +#include +#ifdef CONFIG_RV_EDGE_STAT +#include +#include +#include +#endif =20 #ifdef CONFIG_RV_MON_EVENTS #define CREATE_TRACE_POINTS @@ -278,6 +284,9 @@ static void rv_disable_single(struct rv_monitor *mon) __rv_disable_monitor(mon, true); } =20 +static int rv_edge_setup(struct rv_monitor *mon); +static void rv_edge_reset(struct rv_monitor *mon); + static int rv_enable_single(struct rv_monitor *mon) { int retval; @@ -289,9 +298,15 @@ static int rv_enable_single(struct rv_monitor *mon) =20 retval =3D mon->enable(); =20 - if (!retval) + if (!retval) { mon->enabled =3D 1; =20 + if (rv_edge_setup(mon)) + pr_warn("rv: %s: edge statistics unavailable (out of memory)\n", + mon->name); + rv_edge_reset(mon); + } + return retval; } =20 @@ -412,6 +427,101 @@ static const struct file_operations interface_desc_fo= ps =3D { .read =3D monitor_desc_read_data, }; =20 +#ifdef CONFIG_RV_EDGE_STAT +static size_t rv_edge_blob_size(const struct rv_monitor *mon) +{ + return mon->edge_cfg->n_edges * sizeof(struct rv_edge_stat); +} + +static void rv_edge_reset_ipi(void *info) +{ + struct rv_monitor *mon =3D info; + + memset(this_cpu_ptr(mon->edge_pcpu), 0, rv_edge_blob_size(mon)); +} + +/* rv_edge_reset - zero the statistics; call from a monitor reset/enable. = */ +static void rv_edge_reset(struct rv_monitor *mon) +{ + if (mon->edge_pcpu) + on_each_cpu(rv_edge_reset_ipi, mon, 1); +} + +/* + * The counters are per-CPU and only the owning CPU writes them, so a read= er on + * any CPU can snapshot them with local64_read(). + */ +static int rv_edge_stats_show(struct seq_file *seq, void *v) +{ + struct rv_monitor *mon =3D seq->private; + const struct rv_edge_cfg *cfg =3D mon->edge_cfg; + unsigned int e; + int cpu; + + seq_puts(seq, "# cpu edge label count max_ns sum_ns\n"); + + if (!mon->edge_pcpu) + return 0; + + for_each_online_cpu(cpu) { + struct rv_edge_stat *s =3D per_cpu_ptr(mon->edge_pcpu, cpu); + + for (e =3D 0; e < cfg->n_edges; e++) { + char lbl[48] =3D ""; + + if (cfg->edge_name) + cfg->edge_name(e, lbl, sizeof(lbl)); + seq_printf(seq, "%d %u %s %llu %llu %llu\n", + cpu, e, lbl, + (u64)local64_read(&s[e].count), + (u64)local64_read(&s[e].max_ns), + (u64)local64_read(&s[e].sum_ns)); + } + } + return 0; +} + +static int rv_edge_stats_open(struct inode *inode, struct file *file) +{ + return single_open(file, rv_edge_stats_show, inode->i_private); +} + +static const struct file_operations rv_edge_stats_fops =3D { + .open =3D rv_edge_stats_open, + .read =3D seq_read, + .llseek =3D seq_lseek, + .release =3D single_release, +}; + +/* + * Allocate the per-CPU buffer and expose stats. Done on first enable + * rather than at registration because a DA/HA monitor's edge_cfg is bound= by + * da_monitor_init(), which runs from the monitor's enable path. + */ +static int rv_edge_setup(struct rv_monitor *mon) +{ + if (!mon->edge_cfg || !mon->edge_cfg->n_edges || mon->edge_pcpu) + return 0; + + mon->edge_pcpu =3D __alloc_percpu(rv_edge_blob_size(mon), + __alignof__(struct rv_edge_stat)); + if (!mon->edge_pcpu) + return -ENOMEM; + + if (!rv_create_file("stats", RV_MODE_READ, mon->root_d, mon, + &rv_edge_stats_fops)) { + free_percpu(mon->edge_pcpu); + mon->edge_pcpu =3D NULL; + return -ENOMEM; + } + + return 0; +} +#else +static int rv_edge_setup(struct rv_monitor *mon) { return 0; } +static void rv_edge_reset(struct rv_monitor *mon) { } +#endif /* CONFIG_RV_EDGE_STAT */ + /* * During the registration of a monitor, this function creates * the monitor dir, where the specific options of the monitor @@ -747,6 +857,10 @@ static const struct file_operations monitoring_on_fops= =3D { =20 static void destroy_monitor_dir(struct rv_monitor *mon) { +#ifdef CONFIG_RV_EDGE_STAT + free_percpu(mon->edge_pcpu); + mon->edge_pcpu =3D NULL; +#endif rv_remove(mon->root_d); } =20 --=20 2.43.0 From nobody Sun Sep 27 02:52:24 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011061.outbound.protection.outlook.com [52.101.70.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 49F5313790B; Thu, 27 Aug 2026 07:24:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.61 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787815467; cv=fail; b=pIyYeGe8kYVf4kDLHfwrZBhZzU98+YZ1z09RoOSGIeSrscFiIpxkE2a29uA2Heb4OK23MEQrG/p/sLYjHZ/zwTxvmZtNbFSDHDqrgmJRqGXlOq1F9DcNgwsyXd5ZMfieLaYCc9vxrIp95mv1VYoq7Res6+qboLLsBy8c/AxoTGw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787815467; c=relaxed/simple; bh=sGn5IngRTQCVmxcTM3LxLeRGJNIr5a00p0Fx6Ww1yww=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=WPGfLrVNQZFf2epxIRwDr6gvNoCIWXrJMiTag4w6Xs44dFa7OqqXj2eOJnH2GRn5qRP2ubaNIXNiggpLgPKF6nGPJeH4QKbTa4UtXmC5r2GUhpaYsi2kA5Dns4JztMpxzl9cHBad29yrJiJVpG7gDYZ7mLZrZ1Udc+dKaYZhDDo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com; spf=pass smtp.mailfrom=siemens.com; dkim=pass (2048-bit key) header.d=siemens.com header.i=@siemens.com header.b=lzcIW4YG; arc=fail smtp.client-ip=52.101.70.61 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=siemens.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=siemens.com header.i=@siemens.com header.b="lzcIW4YG" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wFvuKTIamLbPx/yVj8MWdf3lUh1DUSki6VzsbZGnd2L56/cReuZC53oZkoBs81032gmCm/pYDLFLwPqGqMlPQtv55rabGwO7B6ojdIuq1CIeJAM7qFiKU7XO70u8581niOx4cX+pPWrVmYjWqqpAaJ+F65IYLZ5EbzB8yC/GAXxihqe9sRVal7rdIbfKqVntmpegF8h5SYD/7gIU9bluECfE8SeufPekRfs7unD5UVWj/iTygWh3cpLa9PDTUuQETmAdVMZuCEVOzLQGyd5xQTa4mDQm/+djg7L/bHFdoNmXFAJJRfyEuG47Ajl+JHwVfugAVP80HdlH0iyceThZAg== 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=YVqO33XpiYY0gncD8uqn39VcoiFOU/lhwjBFZ6oaQaI=; b=kVkd7fxJNaI74hIa5wF0YonwIflsr4UET8ZWHLKZCsfciNTVSq3FFEL42mR3SQNZZ11DZ5DB0RlnHU7JbCXIbLWt6xP/U4US84UEkRQpVmEQHRcTlSbN/3N99CTr1ZnA0EbcLOeVKi+aG7UtnXM77KbHXlg5QiOmFbd774N8zJMnAAZg2ZTOmlMlxyQk9y2ruMA5c1O9dJhOa5Gw5OgOu56eukoe6d7MOZxRjCSFDZnQPbWA1hyZgFeGAHiS3YFZ2Co9vGKvVu58xbzuIjwGrwTPI9RjKd48syOHyzSxzsufTtbA2s1U82bcA/xb3z+BszPa0rAskIX6bELINBtiJA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=siemens.com; dmarc=pass action=none header.from=siemens.com; dkim=pass header.d=siemens.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=siemens.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=YVqO33XpiYY0gncD8uqn39VcoiFOU/lhwjBFZ6oaQaI=; b=lzcIW4YG+KLwPaZu+d0cXcVFmxoe8ifw9uZLY22cDSmtiwKHr4nyu7K92XKGY7MCe9tWs9IYCNfsyv3GiPRlGYYM4BwSnWBK71Qo5GkufASPNiOm1kveOjsggnnYzj66J12O7gUfjHC4Zytbq+4xSaaEzUxqYUupeoOKLJmp7z2dYtDIssjguj1x0InBWk21T+xZJeMMwRLf42ynsdageGffIgqpi/uW/gGgeXQbvzg9N1oh2XQ+w09gRhelhWG1Ram5duL7O5+w+9vwCFZUFENM5VCdxwiMt91Hp5joNEXtOEm3d/N6braiHHbErgAyPJhU1zUjGWcZWFwYDTc8xA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=siemens.com; Received: from AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:3dd::5) by GV1PR10MB8608.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:150:1d1::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.10; Thu, 27 Aug 2026 07:24:11 +0000 Received: from AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM ([fe80::5f49:b0e9:d295:22d8]) by AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM ([fe80::5f49:b0e9:d295:22d8%6]) with mapi id 15.21.0339.008; Thu, 27 Aug 2026 07:24:11 +0000 From: Tobias Schaffner To: Steven Rostedt , Gabriele Monaco Cc: Jonathan Corbet , Shuah Khan , Masami Hiramatsu , Mathieu Desnoyers , Jan Kiszka , Philippe Gerum , linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Tobias Schaffner Subject: [RFC 3/3] rv: collect per-edge dwell time for per-cpu DA/HA monitors Date: Thu, 27 Aug 2026 09:24:00 +0200 Message-ID: <20260827072400.45734-4-tobias.schaffner@siemens.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260827072400.45734-1-tobias.schaffner@siemens.com> References: <20260827072400.45734-1-tobias.schaffner@siemens.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR3P281CA0071.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4b::7) To AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:3dd::5) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM9PR10MB4992:EE_|GV1PR10MB8608:EE_ X-MS-Office365-Filtering-Correlation-Id: abeafbad-58a6-448b-798f-08df040c3055 X-MS-Exchange-AtpMessageProperties: SA X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|23010399003|10070799003|366016|6133799003|10067099003|56012099006|11063799006|55112099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: hAVNQSd3AsPZ2vCGxo5KUUXsk3FuNDb/YJ3eLMA01/OEfVBZx4oKi6lnB25c6+9dcXKrjzwH/HdVuVdhikpLXX20N6bzzXf/5YKkAHV2Lh/cOFNszny1YNffOVXNILaiLr4ioo4Jj50AhGc4x3XcnAZJeLqZlTx4zs6D1knM7haLIdENxf8qlFg6OT/cbBLj2XxsNH/YkL72PF2hRkJJ4O9ZTp5BfU0iCuKKLP4rRsT2eSVGEwdQxXY8VvS8gQVOJaPVtHjba/SYU6BH/zGu3MyWqrgd5QW5rSIAzWee0wx3+wv6GNidKBAsYLLRuClJmhhz2DMpN7Koo0XZjRbQrsiHDhhSrgca2ETNLnWdSsJUAI7kkQv+1R9qAgQtP8eGnfb+T0h5ZJB3/TMCL9VIXmjBVTb+FytmXQuFYxdsf1n+a6HhWS/BuSnnvDZLHXyA2zX+3pzgAFWcJ1DH4mQ0vYgccDr9LAZUWc0Mmzrc7gHGcioLJdBv3Zl3lZqMUMpP0wnEBIDTA+qBPvQ/VFd4LxrYB72fIKFuqW3tSHs/coJ3rQngTm/A/Kx6/sBaElQaPin6yeX45p0E4JrNaIOnSVtUE+nRxTR5GK/S013cYdZFIuOh3C/FWJLPYVblNXIvNOwP8ajX6mU+hTrDOmg9yEp1wtZdSlxNXjVMOv6t+bE= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(23010399003)(10070799003)(366016)(6133799003)(10067099003)(56012099006)(11063799006)(55112099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?9WacdKKDkOxvjM64p0UuutjrvOXzJ8hk2y/hB3p/tmMzVcuXj+LPpg1PSEX0?= =?us-ascii?Q?RdvnmGJ5b2F40JIhYD89zpf8M+cMo4aSUQ9Zd4iEjuIWTk10QPyPVUgatmjg?= =?us-ascii?Q?4yjz7fOMkXHG65mmsK77P86T8AuwDhnZ/cBULFm48GPUFi0jxY+6zRVXyh45?= =?us-ascii?Q?MDcTA5lxTcQSB65XFtIgvS2nWIQXfJKgrrYgQEzwslMZN0AgGREo72EFcnbT?= =?us-ascii?Q?+DzPDa3a1LttlDs50NLlnkLoRaEI0mjsAK1NSvcNzpWyZziGkMomDiCtATO/?= =?us-ascii?Q?D9YOWYdsK7NX0q7gz0Og6zkzYr25oDldS4pp4+nJfDAzOrDajeyIrJCBFO3V?= =?us-ascii?Q?0xp8S/I+uDASOAh/jKkfctpaJUWD0p4tV/Xp/11nv432ZdEwn8PIKzmXmk1Z?= =?us-ascii?Q?W7CHhc4hIjXB6ruZO/wKefmlMmzRw2F9MYpuseGLWul5xAlb42FgIjM0gEMd?= =?us-ascii?Q?SL2OtSv4BPYA22aRt9a2XU3pV7aOpXUrNxrp2lGKq4nxPjCbywPlIqcvbhtR?= =?us-ascii?Q?ZLfkcf69bUEI8KyQkB2kaT2x6sngODJAoDjDzrFeQPfYcU2sexxe4hdni7ln?= =?us-ascii?Q?BfkPTe91btFZiBRar14yc9GLiXyKe5AhVHhOzJN7aklIG70vu5xvpgz2A5Hc?= =?us-ascii?Q?SNXFbO9isHnbLFYlpk4exrfA6C66GN2+W+9bZlWEaSbC0e+RZcgXpa7TlIRo?= =?us-ascii?Q?K3MOB0D89l6oKZSKnyp4GdFUpNe7n7ozK3m0Mbek8aFdtJKQXM0VTV0V/oH9?= =?us-ascii?Q?xzkPdgYaj0I8Uh5mecW4tE38tcfE1EzQtKP/zSilq77IJOpDqBSAAuRBV7zv?= =?us-ascii?Q?MgqkX4aLOxE0ddf3+FTZizDBJ4lqRnUHZPqW4tBRsFwFbA459RlSvPApp8nE?= =?us-ascii?Q?Hsz+To0egKelvJqaSTfTg70ST/OWpBheTxeG+nq5sQ9UzZ8U/wypix0DdnCR?= =?us-ascii?Q?nsA6zi7GfqsYB3wJvyTnPzqV5qG84oYiI0Phy20awsU9ZsXipQByFNFK6iNY?= =?us-ascii?Q?Siaa2qLUE1qOLCU+dTrpdbTHFOKhzenK+ECGYGkHFUKFI/9tQ/ijWO87Ed5y?= =?us-ascii?Q?oqnuDnBASpTS4RaHWQewPTCoOJqfcXKg6Dp7AyGFRDfNGC/AMlZGz8nBSg+r?= =?us-ascii?Q?5OzbjY4kLKhjZZjLIGkhea1jlrdGwpM3JP1uSqusEaeS9cuNeqXmPaOWB5Y7?= =?us-ascii?Q?Rg5fikeBCGWUHrSGHfJscLCavzNrBnSSYeF9mpPURmBxOvl3L+wvU6v1yfEl?= =?us-ascii?Q?X/Tj2X2nqMn+70M+VoT9KyQ6zix6SbnUV3XYIOHwYq//gmUkQZVMfuZtrG4k?= =?us-ascii?Q?PfoLmv0jHexCZzqmg2PDkLygZppiXQyPHUW8dg+ZrBCRxkYm7OJLYyDXK/5L?= =?us-ascii?Q?R7GQii1zW3DTJhkmqfO/BUDcJR8iqLSsvoXzuF24Gwmiuf8m0T6HWOiWBxFm?= =?us-ascii?Q?2MM6RJ8BELLMjlfJHSYMkw+RXJu/opy85C0mtLAr7FDcccmMmFyaC7S52Uc1?= =?us-ascii?Q?a6pd9nPwNTRnRamIKCgMyIhAwRYA8FCikWXVgKSnc552IvFfX4nIlfxlW23F?= =?us-ascii?Q?7i+6Qy7Qn9v8lp6olm/0HH4lCx3D78X6XaObfPik8FVSTQhRsApipTP6SYEj?= =?us-ascii?Q?Bk0qAEVnQCrzQd2C/8dTacJutuZGU4h0tmCP6ui6JYiQn4ZJTnfg5nV98sVK?= =?us-ascii?Q?Hzt90oH8jGsIYnaIZIgYV2SkttjKnDIXVNjK8Hg2VYcGzzGOwBOIYYXuWuk2?= =?us-ascii?Q?b/Xmh3NAHtp+VER+Rigw/R3SmGv+wCGsKFd6dh8cyoNEm7OVZercoESDZkVK?= X-MS-Exchange-AntiSpam-MessageData-1: KC8cu/0T45EdLUbXUOkvmwm4V4m8QBTqCxw= X-OriginatorOrg: siemens.com X-MS-Exchange-CrossTenant-Network-Message-Id: abeafbad-58a6-448b-798f-08df040c3055 X-MS-Exchange-CrossTenant-AuthSource: AM9PR10MB4992.EURPRD10.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 07:24:10.9855 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 38ae3bcd-9579-4fd4-adda-b42e1495d55a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: lek9uBzbsaa+ZmfXcqG5JmVKHI9NE2gUh/pNX2AGj+NLegxwXQFyG+DZx4RF9QbuIoRnQ9bdti7pYubMSErxjc2j8+kiBuyoU2CFPhDizAE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV1PR10MB8608 Content-Type: text/plain; charset="utf-8" With the core facility in place, hook it into the DA/HA layer so that any per-cpu automaton monitor also reports how long it lingers in each state. Add a selftest that enables a per-cpu monitor, checks the stats file appears and is populated under load, and skips cleanly otherwise. Signed-off-by: Tobias Schaffner --- include/linux/rv.h | 4 ++ include/rv/da_monitor.h | 53 +++++++++++++++++++ tools/testing/selftests/verification/config | 1 + .../verification/test.d/rv_edge_stats.tc | 32 +++++++++++ 4 files changed, 90 insertions(+) create mode 100644 tools/testing/selftests/verification/test.d/rv_edge_sta= ts.tc diff --git a/include/linux/rv.h b/include/linux/rv.h index 7eeecce17e50..09363f79ca90 100644 --- a/include/linux/rv.h +++ b/include/linux/rv.h @@ -27,6 +27,10 @@ struct da_monitor { bool monitoring; unsigned int curr_state; +#ifdef CONFIG_RV_EDGE_STAT + /* local_clock() ns when curr_state was entered; 0 =3D not yet stamped. */ + u64 state_ns; +#endif }; =20 #ifdef CONFIG_RV_LTL_MONITOR diff --git a/include/rv/da_monitor.h b/include/rv/da_monitor.h index 34b8fba9ecd4..59ca9a286c10 100644 --- a/include/rv/da_monitor.h +++ b/include/rv/da_monitor.h @@ -16,6 +16,8 @@ =20 #include #include +#include +#include #include #include #include @@ -30,6 +32,54 @@ =20 static struct rv_monitor rv_this; =20 +/* per-edge dwell statistics, wired up for per-cpu monitors. */ +#if defined(CONFIG_RV_EDGE_STAT) && RV_MON_TYPE =3D=3D RV_MON_PER_CPU +static void +rv_this_edge_name(unsigned int edge, char *buf, size_t len) +{ + snprintf(buf, len, "%s:%s", model_get_state_name(edge / EVENT_MAX), + model_get_event_name(edge % EVENT_MAX)); +} + +static const struct rv_edge_cfg rv_this_edge_cfg =3D { + .n_edges =3D STATE_MAX * EVENT_MAX, + .edge_name =3D rv_this_edge_name, +}; + +/* Hand the model's edge descriptor to the core; called from da_monitor_in= it(). */ +static inline void rv_edge_bind(void) +{ + rv_this.edge_cfg =3D &rv_this_edge_cfg; +} + +/* Stamp the moment a state is entered, so its dwell can be timed on exit.= */ +static __always_inline void rv_da_edge_enter(struct da_monitor *da_mon) +{ + da_mon->state_ns =3D local_clock(); +} + +/* Account the dwell in @curr, then stamp entry into the next state. */ +static __always_inline void +rv_da_edge_account(struct da_monitor *da_mon, enum states curr, enum event= s ev) +{ + u64 now =3D local_clock(); + u64 prev =3D da_mon->state_ns; + + da_mon->state_ns =3D now; + /* + * local_clock() is not guaranteed monotonic; drop the sample if it did + * not advance so a backward step cannot underflow into a bogus dwell. + */ + if (rv_this.edge_pcpu && prev && now > prev) + rv_edge_account(&rv_this, curr * EVENT_MAX + ev, now - prev); +} +#else +static inline void rv_edge_bind(void) { } +static inline void rv_da_edge_enter(struct da_monitor *da_mon) { } +static inline void +rv_da_edge_account(struct da_monitor *da_mon, enum states curr, enum event= s ev) { } +#endif /* CONFIG_RV_EDGE_STAT && RV_MON_PER_CPU */ + /* * Hook to allow the implementation of hybrid automata: define it with a * function that takes curr_state, event and next_state and returns true i= f the @@ -113,6 +163,7 @@ static inline void da_monitor_reset(struct da_monitor *= da_mon) static inline void da_monitor_start(struct da_monitor *da_mon) { da_mon->curr_state =3D model_get_initial_state(); + rv_da_edge_enter(da_mon); da_monitor_init_hook(da_mon); /* Pairs with smp_load_acquire in da_monitoring(). */ smp_store_release(&da_mon->monitoring, 1); @@ -275,6 +326,7 @@ static inline void da_monitor_reset_state_all(void) */ static inline int da_monitor_init(void) { + rv_edge_bind(); da_monitor_reset_state_all(); return 0; } @@ -696,6 +748,7 @@ static inline bool da_event(struct da_monitor *da_mon, = enum events event, da_id_ if (likely(try_cmpxchg(&da_mon->curr_state, &curr_state, next_state))) { if (!da_monitor_event_hook(da_mon, curr_state, event, next_state, id)) return false; + rv_da_edge_account(da_mon, curr_state, event); da_trace_event(da_mon, model_get_state_name(curr_state), model_get_event_name(event), model_get_state_name(next_state), diff --git a/tools/testing/selftests/verification/config b/tools/testing/se= lftests/verification/config index 43072c1c38f4..de229777d5c8 100644 --- a/tools/testing/selftests/verification/config +++ b/tools/testing/selftests/verification/config @@ -1 +1,2 @@ CONFIG_RV=3Dy +CONFIG_RV_EDGE_STAT=3Dy diff --git a/tools/testing/selftests/verification/test.d/rv_edge_stats.tc b= /tools/testing/selftests/verification/test.d/rv_edge_stats.tc new file mode 100644 index 000000000000..5fb2384d938c --- /dev/null +++ b/tools/testing/selftests/verification/test.d/rv_edge_stats.tc @@ -0,0 +1,32 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-or-later +# description: Test per-edge dwell-time statistics (stats) + +MON=3Dwip + +check_requires "$MON:monitor" + +# The "stats" file is created on first enable; if it is still missing the +# kernel was built without CONFIG_RV_EDGE_STAT, so skip. +echo 1 > "monitors/$MON/enable" +if [ ! -e "monitors/$MON/stats" ]; then + echo 0 > "monitors/$MON/enable" + echo "CONFIG_RV_EDGE_STAT is not enabled." + exit_unsupported +fi + +# The first line is the column header; the body has one line per (cpu, edg= e). +head -n1 "monitors/$MON/stats" | grep -q "^# cpu edge label count max_ns s= um_ns" +[ "$(grep -cvE '^#' "monitors/$MON/stats")" -gt 0 ] + +# Drive some scheduler activity so the automaton records transitions. +for _ in 1 2 3 4 5 6 7 8 9 10; do + (true) & + wait +done + +# At least one edge must now show a non-zero count, with sum_ns >=3D max_n= s > 0. +grep -vE '^#' "monitors/$MON/stats" | \ + awk '$4 > 0 && $5 > 0 && $6 >=3D $5 { hit =3D 1 } END { exit !hit }' + +echo 0 > "monitors/$MON/enable" --=20 2.43.0