From nobody Thu Oct 2 23:53:20 2025 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2052.outbound.protection.outlook.com [40.107.223.52]) (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 48267322A34; Tue, 9 Sep 2025 11:43:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.223.52 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418239; cv=fail; b=Sr/FLyvWuTCG1OBv82S/bF2bbsTuZqRvHlkrNl3oy6lN1y73V/llAj/AIoVBk1g3YTvugNbP1BQGlhx6KlMDtS/PaCFXIloDe+fOYv3TcJD8MEuMHAKD2+O2+XB2Jb3dX8zy1J5fENdS/X0AcTGd1yh1xN6osw7pd2MpZ6UWB2Q= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418239; c=relaxed/simple; bh=NtkI70RtTfF5+4aXa4bFk0/lUXAX+lAbo3kZqBgK6uc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=DJjrKDu/g0my7LFePQ+fDWxNe1FIyeMISAVhMvhUwFaYSnBLsavH00hahMH9p8MhS2+3JE22SjCHtuFnXj3CQJkCUC7VB9FWK4OwXYNrfBMvVkuI/dT9E/ceghbdN81iaTF8xN94ze0TQupmNm7APKeTljF4bjzRhCS05EVGjjQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=u5dVAJXz; arc=fail smtp.client-ip=40.107.223.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="u5dVAJXz" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=fwOTu9QenEgxZAd1LumryxxqmOy2bqMbra5/lyLJPniH8WSEg6oliYVZH1K7vTxAwVATEGKtodnDe0utQzgsgtHcRwdUbPDyyDWILV8OnrvWHc5GifyzusZ1k4zGuAehOi3NMuVnp9vidcrbvrS4FIMyibOKHMpWBhFusJdvQ+sbKrHX+ObtQS8NSKHqCUxzZp7aO4ydyNBubvYO+YPzgaQf65e4L0BUCeyM+i4jQMPM85uEW61+d3+U6oxvOR7DGwvToxc7ZKsIbe6Fc356Esl2T69RIljbDkgSnnxWBllS+wsTxhsmdtSGy065fuVUorp1hiVkZg6NYd+DLESn9A== 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=mNxD/4yr6Vsad4zlpYjJNNqpz9+8mTY9oOt5lDVHg5U=; b=ZwFWZ4Rz8hz7aTAPZM+GrpMagm+jY06D7jE9XojOcZ6X7NIg1jqRMLovaYFl3w8D8s9DnChklV9jZJdiqOKSa91lfqtIzzYXEnwg4/nlLPUlzCMqYs3k/9dmgTFn4cfHpXapADvIEnvYkqh6yZiCN1aPAOY0h+G5a2AOfN1O/qNAbc+t2FPwm2aalMZLsuAa7T+jkQQfU0TGxhy5HLZuUc4XR+KYnVH765qSX/pUTfFQf6Jsuxw2t+A4GvLOD2ETKmdF5vVgiZm2P5VHoMqdCarHgtwolMRssiFsL1Pd9L6jaccAGPRpFP3hb3xeThOOwqbPr9fCRZ/EZG84/aQYbA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=infradead.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mNxD/4yr6Vsad4zlpYjJNNqpz9+8mTY9oOt5lDVHg5U=; b=u5dVAJXzHvcDkzuIBb6gBAUaHiOg30OwMl8xRuN42sqQDfFBPloQeumow3IfAy31ntsKdAbfcHnmlSlVcz7uMwGuWzJvAuiDRZIZWahB9ctkmIcC6TELPNsKxB8Awp97fMRzggtMI+kIK/qbg2WQZC9peF0I08TZfPYpi3YQs2w= Received: from CH2PR05CA0051.namprd05.prod.outlook.com (2603:10b6:610:38::28) by CH3PR12MB8282.namprd12.prod.outlook.com (2603:10b6:610:124::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Tue, 9 Sep 2025 11:43:54 +0000 Received: from CH3PEPF0000000C.namprd04.prod.outlook.com (2603:10b6:610:38:cafe::f9) by CH2PR05CA0051.outlook.office365.com (2603:10b6:610:38::28) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9115.15 via Frontend Transport; Tue, 9 Sep 2025 11:43:54 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by CH3PEPF0000000C.mail.protection.outlook.com (10.167.244.39) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9115.13 via Frontend Transport; Tue, 9 Sep 2025 11:43:54 +0000 Received: from tapi.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 9 Sep 2025 04:43:42 -0700 From: Swapnil Sapkal To: , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH RESEND v4 01/11] perf: Add print_separator to util Date: Tue, 9 Sep 2025 11:42:17 +0000 Message-ID: <20250909114227.58802-2-swapnil.sapkal@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250909114227.58802-1-swapnil.sapkal@amd.com> References: <20250909114227.58802-1-swapnil.sapkal@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH3PEPF0000000C:EE_|CH3PR12MB8282:EE_ X-MS-Office365-Filtering-Correlation-Id: 670478bd-0371-4986-135a-08ddef962766 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|1800799024|82310400026|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?2kObTMpPBkgHmTb1OaEGSWrJKHkSbKsuZ3HElhx2fSI8jEKgOb2bXsKSmT86?= =?us-ascii?Q?6803RyMjkQek4HMFOdJA9KgtOjwFrk1nED08EnQcNvga7jSwoDjL/Hj41PLB?= =?us-ascii?Q?4sExfUg2f7MmPiwYmZ5Uvwnj9pa5j9bcnvsBogH3G6YTVI5oMlVJNVWxekML?= =?us-ascii?Q?pFHnVP5HuhNnepWCLaqK068Mm6TW8kxSuuo7SnPIvKqFZBumNhRs/0afopXz?= =?us-ascii?Q?4gEFvVbn6urYwXSMGvZbPFfsvqdIoUE+OxsYoQYgyvXucrA5pr9qJTl853+i?= =?us-ascii?Q?r/EPHO+Qa4ayy4YgDG8Osu5dI53M93eXabE4oe9EJSNJ8vfWivJCT6gpqU6Q?= =?us-ascii?Q?lWm3U5YafJTsUxl/svMgydSsk2hc1q/n0ElccH1XXlE9lqaEsKPcb3gROlfs?= =?us-ascii?Q?E0NoCMzZc09fevVTMHVLaxbNusoUf7cj+LVAiymKACvlJAapo3Gw1YuCxpoZ?= =?us-ascii?Q?vTlp2cWohS1iKN3ADMigUxOs2pRX1KQn0/VKANFMI0BWq9e4oBSvK1TnLOIx?= =?us-ascii?Q?iKdbS6EGDmzlHY4cZ7rhP3ZBzdOvraEBqap770Fw9FzCkrgvRBJREep+/Ela?= =?us-ascii?Q?0SRBQMKTCMsZboRVn7BtsyJTLA+Gb4E/0L97JERz7TNxKw190JRuZd3i4tbU?= =?us-ascii?Q?zqNv0FigKyjna1so+vLWvntdLh6FTz7CdHc4sV0cYp4bp53JJMGfon5MPpot?= =?us-ascii?Q?ZSyynNtBNQUqIXVPVFg/82uv2t412SsGkacjx4nMLS5Ms3VjG5jpNQbut+O/?= =?us-ascii?Q?xe0v1Z1LbAj5KmsI45bm5I8ASIqeQhC+iE8edT5vNF/ynIL3QS11oWXWq6B0?= =?us-ascii?Q?QiK2QwI0qyyfEak0nsU3DJUYetebdiETjZ94hpX4H5TtjB1iFYw7SPcNwjuf?= =?us-ascii?Q?Yo2uxa4VZr8mSY5rf1MzqQeLN+/tLbYI9aDTi8pkY1nYHGIKJ736FFbxCgaN?= =?us-ascii?Q?VTgiwKM3D0OAw48eJjMnLsvFmwgr9zipnk2qPpAGOJRrOyJ3rDvzc5AhxVpk?= =?us-ascii?Q?Cf1jmSK7ZNdJTKAQlD9Dy460FthRC4JouVeteONGNc5gu+ifTICcdNcQziIl?= =?us-ascii?Q?L4OlVaxk3tAU/cD5A3He08C2r/mcDgfuijYeD6yuxN840mrmGkz3ly4kaF+3?= =?us-ascii?Q?FNPWoe0jnxtcuhWk5PfJGChLokHmWqtFaP4mxgLSMgZxlEwsvNnC9qVu2Wv9?= =?us-ascii?Q?qoOvQMrU+ZFUcY2W4Tq1Yl/lpxuHfPg2goR+7A8YOkN7dRw2pZOzpTqB8P+g?= =?us-ascii?Q?Kgv42hTjkA8zE1aNjbU+QVA5CJ+sLA2u6kADley2dsMuZ+3xXi6nl0HvHeB+?= =?us-ascii?Q?4WNwf3Nx4DonhqlUwbN+wHTaL2NWg2g05BKpS/Em76ZoEJH4ft0AtB/YKY+/?= =?us-ascii?Q?Dkvy2WkzJtgpbTvzgkvs+5Q6wMwneYu+JFdZJIrQebPa7I8YZpZile2SXX1Z?= =?us-ascii?Q?IXKy+RslxL6EYBSE2SP7x+FiekPOewxcLIH4GQONlDsKHWRmH3YasRwnxXCH?= =?us-ascii?Q?pa2dlvUbCLiMhoDrx1fL5gIaiv+oRW3ACErZ?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(1800799024)(82310400026)(376014)(7416014);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2025 11:43:54.0991 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 670478bd-0371-4986-135a-08ddef962766 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH3PEPF0000000C.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB8282 Content-Type: text/plain; charset="utf-8" Add print_separator to util.c and use it wherever necessary. Signed-off-by: Swapnil Sapkal --- tools/perf/builtin-kwork.c | 13 ++++--------- tools/perf/util/util.c | 6 ++++++ tools/perf/util/util.h | 2 ++ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c index d2e08de5976d..842f59ff85ac 100644 --- a/tools/perf/builtin-kwork.c +++ b/tools/perf/builtin-kwork.c @@ -1340,11 +1340,6 @@ static struct kwork_class *kwork_class_supported_lis= t[KWORK_CLASS_MAX] =3D { [KWORK_CLASS_SCHED] =3D &kwork_sched, }; =20 -static void print_separator(int len) -{ - printf(" %.*s\n", len, graph_dotted_line); -} - static int report_print_work(struct perf_kwork *kwork, struct kwork_work *= work) { int ret =3D 0; @@ -1458,7 +1453,7 @@ static int report_print_header(struct perf_kwork *kwo= rk) } =20 printf("\n"); - print_separator(ret); + print_separator(ret, "", 0); return ret; } =20 @@ -1633,7 +1628,7 @@ static void top_print_header(struct perf_kwork *kwork= __maybe_unused) PRINT_RUNTIME_HEADER_WIDTH + RPINT_DECIMAL_WIDTH, "RUNTIME", PRINT_TASK_NAME_WIDTH, "COMMAND"); printf("\n "); - print_separator(ret); + print_separator(ret, "", 0); } =20 static int top_print_work(struct perf_kwork *kwork __maybe_unused, struct = kwork_work *work) @@ -1933,11 +1928,11 @@ static int perf_kwork__report(struct perf_kwork *kw= ork) } next =3D rb_next(next); } - print_separator(ret); + print_separator(ret, "", 0); =20 if (kwork->summary) { print_summary(kwork); - print_separator(ret); + print_separator(ret, "", 0); } =20 print_bad_events(kwork); diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c index 0f031eb80b4c..1b91834e11de 100644 --- a/tools/perf/util/util.c +++ b/tools/perf/util/util.c @@ -257,6 +257,12 @@ static int rm_rf_kcore_dir(const char *path) return 0; } =20 +void print_separator(int pre_dash_cnt, const char *s, int post_dash_cnt) +{ + printf("%.*s%s%.*s\n", pre_dash_cnt, graph_dotted_line, s, post_dash_cnt, + graph_dotted_line); +} + int rm_rf_perf_data(const char *path) { const char *pat[] =3D { diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index 3423778e39a5..de69384380c2 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h @@ -48,6 +48,8 @@ bool sysctl__nmi_watchdog_enabled(void); =20 int perf_tip(char **strp, const char *dirpath); =20 +void print_separator(int pre_dash_cnt, const char *s, int post_dash_cnt); + #ifndef HAVE_SCHED_GETCPU_SUPPORT int sched_getcpu(void); #endif --=20 2.43.0 From nobody Thu Oct 2 23:53:20 2025 Received: from NAM02-DM3-obe.outbound.protection.outlook.com (mail-dm3nam02on2042.outbound.protection.outlook.com [40.107.95.42]) (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 12D73322A0E; Tue, 9 Sep 2025 11:44:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.95.42 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418270; cv=fail; b=p7oZuhNaq1U/cc9b/Pgc/LNCxocJwyevZEjLhI1c60Mk5naER6PFjyUkxjfWZcVHc78rCXWgftXENLyc09A0Fz7SEauKsOJvYDT9xZOc/PuPhcHeFfKPO3jQO48B9+s3olSsQKkfUXRtWDXiq3l2g4B441tmun03mOa4R7pRbFA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418270; c=relaxed/simple; bh=1ksHutykAyCAs3ZIxz8+aGwFZ5EHhlZ7Mcm8WTeuMyI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=m9pL70SW3KMdupwetEHQ9KNQKcBldEUwldrdQdzu0KBRCFMnYo4+/cFsphhOfoD10QnDpzTS5GaX4gxORdfbdCRQetVuKfwaJQs5pWvfoN1xbtEbq+b+2oH6qypDVHBE1ybgaW1VHXOcLBz2OvRCeSVPH3Bz6f+uQnjrNkrXPWM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=nfnn0xBT; arc=fail smtp.client-ip=40.107.95.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="nfnn0xBT" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=UWxQg5H4m//TKWH8cN6DIJUAY18yjMN7CeZ3zOHSffoEmqHNG1z7o4YTMpHPQtkc5xFU59wLcDQc/d+yiRYom9ODfLkeqw00G9IDDAeL8XKf/cuecPHZ+hQnxHQklAsHwk7zyvwDGUaDEtrBC9IyO0RM2Wf/7mDLK/xoV86brQtEI8HN4FTAm7XhEOjE/SEVBer14VWBB+aU4W4Jr3eBJdfiG+CVZMmVqfdrFIgO7QwdgMX3hLSaX22zMWhh2efa03gulr1RyUFPIZtnP+OScGq/GY6dDCDCmHFMDipmNn6Y34xIpZRk1bd2n/r28j4CivicEGo8beeKY69su8zXDA== 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=nmfPCxHr4SSdqLB7mMRioZTXfR7oOdb555GIlHj+bgA=; b=Q7W1B87n/cPwkSoYksf2zzmnDNcOosDSdV4xC5XDKAkMblUfR6qIf00eCnyGOe+a06sOg66/H8a1poNL8zSZwEXXWbPx8lNL3SErNlWjekvcWKCvHC2cj7VGCw6cayVX2ZkciWJWp+SBT/RzO6r7CjxZPuCZKKxeyETA5VcMuC0oV1jDZHxa0fMyO7/o1JvRLVztyGHQATmGBGtFaWStcFYwS0wRWqS+QIdOLanDi9jboS3piGcmjaZ6SUGe/50PH/2KUtTSNwsE5YAiOBBsNfm0pQ1opyqs22Que4nHUfh3vP8g6trfJtc1963ylhkRJQct1DdBRUfhdUv2rx+k2Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=infradead.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nmfPCxHr4SSdqLB7mMRioZTXfR7oOdb555GIlHj+bgA=; b=nfnn0xBT1XSkXFkARcHOZov/dsGDxKV5YAjAiaihded4KQB/OFU6xqxSytRsXpYNMERjiY4EWK7IU7VXAfxvSSQtPw1jht74bDwClp1jbpfF48yXFyJ+XQOUCKpusuDdmiSqE4Rx/sSRnOgR4I75tiR5gkeROoEZUH93x8aTDvI= Received: from MN2PR03CA0007.namprd03.prod.outlook.com (2603:10b6:208:23a::12) by CY8PR12MB8242.namprd12.prod.outlook.com (2603:10b6:930:77::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Tue, 9 Sep 2025 11:44:26 +0000 Received: from BN2PEPF000044AA.namprd04.prod.outlook.com (2603:10b6:208:23a:cafe::34) by MN2PR03CA0007.outlook.office365.com (2603:10b6:208:23a::12) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9094.23 via Frontend Transport; Tue, 9 Sep 2025 11:44:25 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by BN2PEPF000044AA.mail.protection.outlook.com (10.167.243.105) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9115.13 via Frontend Transport; Tue, 9 Sep 2025 11:44:25 +0000 Received: from tapi.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 9 Sep 2025 04:44:09 -0700 From: Swapnil Sapkal To: , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH RESEND v4 02/11] tools/lib: Add list_is_first() Date: Tue, 9 Sep 2025 11:42:18 +0000 Message-ID: <20250909114227.58802-3-swapnil.sapkal@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250909114227.58802-1-swapnil.sapkal@amd.com> References: <20250909114227.58802-1-swapnil.sapkal@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF000044AA:EE_|CY8PR12MB8242:EE_ X-MS-Office365-Filtering-Correlation-Id: 756fde27-2158-488e-7523-08ddef963a41 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|36860700013|82310400026|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?g+bx2cEsmHokvfGCG5BNB0yM/nslAgn2GHCXijRFZqSyUw6UVV6mqgtl2Ncr?= =?us-ascii?Q?iYq5sqRba9TUIsJTuviRsWYYxKH9OqtK3exJzPiMz1DXOn8RADT/5L2Mqk9E?= =?us-ascii?Q?TYOHz+UUGAVJyPzZE0SQMeEnhp5DYWjKWhWY0FzVF/IlN88OOEgvdjqZ6rn0?= =?us-ascii?Q?bPfrdcmcqwWXUtZlndeYX5nbg04MiVvR3Ochhseh+u0PAbejY5/GuWKdEQxS?= =?us-ascii?Q?75g1jXkGbCHhiLhRs2ghzj5zOKeIHBbdd121S/qADBEVbUs2wBOR7wTOkQyx?= =?us-ascii?Q?3z9aayLwsWD0IM/j4s9/5oOD2UR7aPW5CWo2T0rdar4njbnBoJlPjYo83geo?= =?us-ascii?Q?rxLkwxbsePFSVMgdptLLXv40wbaRqGNhBYFhtsbc+RDX5s7binPKAWRNgO9j?= =?us-ascii?Q?P0NsbzRjq6+pY6GJL2wMYDNBbZ3gP1ckCG5Ituke7Yz/mvNf4C2UYjYa34CT?= =?us-ascii?Q?nr3hgy4ezHNrHC8FkkhkYg8cDLgrtNk+9uo3t28xBFCt0PvQ15KcLuSujOzi?= =?us-ascii?Q?/GlUD8u/P86iVYEAh7T7R3WPG7TddPiysvi3txhWJBVeAeP0XJGgM3whTSS8?= =?us-ascii?Q?kqZgQx4zHGtZq85ZO0AoyUHVbxXVJ+adO2UpOSTIqEbM8ShsFa5k5FW6mdBx?= =?us-ascii?Q?6ZOiknPJENDyip2qqrHtHJpoAkYMDsaaBS3xN3zXpcjt9avT/++JX5Dr+15/?= =?us-ascii?Q?yy4PFQa6aDn1kHeW0h3htpnz8zmEAJqnhxL8SylUrRpIPuYI5jxauypyyxh9?= =?us-ascii?Q?Imljw1xFWphR4A0tJilHs3e0SaN4FLxszSsoavLDaFFtdDnUrNT90BTYCXdh?= =?us-ascii?Q?wGDAwSjD/B1is8pYQ5KvnUms7rb7bpSC2ZRIfgLrbbiDJ5WGSmUnVgVjhDCX?= =?us-ascii?Q?KZYBYT1gwPqsAP62fG4DbkOf6sRpWv/6b7daDR8F4Tf2ravNGFJVb9bj6P0l?= =?us-ascii?Q?Zu3BBvJwIC60K75TkJ4prS/ElJKaGhk8OYQDqyVG+ftl4JlfikT0EaCZ/Gb5?= =?us-ascii?Q?qAPKdCzeTEDpoZappDKpK6yblQO1fLBEMHWetJPA6yUukN0D2C8XVloii3jG?= =?us-ascii?Q?x2CtQ2t2XTT+Lacy3IHSys3dqYRAmIYR1pmgZUflndC0LAiKEjtYtNKXFBTJ?= =?us-ascii?Q?aZmtaSh6knhXJuco9Ft6Uh2i/7Xt9+XV6gn9i2pMy4IvfpL9TVAqIBTuvRpA?= =?us-ascii?Q?5ktPPZ5vlzpnZ2ccdUJ3LKAxUwbq49nl9gcSV6tE+Z5ezMab7cknj8W7sXA3?= =?us-ascii?Q?vjSTVEn6NB/cvSRPjOzlpAE80u4huhEaDENddAGdx2sPqDC0cVPExrY7+hXP?= =?us-ascii?Q?CxmoWJUR2oFVtL1gTTWs/WqZTEHvXSMmddQYICGsGJZgorxV1q/8S/7q0S+a?= =?us-ascii?Q?v68m+8n4AJJJ7BJz8UhLlSsT0cBj+HKc17FJLugf3KY1VUSWHpNYwm+4HPEs?= =?us-ascii?Q?ZdudmRVzZGAM0r7JAAzJJIYrZV5EJZ+IGzECFfNEQ4yA/7s/orETHeT7cKYW?= =?us-ascii?Q?z8fRrvjguZPyXPnM2F5PnFFRBy7fMwshrzRw?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(36860700013)(82310400026)(376014)(7416014);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2025 11:44:25.7561 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 756fde27-2158-488e-7523-08ddef963a41 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF000044AA.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB8242 Content-Type: text/plain; charset="utf-8" Add list_is_first() to check whether @list is the first entry in list @head Signed-off-by: Swapnil Sapkal --- tools/include/linux/list.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/include/linux/list.h b/tools/include/linux/list.h index a4dfb6a7cc6a..a692ff7aed5c 100644 --- a/tools/include/linux/list.h +++ b/tools/include/linux/list.h @@ -169,6 +169,16 @@ static inline void list_move_tail(struct list_head *li= st, list_add_tail(list, head); } =20 +/** + * list_is_first -- tests whether @list is the first entry in list @head + * @list: the entry to test + * @head: the head of the list + */ +static inline int list_is_first(const struct list_head *list, const struct= list_head *head) +{ + return list->prev =3D=3D head; +} + /** * list_is_last - tests whether @list is the last entry in list @head * @list: the entry to test --=20 2.43.0 From nobody Thu Oct 2 23:53:20 2025 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2053.outbound.protection.outlook.com [40.107.223.53]) (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 1E0C6322A24; Tue, 9 Sep 2025 11:44:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.223.53 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418295; cv=fail; b=n/YRxf/mf/V9oxARNJ88ccWirQm2aktFjB21HkJHARBcap6RnKuPKVYG7rdzbbU99PB8DbZjE/iAowPsC6ggm4zE9mohhgymAY6Na07cDLfvEOog+As0jtaNq3vEr6C0ba/IQKrqoUk9hzDb2DCtRt7BmkTgLEZs7ACUSye8lJY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418295; c=relaxed/simple; bh=1+ANFpvIuB4o8yvFmqbOysPnpO72yAuXpCJ1n1mCI3A=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=P0X4pH0IB+rqDJP77deF3sK0nEGcpsk5pBhxACu7iVC4FJsYxVABa9S6c/ThvGtYKNojgHAMXsy0WAfj4oYnhdoxyldJ7t+3DSfSxozXA+JDTW0c7D42YgRx8OcES9HDmW9WrHnismdfYFUwYMpL7cUUevxh/DoAir1uQhVHOuY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=f/fj7OSk; arc=fail smtp.client-ip=40.107.223.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="f/fj7OSk" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BNlEQUxAA4lbwiFOHYhMSOeNPgBdQ7ftrKwqQKgHEnxAHivvmXHJyVUgnd+asvHQ45VOcDT9R6yj/BP8ZKoyHIcA8A6HngRB8wuk+LWZNcC7u8mbmv+TbC07AVmtIMSEkwV8DMalYqVaFyBQUgYre3+GRX6kYTPZhK7a3BU1R9z/kJIERdQRYEwGvESzb+I9nRstKwwZCyarlWvzINgtybc5sx1jzAa8uCtTNMdZBGvwx/J37YlIGevLPBgnYQSWsrupGiKdXrTPR0CGSRuqAzCYeYdxpP8JJ7TfFxsv67wvs2smIxf7APaL67Iubo0211yl+aGVFFKMfG08I+Ajdw== 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=gdSL6U44+iS0ue4w0nTq3wWn8hG8Yx9AbTL5vxaLpbQ=; b=VE/pbb5BGtWwNwild7I4eTU+eGXVSroifE2gcsU0OuZDAqQwzLElpU8/uqyP4pi6y67hufM3ng3/syue4iCX1Q+tvqflWbpcXL9f1xYzJYfdqHQ+6KmGkgdiyEEvRsSWPcK/JbprSQECPHyxQE8WwZpyINarON86xAr6oQL85/SWnEV0MThHYKJ4Ppqew1N5DUPFdFmd1d/kn0/x67Pf3lY+Iu5p1tbmEjlQADsQykWCqep70x5/UBlGuj+GBi2TH23rSG8/u5vRZ0bCoXb6+hvNykrg5WusZ48qlkUwJdHGUd9bdF73iUIBm4LCNR8SIZxvwjoc8lFkpibniSco5Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=infradead.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=gdSL6U44+iS0ue4w0nTq3wWn8hG8Yx9AbTL5vxaLpbQ=; b=f/fj7OSkXZspTO1VVW+92IQulyW3zvQ3fSmYmo+f8sJyXAqq17Fvqi886Kgbq07Y033gYmJqi4y3ga6g8gFHpKS6d06zCqzND5oIpQRSQ6akKkWIp7NjGZoz8Z8mtRMFXLgLeGHRWxek5jklLOvQdZ0ctulwL3NLUw1ZeP4qBkQ= Received: from CH0PR13CA0031.namprd13.prod.outlook.com (2603:10b6:610:b2::6) by SJ5PPF6785369A4.namprd12.prod.outlook.com (2603:10b6:a0f:fc02::997) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Tue, 9 Sep 2025 11:44:49 +0000 Received: from CH3PEPF0000000A.namprd04.prod.outlook.com (2603:10b6:610:b2:cafe::9f) by CH0PR13CA0031.outlook.office365.com (2603:10b6:610:b2::6) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9115.9 via Frontend Transport; Tue, 9 Sep 2025 11:44:17 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by CH3PEPF0000000A.mail.protection.outlook.com (10.167.244.37) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9115.13 via Frontend Transport; Tue, 9 Sep 2025 11:44:48 +0000 Received: from tapi.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 9 Sep 2025 04:44:36 -0700 From: Swapnil Sapkal To: , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH RESEND v4 03/11] perf header: Support CPU DOMAIN relation info Date: Tue, 9 Sep 2025 11:42:19 +0000 Message-ID: <20250909114227.58802-4-swapnil.sapkal@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250909114227.58802-1-swapnil.sapkal@amd.com> References: <20250909114227.58802-1-swapnil.sapkal@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH3PEPF0000000A:EE_|SJ5PPF6785369A4:EE_ X-MS-Office365-Filtering-Correlation-Id: d2d30d0a-0d6e-47ce-f1ab-08ddef96480d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|1800799024|82310400026|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?KcNJlC4hwWjQU9ZwD/ecemo3y12EdJJ8AUt7n8bMUwOd8cfVcYj/RqtRCEwV?= =?us-ascii?Q?hLblneaO1D/131zneer5iz9pc/fpTej/k+sDlFwKZ0SYR84PyRD116b2Aqp7?= =?us-ascii?Q?qk2m6FmbDbQDeVRalo4gPOTtGpah8GXzX8uOrp0E8M12t8uGFFtoky4DwEq9?= =?us-ascii?Q?HAzS2BBAVTMEaayTAEvMZ/X4uLGrl0XHDoZD1yNMlZcK7mFI8rK3naKkp9WA?= =?us-ascii?Q?5bLRpJpPXV9dTIBRKRAqyYt3N7TwIr01DWEJTm3ApiI9NuT00KYFKr/pYCaF?= =?us-ascii?Q?+FTPLIX2+8B+cktNdR8Sanh75eF5TLk4jrcJWrRBX580cffakWoDUQpv3IZU?= =?us-ascii?Q?LMv+ysjR3109dyjJuTpH6rG/8yqx4NNhcTO9sH/TwXPc15iEizgZMIJB2Dzf?= =?us-ascii?Q?o3ALjjyYi0VT+kK1ItJ/OPeH7HphFx8xK92ScsNWTSnXcJJEqAX3zPJ2r7o0?= =?us-ascii?Q?MpQmqTqDkg6lk1hYz460xDaJ6eUexp56QBZM0C5z73k1at6k5DwtU33bFYzx?= =?us-ascii?Q?ehBouBbsrugvY+aLuNs+iga8NrLao3OM2qoOG2fiZ7VmfyKKDL7pjlQsIBC5?= =?us-ascii?Q?VME8bN3RYKq7Nq2+RfIrxupPXmXYpIDLDS76l2GAICUog09raMbOv95uXy4r?= =?us-ascii?Q?swd+eG7swPY3xpTA7XdGQ+UwhODIPRoaDTQO1xKzxyeJTigXDu2fLJh+Hiey?= =?us-ascii?Q?jnY6wi8OuTpOvUbkjmZ76+KSw3Uh87cAKwHn39ufHcUnuBKF5pgXB/uLnGkG?= =?us-ascii?Q?eLolSoaG5YZ7w9KcsPaHLbOb8P+5bi7CIWiojxUo4kxOVELu5pXwaup06Avz?= =?us-ascii?Q?6Gxtn73jjPigG9RWvJ0k4ryZCPKJ5YIpFOJXNWGquIJOKAA4dv31Yu0RIswM?= =?us-ascii?Q?va2fOhdu1RVIkBXvyjsoR8rRVFOC08rmtyUH7oFFIKdkBRKUJ14e7bIoVpCr?= =?us-ascii?Q?hIZmlKKrhoCkpn92C9Pq/zJ2qHCa3+FBGlHkctIJko4aCXNKjyvsrAaxeNRc?= =?us-ascii?Q?IRfGeY3QIVKvqO5JvmT/7tHIyZsL4jP/nGsvVM7iZzf/mgEvdf6XKFiKlo5K?= =?us-ascii?Q?/wOjeorz94/qOKUfzZXsjAgpkg2KpN9oU5rk/WELK4JqEYxwziLyoQjh/ztX?= =?us-ascii?Q?X45/6233XGmzHkRDV6Rn7gSlLsth16prNFP8H27x2bb9GpdM9ze3Fh4quzw1?= =?us-ascii?Q?JseW1E5GWWinvNg/VPK0kTtF5vTp+KIi5dCu9LMa5SmdX1f8MwlvhVjaXkk1?= =?us-ascii?Q?wb1/ZCD5OahyXuj+a+AKJ7p4LSnEO4atsFGLF5RUypyPjS4c8Rwq4ChBJkvn?= =?us-ascii?Q?r5BMa3oaV4c2cgxog5CueHHwdnJxsT61ZKzDn4uZFJ3g3f7oSf5O4yM1czbt?= =?us-ascii?Q?iRKKwnPxamW6bYxPfoMTfcSwJiXx+rd55PwmR2zCiJo6ocpGxG5vmA9e858m?= =?us-ascii?Q?yWeMmFFqR3xjia/pr5VrdUJNTASCFdRB5k6RtuKR1GXcfCQiXO0B7gX/A7Ki?= =?us-ascii?Q?1H1tbKqJLShwdCuwgH8yXG9SYUPCYebyG6rz?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(1800799024)(82310400026)(376014)(7416014);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2025 11:44:48.8940 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d2d30d0a-0d6e-47ce-f1ab-08ddef96480d X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH3PEPF0000000A.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ5PPF6785369A4 Content-Type: text/plain; charset="utf-8" '/proc/schedstat' gives the info about load balancing statistics within a given domain. It also contains the cpu_mask giving information about the sibling cpus and domain names after schedstat version 17. Storing this information in perf header will help tools like `perf sched stats` for better analysis. Signed-off-by: Swapnil Sapkal --- .../Documentation/perf.data-file-format.txt | 17 + tools/perf/builtin-inject.c | 1 + tools/perf/util/env.h | 16 + tools/perf/util/header.c | 304 ++++++++++++++++++ tools/perf/util/header.h | 1 + tools/perf/util/util.c | 42 +++ tools/perf/util/util.h | 3 + 7 files changed, 384 insertions(+) diff --git a/tools/perf/Documentation/perf.data-file-format.txt b/tools/per= f/Documentation/perf.data-file-format.txt index cd95ba09f727..92dbba1003cf 100644 --- a/tools/perf/Documentation/perf.data-file-format.txt +++ b/tools/perf/Documentation/perf.data-file-format.txt @@ -437,6 +437,23 @@ struct { } [nr_pmu]; }; =20 + HEADER_CPU_DOMAIN_INFO =3D 32, + +List of cpu-domain relation info. The format of the data is as below. + +struct domain_info { + int domain; + char dname[]; + char cpumask[]; + char cpulist[]; +}; + +struct cpu_domain_info { + int cpu; + int nr_domains; + struct domain_info domains[]; +}; + other bits are reserved and should ignored for now HEADER_FEAT_BITS =3D 256, =20 diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index a114b3fa1bea..f43a7ec44b5f 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -2058,6 +2058,7 @@ static bool keep_feat(int feat) case HEADER_CLOCK_DATA: case HEADER_HYBRID_TOPOLOGY: case HEADER_PMU_CAPS: + case HEADER_CPU_DOMAIN_INFO: return true; /* Information that can be updated */ case HEADER_BUILD_ID: diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h index e00179787a34..71034c4b4488 100644 --- a/tools/perf/util/env.h +++ b/tools/perf/util/env.h @@ -54,6 +54,19 @@ struct pmu_caps { char *pmu_name; }; =20 +struct domain_info { + u32 domain; + char *dname; + char *cpumask; + char *cpulist; +}; + +struct cpu_domain_map { + u32 cpu; + u32 nr_domains; + struct domain_info **domains; +}; + typedef const char *(arch_syscalls__strerrno_t)(int err); =20 struct perf_env { @@ -70,6 +83,8 @@ struct perf_env { unsigned int max_branches; unsigned int br_cntr_nr; unsigned int br_cntr_width; + unsigned int schedstat_version; + unsigned int max_sched_domains; int kernel_is_64_bit; =20 int nr_cmdline; @@ -92,6 +107,7 @@ struct perf_env { char **cpu_pmu_caps; struct cpu_topology_map *cpu; struct cpu_cache_level *caches; + struct cpu_domain_map **cpu_domain; int caches_cnt; u32 comp_ratio; u32 comp_ver; diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 4f2a6e10ed5c..7ff7434bac2c 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -1621,6 +1621,184 @@ static int write_pmu_caps(struct feat_fd *ff, return 0; } =20 +static void free_cpu_domain_info(struct cpu_domain_map **cd_map, u32 sched= stat_version, u32 nr) +{ + for (u32 i =3D 0; i < nr; i++) { + if (cd_map[i]->domains) { + for (u32 j =3D 0; j < cd_map[i]->nr_domains; j++) { + struct domain_info *d_info =3D cd_map[i]->domains[j]; + + if (schedstat_version >=3D 17) + free(d_info->dname); + + free(d_info->cpumask); + free(d_info->cpulist); + } + free(cd_map[i]->domains); + } + } + + free(cd_map); +} + +static struct cpu_domain_map **build_cpu_domain_map(u32 *schedstat_versio= n, u32 *max_sched_domains, + u32 nr) +{ + struct domain_info *domain_info; + struct cpu_domain_map **cd_map; + char dname[16], cpumask[256]; + char cpulist[1024]; + char *line =3D NULL; + u32 cpu, domain; + u32 dcount =3D 0; + size_t len; + FILE *fp; + + fp =3D fopen("/proc/schedstat", "r"); + if (!fp) { + pr_err("Failed to open /proc/schedstat\n"); + return NULL; + } + + cd_map =3D calloc(nr, sizeof(*cd_map)); + if (!cd_map) + goto out; + + while (getline(&line, &len, fp) > 0) { + int retval; + + if (strncmp(line, "version", 7) =3D=3D 0) { + retval =3D sscanf(line, "version %d\n", schedstat_version); + if (retval !=3D 1) + continue; + + } else if (strncmp(line, "cpu", 3) =3D=3D 0) { + retval =3D sscanf(line, "cpu%u %*s", &cpu); + if (retval =3D=3D 1) { + cd_map[cpu] =3D calloc(1, sizeof(*cd_map[cpu])); + if (!cd_map[cpu]) + goto out_free_line; + cd_map[cpu]->cpu =3D cpu; + } else + continue; + + dcount =3D 0; + } else if (strncmp(line, "domain", 6) =3D=3D 0) { + dcount++; + + cd_map[cpu]->domains =3D realloc(cd_map[cpu]->domains, + dcount * sizeof(domain_info)); + if (!cd_map[cpu]->domains) + goto out_free_line; + + domain_info =3D calloc(1, sizeof(*domain_info)); + if (!domain_info) + goto out_free_line; + + cd_map[cpu]->domains[dcount - 1] =3D domain_info; + + if (*schedstat_version >=3D 17) { + retval =3D sscanf(line, "domain%u %s %s %*s", &domain, dname, + cpumask); + if (retval !=3D 3) + continue; + + domain_info->dname =3D calloc(strlen(dname) + 1, sizeof(char)); + if (!domain_info->dname) + goto out_free_line; + + strcpy(domain_info->dname, dname); + } else { + retval =3D sscanf(line, "domain%u %s %*s", &domain, cpumask); + if (retval !=3D 2) + continue; + } + + domain_info->domain =3D domain; + if (domain > *max_sched_domains) + *max_sched_domains =3D domain; + + domain_info->cpumask =3D calloc(strlen(cpumask) + 1, sizeof(char)); + if (!domain_info->cpumask) + goto out_free_line; + + strcpy(domain_info->cpumask, cpumask); + + cpumask_to_cpulist(cpumask, cpulist); + domain_info->cpulist =3D calloc(strlen(cpulist) + 1, sizeof(char)); + if (!domain_info->cpulist) + goto out_free_line; + + strcpy(domain_info->cpulist, cpulist); + cd_map[cpu]->nr_domains =3D dcount; + } + } + +out_free_line: + free(line); +out: + fclose(fp); + return cd_map; +} + +static int write_cpu_domain_info(struct feat_fd *ff, + struct evlist *evlist __maybe_unused) +{ + u32 max_sched_domains =3D 0, schedstat_version =3D 0; + struct cpu_domain_map **cd_map; + u32 i, j, nr, ret; + + nr =3D cpu__max_present_cpu().cpu; + + cd_map =3D build_cpu_domain_map(&schedstat_version, &max_sched_domains, n= r); + if (!cd_map) + return -1; + + ret =3D do_write(ff, &schedstat_version, sizeof(u32)); + if (ret < 0) + goto out; + + max_sched_domains +=3D 1; + ret =3D do_write(ff, &max_sched_domains, sizeof(u32)); + if (ret < 0) + goto out; + + for (i =3D 0; i < nr; i++) { + if (cd_map[i]->domains) { + ret =3D do_write(ff, &cd_map[i]->cpu, sizeof(u32)); + if (ret < 0) + goto out; + + ret =3D do_write(ff, &cd_map[i]->nr_domains, sizeof(u32)); + if (ret < 0) + goto out; + + for (j =3D 0; j < cd_map[i]->nr_domains; j++) { + ret =3D do_write(ff, &cd_map[i]->domains[j]->domain, sizeof(u32)); + if (ret < 0) + goto out; + if (schedstat_version >=3D 17) { + ret =3D do_write_string(ff, cd_map[i]->domains[j]->dname); + if (ret < 0) + goto out; + } + + ret =3D do_write_string(ff, cd_map[i]->domains[j]->cpumask); + if (ret < 0) + goto out; + + ret =3D do_write_string(ff, cd_map[i]->domains[j]->cpulist); + if (ret < 0) + goto out; + } + } + } + +out: + free_cpu_domain_info(cd_map, schedstat_version, nr); + return ret; +} + static void print_hostname(struct feat_fd *ff, FILE *fp) { fprintf(fp, "# hostname : %s\n", ff->ph->env.hostname); @@ -2254,6 +2432,35 @@ static void print_mem_topology(struct feat_fd *ff, F= ILE *fp) } } =20 +static void print_cpu_domain_info(struct feat_fd *ff, FILE *fp) +{ + struct cpu_domain_map **cd_map =3D ff->ph->env.cpu_domain; + u32 nr =3D ff->ph->env.nr_cpus_avail; + struct domain_info *d_info; + u32 i, j; + + fprintf(fp, "# schedstat version : %u\n", ff->ph->env.schedstat_version); + fprintf(fp, "# Maximum sched domains : %u\n", ff->ph->env.max_sched_domai= ns); + + for (i =3D 0; i < nr; i++) { + if (cd_map[i]->domains) { + fprintf(fp, "# cpu : %u\n", cd_map[i]->cpu); + fprintf(fp, "# nr_domains : %u\n", cd_map[i]->nr_domains); + + for (j =3D 0; j < cd_map[i]->nr_domains; j++) { + d_info =3D cd_map[i]->domains[j]; + fprintf(fp, "# Domain : %u\n", d_info->domain); + + if (ff->ph->env.schedstat_version >=3D 17) + fprintf(fp, "# Domain name : %s\n", d_info->dname); + + fprintf(fp, "# Domain cpu map : %s\n", d_info->cpumask); + fprintf(fp, "# Domain cpu list : %s\n", d_info->cpulist); + } + } + } +} + static int __event_process_build_id(struct perf_record_header_build_id *be= v, char *filename, struct perf_session *session) @@ -3395,6 +3602,102 @@ static int process_pmu_caps(struct feat_fd *ff, voi= d *data __maybe_unused) return ret; } =20 +static int process_cpu_domain_info(struct feat_fd *ff, void *data __maybe_= unused) +{ + u32 schedstat_version, max_sched_domains, cpu, domain, nr_domains; + struct perf_env *env =3D &ff->ph->env; + char *dname, *cpumask, *cpulist; + struct cpu_domain_map **cd_map; + struct domain_info *d_info; + u32 nra, nr, i, j; + int ret; + + nra =3D env->nr_cpus_avail; + nr =3D env->nr_cpus_online; + + cd_map =3D calloc(nra, sizeof(*cd_map)); + if (!cd_map) + return -1; + + env->cpu_domain =3D cd_map; + + ret =3D do_read_u32(ff, &schedstat_version); + if (ret) + return ret; + + env->schedstat_version =3D schedstat_version; + + ret =3D do_read_u32(ff, &max_sched_domains); + if (ret) + return ret; + + env->max_sched_domains =3D max_sched_domains; + + for (i =3D 0; i < nr; i++) { + if (do_read_u32(ff, &cpu)) + return -1; + + cd_map[cpu] =3D calloc(1, sizeof(*cd_map[cpu])); + if (!cd_map[cpu]) + return -1; + + cd_map[cpu]->cpu =3D cpu; + + if (do_read_u32(ff, &nr_domains)) + return -1; + + cd_map[cpu]->nr_domains =3D nr_domains; + + cd_map[cpu]->domains =3D calloc(max_sched_domains, sizeof(*d_info)); + if (!cd_map[cpu]->domains) + return -1; + + for (j =3D 0; j < nr_domains; j++) { + if (do_read_u32(ff, &domain)) + return -1; + + d_info =3D calloc(1, sizeof(*d_info)); + if (!d_info) + return -1; + + cd_map[cpu]->domains[domain] =3D d_info; + d_info->domain =3D domain; + + if (schedstat_version >=3D 17) { + dname =3D do_read_string(ff); + if (!dname) + return -1; + + d_info->dname =3D calloc(strlen(dname) + 1, sizeof(char)); + if (!d_info->dname) + return -1; + + strcpy(d_info->dname, dname); + } + + cpumask =3D do_read_string(ff); + if (!cpumask) + return -1; + + d_info->cpumask =3D calloc(strlen(cpumask) + 1, sizeof(char)); + if (!d_info->cpumask) + return -1; + strcpy(d_info->cpumask, cpumask); + + cpulist =3D do_read_string(ff); + if (!cpulist) + return -1; + + d_info->cpulist =3D calloc(strlen(cpulist) + 1, sizeof(char)); + if (!d_info->cpulist) + return -1; + strcpy(d_info->cpulist, cpulist); + } + } + + return ret; +} + #define FEAT_OPR(n, func, __full_only) \ [HEADER_##n] =3D { \ .name =3D __stringify(n), \ @@ -3460,6 +3763,7 @@ const struct perf_header_feature_ops feat_ops[HEADER_= LAST_FEATURE] =3D { FEAT_OPR(CLOCK_DATA, clock_data, false), FEAT_OPN(HYBRID_TOPOLOGY, hybrid_topology, true), FEAT_OPR(PMU_CAPS, pmu_caps, false), + FEAT_OPR(CPU_DOMAIN_INFO, cpu_domain_info, true), }; =20 struct header_print_data { diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h index d16dfceccd74..edcb95e0dc49 100644 --- a/tools/perf/util/header.h +++ b/tools/perf/util/header.h @@ -53,6 +53,7 @@ enum { HEADER_CLOCK_DATA, HEADER_HYBRID_TOPOLOGY, HEADER_PMU_CAPS, + HEADER_CPU_DOMAIN_INFO, HEADER_LAST_FEATURE, HEADER_FEAT_BITS =3D 256, }; diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c index 1b91834e11de..47bfc0259b0e 100644 --- a/tools/perf/util/util.c +++ b/tools/perf/util/util.c @@ -263,6 +263,48 @@ void print_separator(int pre_dash_cnt, const char *s, = int post_dash_cnt) graph_dotted_line); } =20 +void cpumask_to_cpulist(char *cpumask, char *cpulist) +{ + int i, j, bm_size, nbits; + int len =3D strlen(cpumask); + unsigned long *bm; + char cpus[1024]; + + for (i =3D 0; i < len; i++) { + if (cpumask[i] =3D=3D ',') { + for (j =3D i; j < len; j++) + cpumask[j] =3D cpumask[j + 1]; + } + } + + len =3D strlen(cpumask); + bm_size =3D (len + 15) / 16; + nbits =3D bm_size * 64; + if (nbits <=3D 0) + return; + + bm =3D calloc(bm_size, sizeof(unsigned long)); + if (!cpumask) + goto free_bm; + + for (i =3D 0; i < bm_size; i++) { + char blk[17]; + int blklen =3D len > 16 ? 16 : len; + + strncpy(blk, cpumask + len - blklen, blklen); + blk[len] =3D '\0'; + bm[i] =3D strtoul(blk, NULL, 16); + cpumask[len - blklen] =3D '\0'; + len =3D strlen(cpumask); + } + + bitmap_scnprintf(bm, nbits, cpus, sizeof(cpus)); + strcpy(cpulist, cpus); + +free_bm: + free(bm); +} + int rm_rf_perf_data(const char *path) { const char *pat[] =3D { diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index de69384380c2..90a8b4d2e59c 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #ifndef __cplusplus #include @@ -50,6 +51,8 @@ int perf_tip(char **strp, const char *dirpath); =20 void print_separator(int pre_dash_cnt, const char *s, int post_dash_cnt); =20 +void cpumask_to_cpulist(char *cpumask, char *cpulist); + #ifndef HAVE_SCHED_GETCPU_SUPPORT int sched_getcpu(void); #endif --=20 2.43.0 From nobody Thu Oct 2 23:53:20 2025 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2068.outbound.protection.outlook.com [40.107.237.68]) (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 B69282F0C6C; Tue, 9 Sep 2025 11:45:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.237.68 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418331; cv=fail; b=TRH7dF0KzMHWuxqa9FFsqNYNXYQpDdFztd3IV3rrfpIVbBZdKyXR1ALcdNbM/OPQ77GfU75hso5LhWAsADaFUHoAh+g9qbPS6M3y/7ImdrZE6pw0lxb1KEUURZmfKcpunvjwH33vK24t59aYglkxLCPCFEcYUfJ/uv9f+lYFXPs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418331; c=relaxed/simple; bh=HYF4UFxESg33b1afh/Gihu+ATGZShcKxy+t4Axu1y+g=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=udXLFZ+qoWfLarryqZRKLJx0KGV450yFSSBjWLuutVdnFzVZBXtFQZPDATlFufFEW+ZALXTVQ0oondJvP9CrhC1hQrNWay/IuqwTHjwwBzha33CBZbTfvy6ye3BSE5gqQRbPvMveHe8lmZB02OV8eYrhQKyeK2ls5svNaHkyf+g= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=PsEVmc0b; arc=fail smtp.client-ip=40.107.237.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="PsEVmc0b" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=FUU9XYwOvCi3fDFhpnaqZqv9KbSiLZTEVSON/hM9LYA/+4IPYgS8cG6P01070x2LoWRk41IxJ5wb5mrk/rK5FrQ/Tl0qm7ktxl1lehmiUU0rdObjOuR2IdkpCo8M5FVudwpGenK70l9+cLOT/XGTXUWiYCppnbSbSL/y4RZ1qU9AogtNnxrUrPJKoQM3w47oUZvju98Gx/GDY39S1jcIFhdrqwjUhg6stL1bVds00ydkXIFcOUVMRnQtgMjK5QnEDjN2LIXfzWxvonHjGHSaVskBzRlW/mw1jQ30jCIFM5lxD4WnZwSbhQ5rwyLN/xRRlVbD35qjNlEN9iAsw6xfEg== 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=jy7NZWoSiI602om3/RMWR8mjMt9Jif6dQiOMj7d2y/4=; b=sFsiZ9d7PmskPROcECRgvHrJr8oczJi7qVA3c+IzkzFGzdybu9UpMD2D97eTJSeC49yH0+ipEFyEpdet7XEu252NEIjubLsMFu5yleIJXS+l43kLztEtpwH1u0VaMmyCi5/jmvdTVgKBsMsX6Z2gBOik7K1tR7O1jw8U6JF/gQbdg663rhTeeNFeUcm3+d5OijurkpB90Rpk/4hyOCJrCOgZz5MWbiCzcZjtwJC2zmQbVGLg7wSdIBKjWVpKX7VbD9kLlvG/r3uvOwI08z1j9FuNacUAGTWimuUB9PDr1HRntUjyGsH9ydNWjgfYIXl4yg2i/e0XrVjk78KGqtwPzA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=temperror (sender ip is 165.204.84.17) smtp.rcpttodomain=infradead.org smtp.mailfrom=amd.com; dmarc=temperror action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=jy7NZWoSiI602om3/RMWR8mjMt9Jif6dQiOMj7d2y/4=; b=PsEVmc0bGvU152n1ViGTaLWEeTP21Mal5AdhE2JSjqr/c4GyIsKxDZzXGuuG5zV6+LCdd3QnLOQrHC5B3iwOBnS8EDXYC8GYULlIrSei08E3mBBMCiPe+Hcm2ZCi7Y0qgDdzoh6Ds5TAVPY7G4EBkpP1iat6G8CT1q52FEX6iio= Received: from MN0PR04CA0029.namprd04.prod.outlook.com (2603:10b6:208:52d::34) by CY5PR12MB6202.namprd12.prod.outlook.com (2603:10b6:930:25::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Tue, 9 Sep 2025 11:45:21 +0000 Received: from BN2PEPF000044A9.namprd04.prod.outlook.com (2603:10b6:208:52d:cafe::3d) by MN0PR04CA0029.outlook.office365.com (2603:10b6:208:52d::34) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9094.22 via Frontend Transport; Tue, 9 Sep 2025 11:45:20 +0000 X-MS-Exchange-Authentication-Results: spf=temperror (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=temperror action=none header.from=amd.com; Received-SPF: TempError (protection.outlook.com: error in processing during lookup of amd.com: DNS Timeout) Received: from satlexmb07.amd.com (165.204.84.17) by BN2PEPF000044A9.mail.protection.outlook.com (10.167.243.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9115.13 via Frontend Transport; Tue, 9 Sep 2025 11:45:18 +0000 Received: from tapi.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 9 Sep 2025 04:45:03 -0700 From: Swapnil Sapkal To: , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , James Clark Subject: [PATCH RESEND v4 04/11] perf sched stats: Add record and rawdump support Date: Tue, 9 Sep 2025 11:42:20 +0000 Message-ID: <20250909114227.58802-5-swapnil.sapkal@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250909114227.58802-1-swapnil.sapkal@amd.com> References: <20250909114227.58802-1-swapnil.sapkal@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF000044A9:EE_|CY5PR12MB6202:EE_ X-MS-Office365-Filtering-Correlation-Id: 967e8cd9-1ab8-42f1-5923-08ddef9659da X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|1800799024|82310400026|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?KrFBlkiLP1Nvzq14UGi+VOZZZokftIxcuguW442olays9pMexbmJn2MoZUa3?= =?us-ascii?Q?tYdmusYHVvR1oL+oCZnC3T+fDdcm2yD0vj+pMLe0eBophAvGiErq5v8rI9Xs?= =?us-ascii?Q?AlJPTQIHtxw6r4dVpUHLSajOpYMrRKKFyc81sqAF2OeKH8SyKxTzpjYwYxPO?= =?us-ascii?Q?hcAXeaHCdUXm+QEDMxtbU6c+6pCVoyfzxp1YP3g6TV8zO2FobMNCrJN/iyR/?= =?us-ascii?Q?Q+aEqCHMh/uaV/Vl7uCuyvMTtIiA2ayIJj62KH9CDTRfK+1GzEf59ncaJqbr?= =?us-ascii?Q?2ScToMz5r/+CdfqljhnlCUlLtB3UjfZXoJg1HAVCNV1XEJKHZq2cyycovmfY?= =?us-ascii?Q?XyHF3NK8adt2EovbVsnDl35fy8gNxTm8mhDkeqy/WXDV2+kM1ZIfRgb4TISz?= =?us-ascii?Q?CyU2kovxmZk2BwPtJom3At9TDTcS+6tBinKaqseCbEet/31l/aPbjUvRxcfr?= =?us-ascii?Q?qTYpDgsNqubW3H6Qdpr/uIWzBYZ6ZiKUrGlriaDw/fIP0ZMZpk3gJ5S4Qzu/?= =?us-ascii?Q?u0BAhw1DpWMgrFgnKZviI0AJtkTfDiBdCOQ8fZ78O2B7L+if9GVb7sHK8aEz?= =?us-ascii?Q?dtkTeP5LFflq8ZcssfEScCfzVizgZQskE4dBR+EAvgO6s41bgr0FI7Hs0NQT?= =?us-ascii?Q?WJUuLeoUlk8E6iEWh4vhBvRQRxvvnbfuzJMez/+mymTmlnRCC6BKARBMiC9a?= =?us-ascii?Q?SPz3qoana1dx3yT3QqFpYk6DjGxkwhIKG0agBeq934+OPww7Q+431a2rd6me?= =?us-ascii?Q?vsZO/vZF9/TNHGR6OLG6kTzLhar4vByF8x0Wz4ekbE08pZJQqX2Mdn4+uLCM?= =?us-ascii?Q?o96leBHYOJOl9BZmCs3NIqqDYUoV7R4CEPReU9jNOhFcF48cvJ36gG72+kiR?= =?us-ascii?Q?mygb0I1cQocPm3O7Tyj10jRfDQw8BQZ+Mn0Ok4/fyL58pD94L8xttVl9qhkI?= =?us-ascii?Q?KX0T6qAO7DxXz3AITQiRGxQ5ug7/ttMwV+1fCLXtAEqSoNK5H8j17D3/c26V?= =?us-ascii?Q?usix7zwtJQgMZd+VstiswvApKAs55OcnMEac2TUTEWLsiTsF9hXce0gkKhGL?= =?us-ascii?Q?WAeBO7wW9DIJa5O0a737F1U6BfcHoZTZJB4NkssWPcJ5HBdJf7p29yMKt8f0?= =?us-ascii?Q?0+PzkRMpcohngih4Kdvuw8nZIALIduwMW9+CzDqOzCIhTQ6S1LIxVRzdv86U?= =?us-ascii?Q?L9qXKAamdemfg3KoE247uIFX+2YyA04Nq5v/HmHzzZwVVeEa3zSeAyj+3REM?= =?us-ascii?Q?86mh+jg7m/55pFePaQCvxF8IJhUT0CXKrqmF5r5WhlifP8+bjmt2klCNdFHY?= =?us-ascii?Q?cJjl8dTv83MXdjo9qRjk4Itkm02htUEWkQ0c40OMSf8iUFAO869i9Gug6z2z?= =?us-ascii?Q?avFClW5cgfB6GKJDvfd6/08K6g2zagqS+hYML6pWqumb5EOXLOsnixP+CiPP?= =?us-ascii?Q?ILAhMlx+wvkl8JX84S9e35mPLm+kZRcR8R0fZxKuHlqD5wM19q+MbyP+Z04e?= =?us-ascii?Q?hntjuYvw9dbkHVb3n7jR2I9f1VuVNrr+EQeY?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(1800799024)(82310400026)(376014)(7416014);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2025 11:45:18.7681 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 967e8cd9-1ab8-42f1-5923-08ddef9659da X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF000044A9.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6202 Content-Type: text/plain; charset="utf-8" Define new, perf tool only, sample types and their layouts. Add logic to parse /proc/schedstat, convert it to perf sample format and save samples to perf.data file with `perf sched stats record` command. Also add logic to read perf.data file, interpret schedstat samples and print rawdump of samples with `perf script -D`. Note that, /proc/schedstat file output is standardized with version number. The patch supports v15 but older or newer version can be added easily. Co-developed-by: Ravi Bangoria Signed-off-by: Ravi Bangoria Tested-by: James Clark Signed-off-by: Swapnil Sapkal --- tools/lib/perf/Documentation/libperf.txt | 2 + tools/lib/perf/Makefile | 1 + tools/lib/perf/include/perf/event.h | 41 ++++ tools/lib/perf/include/perf/schedstat-v15.h | 146 +++++++++++++ tools/perf/builtin-inject.c | 2 + tools/perf/builtin-sched.c | 222 +++++++++++++++++++- tools/perf/util/event.c | 40 ++++ tools/perf/util/event.h | 2 + tools/perf/util/session.c | 22 ++ tools/perf/util/synthetic-events.c | 179 ++++++++++++++++ tools/perf/util/synthetic-events.h | 3 + tools/perf/util/tool.c | 18 ++ tools/perf/util/tool.h | 4 +- 13 files changed, 680 insertions(+), 2 deletions(-) create mode 100644 tools/lib/perf/include/perf/schedstat-v15.h diff --git a/tools/lib/perf/Documentation/libperf.txt b/tools/lib/perf/Docu= mentation/libperf.txt index 4072bc9b7670..576ecc5fc312 100644 --- a/tools/lib/perf/Documentation/libperf.txt +++ b/tools/lib/perf/Documentation/libperf.txt @@ -211,6 +211,8 @@ SYNOPSIS struct perf_record_header_feature; struct perf_record_compressed; struct perf_record_compressed2; + struct perf_record_schedstat_cpu; + struct perf_record_schedstat_domain; -- =20 DESCRIPTION diff --git a/tools/lib/perf/Makefile b/tools/lib/perf/Makefile index 7fbb50b74c00..9fa28e512ca8 100644 --- a/tools/lib/perf/Makefile +++ b/tools/lib/perf/Makefile @@ -179,6 +179,7 @@ install_lib: libs cp -fpR $(LIBPERF_ALL) $(DESTDIR)$(libdir_SQ) =20 HDRS :=3D bpf_perf.h core.h cpumap.h threadmap.h evlist.h evsel.h event.h = mmap.h +HDRS +=3D schedstat-v15.h INTERNAL_HDRS :=3D cpumap.h evlist.h evsel.h lib.h mmap.h rc_check.h threa= dmap.h xyarray.h =20 INSTALL_HDRS_PFX :=3D $(DESTDIR)$(prefix)/include/perf diff --git a/tools/lib/perf/include/perf/event.h b/tools/lib/perf/include/p= erf/event.h index 6608f1e3701b..7ed7bae73b55 100644 --- a/tools/lib/perf/include/perf/event.h +++ b/tools/lib/perf/include/perf/event.h @@ -483,6 +483,43 @@ struct perf_record_bpf_metadata { struct perf_record_bpf_metadata_entry entries[]; }; =20 +struct perf_record_schedstat_cpu_v15 { +#define CPU_FIELD(_type, _name, _desc, _format, _is_pct, _pct_of, _ver) _= type _name +#include "schedstat-v15.h" +#undef CPU_FIELD +}; + +struct perf_record_schedstat_cpu { + struct perf_event_header header; + __u64 timestamp; + __u32 cpu; + __u16 version; + /* Padding */ + char __pad[2]; + union { + struct perf_record_schedstat_cpu_v15 v15; + }; +}; + +struct perf_record_schedstat_domain_v15 { +#define DOMAIN_FIELD(_type, _name, _desc, _format, _is_jiffies, _ver) _ty= pe _name +#include "schedstat-v15.h" +#undef DOMAIN_FIELD +}; + +#define DOMAIN_NAME_LEN 16 + +struct perf_record_schedstat_domain { + struct perf_event_header header; + __u64 timestamp; + __u32 cpu; + __u16 version; + __u16 domain; + union { + struct perf_record_schedstat_domain_v15 v15; + }; +}; + enum perf_user_event_type { /* above any possible kernel type */ PERF_RECORD_USER_TYPE_START =3D 64, PERF_RECORD_HEADER_ATTR =3D 64, @@ -506,6 +543,8 @@ enum perf_user_event_type { /* above any possible kerne= l type */ PERF_RECORD_FINISHED_INIT =3D 82, PERF_RECORD_COMPRESSED2 =3D 83, PERF_RECORD_BPF_METADATA =3D 84, + PERF_RECORD_SCHEDSTAT_CPU =3D 85, + PERF_RECORD_SCHEDSTAT_DOMAIN =3D 86, PERF_RECORD_HEADER_MAX }; =20 @@ -548,6 +587,8 @@ union perf_event { struct perf_record_compressed pack; struct perf_record_compressed2 pack2; struct perf_record_bpf_metadata bpf_metadata; + struct perf_record_schedstat_cpu schedstat_cpu; + struct perf_record_schedstat_domain schedstat_domain; }; =20 #endif /* __LIBPERF_EVENT_H */ diff --git a/tools/lib/perf/include/perf/schedstat-v15.h b/tools/lib/perf/i= nclude/perf/schedstat-v15.h new file mode 100644 index 000000000000..639458df05f8 --- /dev/null +++ b/tools/lib/perf/include/perf/schedstat-v15.h @@ -0,0 +1,146 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifdef CPU_FIELD +CPU_FIELD(__u32, yld_count, "sched_yield() count", + "%11u", false, yld_count, v15); +CPU_FIELD(__u32, array_exp, "Legacy counter can be ignored", + "%11u", false, array_exp, v15); +CPU_FIELD(__u32, sched_count, "schedule() called", + "%11u", false, sched_count, v15); +CPU_FIELD(__u32, sched_goidle, "schedule() left the processor idle", + "%11u", true, sched_count, v15); +CPU_FIELD(__u32, ttwu_count, "try_to_wake_up() was called", + "%11u", false, ttwu_count, v15); +CPU_FIELD(__u32, ttwu_local, "try_to_wake_up() was called to wake up the l= ocal cpu", + "%11u", true, ttwu_count, v15); +CPU_FIELD(__u64, rq_cpu_time, "total runtime by tasks on this processor (i= n jiffies)", + "%11llu", false, rq_cpu_time, v15); +CPU_FIELD(__u64, run_delay, "total waittime by tasks on this processor (in= jiffies)", + "%11llu", true, rq_cpu_time, v15); +CPU_FIELD(__u64, pcount, "total timeslices run on this cpu", + "%11llu", false, pcount, v15); +#endif + +#ifdef DOMAIN_FIELD +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, idle_lb_count, + "load_balance() count on cpu idle", "%11u", true, v15); +DOMAIN_FIELD(__u32, idle_lb_balanced, + "load_balance() found balanced on cpu idle", "%11u", true, v15); +DOMAIN_FIELD(__u32, idle_lb_failed, + "load_balance() move task failed on cpu idle", "%11u", true, v15); +DOMAIN_FIELD(__u32, idle_lb_imbalance, + "imbalance sum on cpu idle", "%11u", false, v15); +DOMAIN_FIELD(__u32, idle_lb_gained, + "pull_task() count on cpu idle", "%11u", false, v15); +DOMAIN_FIELD(__u32, idle_lb_hot_gained, + "pull_task() when target task was cache-hot on cpu idle", "%11u", fa= lse, v15); +DOMAIN_FIELD(__u32, idle_lb_nobusyq, + "load_balance() failed to find busier queue on cpu idle", "%11u", tr= ue, v15); +DOMAIN_FIELD(__u32, idle_lb_nobusyg, + "load_balance() failed to find busier group on cpu idle", "%11u", tr= ue, v15); +#ifdef DERIVED_CNT_FIELD +DERIVED_CNT_FIELD(idle_lb_success_count, "load_balance() success count on = cpu idle", "%11u", + idle_lb_count, idle_lb_balanced, idle_lb_failed, v15); +#endif +#ifdef DERIVED_AVG_FIELD +DERIVED_AVG_FIELD(idle_lb_avg_pulled, + "avg task pulled per successful lb attempt (cpu idle)", "%11.2Lf", + idle_lb_count, idle_lb_balanced, idle_lb_failed, idle_lb_gained, v15); +#endif +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, busy_lb_count, + "load_balance() count on cpu busy", "%11u", true, v15); +DOMAIN_FIELD(__u32, busy_lb_balanced, + "load_balance() found balanced on cpu busy", "%11u", true, v15); +DOMAIN_FIELD(__u32, busy_lb_failed, + "load_balance() move task failed on cpu busy", "%11u", true, v15); +DOMAIN_FIELD(__u32, busy_lb_imbalance, + "imbalance sum on cpu busy", "%11u", false, v15); +DOMAIN_FIELD(__u32, busy_lb_gained, + "pull_task() count on cpu busy", "%11u", false, v15); +DOMAIN_FIELD(__u32, busy_lb_hot_gained, + "pull_task() when target task was cache-hot on cpu busy", "%11u", fa= lse, v15); +DOMAIN_FIELD(__u32, busy_lb_nobusyq, + "load_balance() failed to find busier queue on cpu busy", "%11u", tr= ue, v15); +DOMAIN_FIELD(__u32, busy_lb_nobusyg, + "load_balance() failed to find busier group on cpu busy", "%11u", tr= ue, v15); +#ifdef DERIVED_CNT_FIELD +DERIVED_CNT_FIELD(busy_lb_success_count, "load_balance() success count on = cpu busy", "%11u", + busy_lb_count, busy_lb_balanced, busy_lb_failed, v15); +#endif +#ifdef DERIVED_AVG_FIELD +DERIVED_AVG_FIELD(busy_lb_avg_pulled, + "avg task pulled per successful lb attempt (cpu busy)", "%11.2Lf", + busy_lb_count, busy_lb_balanced, busy_lb_failed, busy_lb_gained, v15); +#endif +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, newidle_lb_count, + "load_balance() count on cpu newly idle", "%11u", true, v15); +DOMAIN_FIELD(__u32, newidle_lb_balanced, + "load_balance() found balanced on cpu newly idle", "%11u", true, v15= ); +DOMAIN_FIELD(__u32, newidle_lb_failed, + "load_balance() move task failed on cpu newly idle", "%11u", true, v= 15); +DOMAIN_FIELD(__u32, newidle_lb_imbalance, + "imbalance sum on cpu newly idle", "%11u", false, v15); +DOMAIN_FIELD(__u32, newidle_lb_gained, + "pull_task() count on cpu newly idle", "%11u", false, v15); +DOMAIN_FIELD(__u32, newidle_lb_hot_gained, + "pull_task() when target task was cache-hot on cpu newly idle", "%11= u", false, v15); +DOMAIN_FIELD(__u32, newidle_lb_nobusyq, + "load_balance() failed to find busier queue on cpu newly idle", "%11= u", true, v15); +DOMAIN_FIELD(__u32, newidle_lb_nobusyg, + "load_balance() failed to find busier group on cpu newly idle", "%11= u", true, v15); +#ifdef DERIVED_CNT_FIELD +DERIVED_CNT_FIELD(newidle_lb_success_count, + "load_balance() success count on cpu newly idle", "%11u", + newidle_lb_count, newidle_lb_balanced, newidle_lb_failed, v15); +#endif +#ifdef DERIVED_AVG_FIELD +DERIVED_AVG_FIELD(newidle_lb_avg_pulled, + "avg task pulled per successful lb attempt (cpu newly idle)", "%11.2Lf= ", + newidle_lb_count, newidle_lb_balanced, newidle_lb_failed, newidle_lb_g= ained, v15); +#endif +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, alb_count, + "active_load_balance() count", "%11u", false, v15); +DOMAIN_FIELD(__u32, alb_failed, + "active_load_balance() move task failed", "%11u", false, v15); +DOMAIN_FIELD(__u32, alb_pushed, + "active_load_balance() successfully moved a task", "%11u", false, v1= 5); +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, sbe_count, + "sbe_count is not used", "%11u", false, v15); +DOMAIN_FIELD(__u32, sbe_balanced, + "sbe_balanced is not used", "%11u", false, v15); +DOMAIN_FIELD(__u32, sbe_pushed, + "sbe_pushed is not used", "%11u", false, v15); +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, sbf_count, + "sbf_count is not used", "%11u", false, v15); +DOMAIN_FIELD(__u32, sbf_balanced, + "sbf_balanced is not used", "%11u", false, v15); +DOMAIN_FIELD(__u32, sbf_pushed, + "sbf_pushed is not used", "%11u", false, v15); +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, ttwu_wake_remote, + "try_to_wake_up() awoke a task that last ran on a diff cpu", "%11u",= false, v15); +DOMAIN_FIELD(__u32, ttwu_move_affine, + "try_to_wake_up() moved task because cache-cold on own cpu", "%11u",= false, v15); +DOMAIN_FIELD(__u32, ttwu_move_balance, + "try_to_wake_up() started passive balancing", "%11u", false, v15); +#endif /* DOMAIN_FIELD */ diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index f43a7ec44b5f..eadf5ecaa8b2 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -2538,6 +2538,8 @@ int cmd_inject(int argc, const char **argv) inject.tool.compressed =3D perf_event__repipe_op4_synth; inject.tool.auxtrace =3D perf_event__repipe_auxtrace; inject.tool.bpf_metadata =3D perf_event__repipe_op2_synth; + inject.tool.schedstat_cpu =3D perf_event__repipe_op2_synth; + inject.tool.schedstat_domain =3D perf_event__repipe_op2_synth; inject.tool.dont_split_sample_group =3D true; inject.session =3D __perf_session__new(&data, &inject.tool, /*trace_event_repipe=3D*/inject.output.is_pipe, diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index f166d6cbc083..2573491fa5f8 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -28,6 +28,8 @@ #include "util/debug.h" #include "util/event.h" #include "util/util.h" +#include "util/synthetic-events.h" +#include "util/target.h" =20 #include #include @@ -55,6 +57,7 @@ #define MAX_PRIO 140 =20 static const char *cpu_list; +static struct perf_cpu_map *user_requested_cpus; static DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS); =20 struct sched_atom; @@ -236,6 +239,9 @@ struct perf_sched { volatile bool thread_funcs_exit; const char *prio_str; DECLARE_BITMAP(prio_bitmap, MAX_PRIO); + + struct perf_session *session; + struct perf_data *data; }; =20 /* per thread run time data */ @@ -3745,6 +3751,195 @@ static void setup_sorting(struct perf_sched *sched,= const struct option *options sort_dimension__add("pid", &sched->cmp_pid); } =20 +static int process_synthesized_schedstat_event(const struct perf_tool *too= l, + union perf_event *event, + struct perf_sample *sample __maybe_unused, + struct machine *machine __maybe_unused) +{ + struct perf_sched *sched =3D container_of(tool, struct perf_sched, tool); + + if (perf_data__write(sched->data, event, event->header.size) <=3D 0) { + pr_err("failed to write perf data, error: %m\n"); + return -1; + } + + sched->session->header.data_size +=3D event->header.size; + return 0; +} + +static void sighandler(int sig __maybe_unused) +{ +} + +static int enable_sched_schedstats(int *reset) +{ + char path[PATH_MAX]; + FILE *fp; + char ch; + + snprintf(path, PATH_MAX, "%s/sys/kernel/sched_schedstats", procfs__mountp= oint()); + fp =3D fopen(path, "w+"); + if (!fp) { + pr_err("Failed to open %s\n", path); + return -1; + } + + ch =3D getc(fp); + if (ch =3D=3D '0') { + *reset =3D 1; + rewind(fp); + putc('1', fp); + fclose(fp); + } + return 0; +} + +static int disable_sched_schedstat(void) +{ + char path[PATH_MAX]; + FILE *fp; + + snprintf(path, PATH_MAX, "%s/sys/kernel/sched_schedstats", procfs__mountp= oint()); + fp =3D fopen(path, "w"); + if (!fp) { + pr_err("Failed to open %s\n", path); + return -1; + } + + putc('0', fp); + fclose(fp); + return 0; +} + +/* perf.data or any other output file name used by stats subcommand (only)= . */ +const char *output_name; + +static int perf_sched__schedstat_record(struct perf_sched *sched, + int argc, const char **argv) +{ + struct perf_session *session; + struct target target =3D {}; + struct evlist *evlist; + int reset =3D 0; + int err =3D 0; + int fd; + struct perf_data data =3D { + .path =3D output_name, + .mode =3D PERF_DATA_MODE_WRITE, + }; + + signal(SIGINT, sighandler); + signal(SIGCHLD, sighandler); + signal(SIGTERM, sighandler); + + evlist =3D evlist__new(); + if (!evlist) + return -ENOMEM; + + session =3D perf_session__new(&data, &sched->tool); + if (IS_ERR(session)) { + pr_err("Perf session creation failed.\n"); + evlist__delete(evlist); + return PTR_ERR(session); + } + + session->evlist =3D evlist; + + sched->session =3D session; + sched->data =3D &data; + + fd =3D perf_data__fd(&data); + + /* + * Capture all important metadata about the system. Although they are + * not used by `perf sched stats` tool directly, they provide useful + * information about profiled environment. + */ + perf_header__set_feat(&session->header, HEADER_HOSTNAME); + perf_header__set_feat(&session->header, HEADER_OSRELEASE); + perf_header__set_feat(&session->header, HEADER_VERSION); + perf_header__set_feat(&session->header, HEADER_ARCH); + perf_header__set_feat(&session->header, HEADER_NRCPUS); + perf_header__set_feat(&session->header, HEADER_CPUDESC); + perf_header__set_feat(&session->header, HEADER_CPUID); + perf_header__set_feat(&session->header, HEADER_TOTAL_MEM); + perf_header__set_feat(&session->header, HEADER_CMDLINE); + perf_header__set_feat(&session->header, HEADER_CPU_TOPOLOGY); + perf_header__set_feat(&session->header, HEADER_NUMA_TOPOLOGY); + perf_header__set_feat(&session->header, HEADER_CACHE); + perf_header__set_feat(&session->header, HEADER_MEM_TOPOLOGY); + perf_header__set_feat(&session->header, HEADER_HYBRID_TOPOLOGY); + perf_header__set_feat(&session->header, HEADER_CPU_DOMAIN_INFO); + + err =3D perf_session__write_header(session, evlist, fd, false); + if (err < 0) + goto out; + + /* + * `perf sched stats` does not support workload profiling (-p pid) + * since /proc/schedstat file contains cpu specific data only. Hence, a + * profile target is either set of cpus or systemwide, never a process. + * Note that, although `-- ` is supported, profile data are + * still cpu/systemwide. + */ + if (cpu_list) + target.cpu_list =3D cpu_list; + else + target.system_wide =3D true; + + if (argc) { + err =3D evlist__prepare_workload(evlist, &target, argv, false, NULL); + if (err) + goto out; + } + + err =3D evlist__create_maps(evlist, &target); + if (err < 0) + goto out; + + user_requested_cpus =3D evlist->core.user_requested_cpus; + + err =3D perf_event__synthesize_schedstat(&(sched->tool), + process_synthesized_schedstat_event, + user_requested_cpus); + if (err < 0) + goto out; + + err =3D enable_sched_schedstats(&reset); + if (err < 0) + goto out; + + if (argc) + evlist__start_workload(evlist); + + /* wait for signal */ + pause(); + + if (reset) { + err =3D disable_sched_schedstat(); + if (err < 0) + goto out; + } + + err =3D perf_event__synthesize_schedstat(&(sched->tool), + process_synthesized_schedstat_event, + user_requested_cpus); + if (err < 0) + goto out; + + err =3D perf_session__write_header(session, evlist, fd, true); + +out: + if (!err) + fprintf(stderr, "[ perf sched stats: Wrote samples to %s ]\n", data.path= ); + else + fprintf(stderr, "[ perf sched stats: Failed !! ]\n"); + + evlist__delete(evlist); + close(fd); + return err; +} + static bool schedstat_events_exposed(void) { /* @@ -3921,6 +4116,12 @@ int cmd_sched(int argc, const char **argv) OPT_BOOLEAN('P', "pre-migrations", &sched.pre_migrations, "Show pre-migra= tion wait time"), OPT_PARENT(sched_options) }; + const struct option stats_options[] =3D { + OPT_STRING('o', "output", &output_name, "file", + "`stats record` with output filename"), + OPT_STRING('C', "cpu", &cpu_list, "cpu", "list of cpus to profile"), + OPT_END() + }; =20 const char * const latency_usage[] =3D { "perf sched latency []", @@ -3938,9 +4139,13 @@ int cmd_sched(int argc, const char **argv) "perf sched timehist []", NULL }; + const char *stats_usage[] =3D { + "perf sched stats {record} []", + NULL + }; const char *const sched_subcommands[] =3D { "record", "latency", "map", "replay", "script", - "timehist", NULL }; + "timehist", "stats", NULL }; const char *sched_usage[] =3D { NULL, NULL @@ -4038,6 +4243,21 @@ int cmd_sched(int argc, const char **argv) ret =3D symbol__validate_sym_arguments(); if (!ret) ret =3D perf_sched__timehist(&sched); + } else if (!strcmp(argv[0], "stats")) { + const char *const stats_subcommands[] =3D {"record", NULL}; + + argc =3D parse_options_subcommand(argc, argv, stats_options, + stats_subcommands, + stats_usage, + PARSE_OPT_STOP_AT_NON_OPTION); + + if (argv[0] && !strcmp(argv[0], "record")) { + if (argc) + argc =3D parse_options(argc, argv, stats_options, + stats_usage, 0); + return perf_sched__schedstat_record(&sched, argc, argv); + } + usage_with_options(stats_usage, stats_options); } else { usage_with_options(sched_usage, sched_options); } diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index fcf44149feb2..41fb942ef701 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -82,6 +82,8 @@ static const char *perf_event__names[] =3D { [PERF_RECORD_FINISHED_INIT] =3D "FINISHED_INIT", [PERF_RECORD_COMPRESSED2] =3D "COMPRESSED2", [PERF_RECORD_BPF_METADATA] =3D "BPF_METADATA", + [PERF_RECORD_SCHEDSTAT_CPU] =3D "SCHEDSTAT_CPU", + [PERF_RECORD_SCHEDSTAT_DOMAIN] =3D "SCHEDSTAT_DOMAIN", }; =20 const char *perf_event__name(unsigned int id) @@ -570,6 +572,44 @@ size_t perf_event__fprintf_text_poke(union perf_event = *event, struct machine *ma return ret; } =20 +size_t perf_event__fprintf_schedstat_cpu(union perf_event *event, FILE *fp) +{ + struct perf_record_schedstat_cpu *cs =3D &event->schedstat_cpu; + size_t size =3D fprintf(fp, "\ncpu%u ", cs->cpu); + __u16 version =3D cs->version; + +#define CPU_FIELD(_type, _name, _desc, _format, _is_pct, _pct_of, _ver) \ + size +=3D fprintf(fp, "%" PRIu64 " ", (unsigned long)cs->_ver._name) + + if (version =3D=3D 15) { +#include + return size; + } +#undef CPU_FIELD + + return fprintf(fp, "Unsupported /proc/schedstat version %d.\n", + event->schedstat_cpu.version); +} + +size_t perf_event__fprintf_schedstat_domain(union perf_event *event, FILE = *fp) +{ + struct perf_record_schedstat_domain *ds =3D &event->schedstat_domain; + __u16 version =3D ds->version; + size_t size =3D fprintf(fp, "\ndomain%u ", ds->domain); + +#define DOMAIN_FIELD(_type, _name, _desc, _format, _is_jiffies, _ver) \ + size +=3D fprintf(fp, "%" PRIu64 " ", (unsigned long)ds->_ver._name) + + if (version =3D=3D 15) { +#include + return size; + } +#undef DOMAIN_FIELD + + return fprintf(fp, "Unsupported /proc/schedstat version %d.\n", + event->schedstat_domain.version); +} + size_t perf_event__fprintf(union perf_event *event, struct machine *machin= e, FILE *fp) { size_t ret =3D fprintf(fp, "PERF_RECORD_%s", diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index e40d16d3246c..5ab8ecc3e1ba 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h @@ -372,6 +372,8 @@ size_t perf_event__fprintf_ksymbol(union perf_event *ev= ent, FILE *fp); size_t perf_event__fprintf_bpf(union perf_event *event, FILE *fp); size_t perf_event__fprintf_bpf_metadata(union perf_event *event, FILE *fp); size_t perf_event__fprintf_text_poke(union perf_event *event, struct machi= ne *machine,FILE *fp); +size_t perf_event__fprintf_schedstat_cpu(union perf_event *event, FILE *fp= ); +size_t perf_event__fprintf_schedstat_domain(union perf_event *event, FILE = *fp); size_t perf_event__fprintf(union perf_event *event, struct machine *machin= e, FILE *fp); =20 int kallsyms__get_function_start(const char *kallsyms_filename, diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 26ae078278cd..0d5aa6345223 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -697,6 +697,20 @@ static void perf_event__time_conv_swap(union perf_even= t *event, } } =20 +static void +perf_event__schedstat_cpu_swap(union perf_event *event __maybe_unused, + bool sample_id_all __maybe_unused) +{ + /* FIXME */ +} + +static void +perf_event__schedstat_domain_swap(union perf_event *event __maybe_unused, + bool sample_id_all __maybe_unused) +{ + /* FIXME */ +} + typedef void (*perf_event__swap_op)(union perf_event *event, bool sample_id_all); =20 @@ -735,6 +749,8 @@ static perf_event__swap_op perf_event__swap_ops[] =3D { [PERF_RECORD_STAT_ROUND] =3D perf_event__stat_round_swap, [PERF_RECORD_EVENT_UPDATE] =3D perf_event__event_update_swap, [PERF_RECORD_TIME_CONV] =3D perf_event__time_conv_swap, + [PERF_RECORD_SCHEDSTAT_CPU] =3D perf_event__schedstat_cpu_swap, + [PERF_RECORD_SCHEDSTAT_DOMAIN] =3D perf_event__schedstat_domain_swap, [PERF_RECORD_HEADER_MAX] =3D NULL, }; =20 @@ -1499,6 +1515,12 @@ static s64 perf_session__process_user_event(struct p= erf_session *session, case PERF_RECORD_BPF_METADATA: err =3D tool->bpf_metadata(session, event); break; + case PERF_RECORD_SCHEDSTAT_CPU: + err =3D tool->schedstat_cpu(session, event); + break; + case PERF_RECORD_SCHEDSTAT_DOMAIN: + err =3D tool->schedstat_domain(session, event); + break; default: err =3D -EINVAL; break; diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index fcd1fd13c30e..01135d80fde5 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -2529,3 +2529,182 @@ int parse_synth_opt(char *synth) =20 return ret; } + +static union perf_event *__synthesize_schedstat_cpu(struct io *io, __u16 v= ersion, + __u64 *cpu, __u64 timestamp) +{ + struct perf_record_schedstat_cpu *cs; + union perf_event *event; + size_t size; + char ch; + + size =3D sizeof(*cs); + size =3D PERF_ALIGN(size, sizeof(u64)); + event =3D zalloc(size); + + if (!event) + return NULL; + + cs =3D &event->schedstat_cpu; + cs->header.type =3D PERF_RECORD_SCHEDSTAT_CPU; + cs->header.size =3D size; + cs->timestamp =3D timestamp; + + if (io__get_char(io) !=3D 'p' || io__get_char(io) !=3D 'u') + goto out_cpu; + + if (io__get_dec(io, (__u64 *)cpu) !=3D ' ') + goto out_cpu; + +#define CPU_FIELD(_type, _name, _desc, _format, _is_pct, _pct_of, _ver) \ + do { \ + __u64 _tmp; \ + ch =3D io__get_dec(io, &_tmp); \ + if (ch !=3D ' ' && ch !=3D '\n') \ + goto out_cpu; \ + cs->_ver._name =3D _tmp; \ + } while (0) + + if (version =3D=3D 15) { +#include + } +#undef CPU_FIELD + + cs->cpu =3D *cpu; + cs->version =3D version; + + return event; +out_cpu: + free(event); + return NULL; +} + +static union perf_event *__synthesize_schedstat_domain(struct io *io, __u1= 6 version, + __u64 cpu, __u64 timestamp) +{ + struct perf_record_schedstat_domain *ds; + union perf_event *event =3D NULL; + __u64 d_num; + size_t size; + char ch; + + if (io__get_char(io) !=3D 'o' || io__get_char(io) !=3D 'm' || io__get_cha= r(io) !=3D 'a' || + io__get_char(io) !=3D 'i' || io__get_char(io) !=3D 'n') + return NULL; + + ch =3D io__get_dec(io, &d_num); + + /* Skip cpumask as it can be extracted from perf header */ + while (io__get_char(io) !=3D ' ') + continue; + + size =3D sizeof(*ds); + size =3D PERF_ALIGN(size, sizeof(u64)); + event =3D zalloc(size); + + ds =3D &event->schedstat_domain; + ds->header.type =3D PERF_RECORD_SCHEDSTAT_DOMAIN; + ds->header.size =3D size; + ds->version =3D version; + ds->timestamp =3D timestamp; + ds->domain =3D d_num; + +#define DOMAIN_FIELD(_type, _name, _desc, _format, _is_jiffies, _ver) \ + do { \ + __u64 _tmp; \ + ch =3D io__get_dec(io, &_tmp); \ + if (ch !=3D ' ' && ch !=3D '\n') \ + goto out_domain; \ + ds->_ver._name =3D _tmp; \ + } while (0) + + if (version =3D=3D 15) { +#include + } +#undef DOMAIN_FIELD + + ds->cpu =3D cpu; + goto out; + +out_domain: + free(event); + event =3D NULL; +out: + return event; +} + +int perf_event__synthesize_schedstat(const struct perf_tool *tool, + perf_event__handler_t process, + struct perf_cpu_map *user_requested_cpus) +{ + char *line =3D NULL, path[PATH_MAX]; + union perf_event *event =3D NULL; + size_t line_len =3D 0; + char bf[BUFSIZ]; + __u64 timestamp; + __u64 cpu =3D -1; + __u16 version; + struct io io; + int ret =3D -1; + char ch; + + snprintf(path, PATH_MAX, "%s/schedstat", procfs__mountpoint()); + io.fd =3D open(path, O_RDONLY, 0); + if (io.fd < 0) { + pr_err("Failed to open %s. Possibly CONFIG_SCHEDSTAT is disabled.\n", pa= th); + return -1; + } + io__init(&io, io.fd, bf, sizeof(bf)); + + if (io__getline(&io, &line, &line_len) < 0 || !line_len) + goto out; + + if (!strcmp(line, "version 15\n")) { + version =3D 15; + } else { + pr_err("Unsupported %s version: %s", path, line + 8); + goto out_free_line; + } + + if (io__getline(&io, &line, &line_len) < 0 || !line_len) + goto out_free_line; + timestamp =3D atol(line + 10); + + /* + * FIXME: Can be optimized a bit by not synthesizing domain samples + * for filtered out cpus. + */ + for (ch =3D io__get_char(&io); !io.eof; ch =3D io__get_char(&io)) { + struct perf_cpu this_cpu; + + if (ch =3D=3D 'c') { + event =3D __synthesize_schedstat_cpu(&io, version, + &cpu, timestamp); + } else if (ch =3D=3D 'd') { + event =3D __synthesize_schedstat_domain(&io, version, + cpu, timestamp); + } + if (!event) + goto out_free_line; + + this_cpu.cpu =3D cpu; + + if (user_requested_cpus && !perf_cpu_map__has(user_requested_cpus, this_= cpu)) + continue; + + if (process(tool, event, NULL, NULL) < 0) { + free(event); + goto out_free_line; + } + + free(event); + } + + ret =3D 0; + +out_free_line: + free(line); +out: + close(io.fd); + return ret; +} diff --git a/tools/perf/util/synthetic-events.h b/tools/perf/util/synthetic= -events.h index ee29615d68e5..b20ffe7d840d 100644 --- a/tools/perf/util/synthetic-events.h +++ b/tools/perf/util/synthetic-events.h @@ -143,4 +143,7 @@ int perf_event__synthesize_for_pipe(const struct perf_t= ool *tool, struct perf_data *data, perf_event__handler_t process); =20 +int perf_event__synthesize_schedstat(const struct perf_tool *tool, + perf_event__handler_t process, + struct perf_cpu_map *user_requested_cpu); #endif // __PERF_SYNTHETIC_EVENTS_H diff --git a/tools/perf/util/tool.c b/tools/perf/util/tool.c index e83c7ababc2a..d17e5d356b3c 100644 --- a/tools/perf/util/tool.c +++ b/tools/perf/util/tool.c @@ -245,7 +245,23 @@ static int perf_event__process_bpf_metadata_stub(struc= t perf_session *perf_sessi { if (dump_trace) perf_event__fprintf_bpf_metadata(event, stdout); + dump_printf(": unhandled!\n"); + return 0; +} +static int process_schedstat_cpu_stub(struct perf_session *perf_session __= maybe_unused, + union perf_event *event) +{ + if (dump_trace) + perf_event__fprintf_schedstat_cpu(event, stdout); + dump_printf(": unhandled!\n"); + return 0; +} =20 +static int process_schedstat_domain_stub(struct perf_session *perf_session= __maybe_unused, + union perf_event *event) +{ + if (dump_trace) + perf_event__fprintf_schedstat_domain(event, stdout); dump_printf(": unhandled!\n"); return 0; } @@ -307,6 +323,8 @@ void perf_tool__init(struct perf_tool *tool, bool order= ed_events) #endif tool->finished_init =3D process_event_op2_stub; tool->bpf_metadata =3D perf_event__process_bpf_metadata_stub; + tool->schedstat_cpu =3D process_schedstat_cpu_stub; + tool->schedstat_domain =3D process_schedstat_domain_stub; } =20 bool perf_tool__compressed_is_stub(const struct perf_tool *tool) diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h index 18b76ff0f26a..d0ea049b5f6f 100644 --- a/tools/perf/util/tool.h +++ b/tools/perf/util/tool.h @@ -78,7 +78,9 @@ struct perf_tool { stat_round, feature, finished_init, - bpf_metadata; + bpf_metadata, + schedstat_cpu, + schedstat_domain; event_op4 compressed; event_op3 auxtrace; bool ordered_events; --=20 2.43.0 From nobody Thu Oct 2 23:53:20 2025 Received: from NAM04-MW2-obe.outbound.protection.outlook.com (mail-mw2nam04on2065.outbound.protection.outlook.com [40.107.101.65]) (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 18805321F35; Tue, 9 Sep 2025 11:45:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.101.65 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418355; cv=fail; b=iFrSri9qezx0459bzI9QgqbiRSRu1dIygissFWqmvFLUe0wGuxytJ15C4tuX9YkV26yRK5Gbcbzwq7famcSiJLtn5AIGlempfhPABIAMQjUspGNLuFzVRXBByZlwZ4sx9fPu5jbWNm7BYuohZGDnJe8g0Zd0/DMH5o9dpaPN/JI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418355; c=relaxed/simple; bh=qtZwo2XZ86qa7rhGYVx0dQ9HvDqk/vP9r30T2ULzEJ4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=SmTv93ZPyPec9PKAfj3Fj4xPhwIB4CW+Ossnr603J2uUEBXRmqneMeIoMW2VE9MbhRo/ckdkS3TxAXnAvj/AWNDFqF/wBpMga1gPdjlJvNlC2P9pL4pleZYSqmxy7sXUqES9v2251NOJ4lXCytqKOtx8UXtjwJ5qD9iB9xf5OTw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=rZEZAFKg; arc=fail smtp.client-ip=40.107.101.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="rZEZAFKg" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IM/b3+HmUtCy//L8Ab5Na6gPaLl8OK1YgHg61UVEoJEDyApia92j8MaPsNccJo7GNBwvuCKnX50RWr2tSFx/yzi3bAPwSSdMR9G2PKlYJ9pEzKiJsMAAba7KCRuivYCzmln57YsVLrgknMYcbsY1LMlO+qAOJZOINkW9QPwu5il9Let0ztclT7PkLIdBz0RB1Y+S9nHHX0S2X8H4rlVM65QLT8sPLBEOw4qqurCb6n7LetuFSZdtJp7xK8cck0/6N9oF6k5oh9rXHlj3Y3CTsMpPqaLowuwZHnwb1gVcVN4kC1ZQc4bjNSTMEVzfyEjdBSsS9vvFq7EWllphikfwkQ== 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=VTSzOrKurbppXO0C4bFzFezNBGEF+5jvee4BxA72MDM=; b=nzXwGUVM3XbcgmkYjJtjCX4q8tovZMI6wdiwDWd7QPHz7ESD1VnZN19bNYy0+fB7g1VdhpyzOjPRhVRhxr7BHfF/VU+CT+VjjKo0Wiq7JuSpJMKcizo1V2js8qo8JXVGA1ZA/nnTrrJf72eBePullO2w+Ht7BSrXXF5nG+qEScLPVpK1vCkzmAqVOoZlDBQF3DlFFANdMboDa2UzaPl+VOC1E9TEpnEvk6f5ijuU3QGwLnkqiFbS61fvbNX2Uj3dRSh9/GdYvr9eQ7N5vVvYs/59C14BhqlBL5G78oNv2JTlrHoW4gdx8UG2SbtLExIUSf6dpGBn3cyCdopV26edIA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=infradead.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=VTSzOrKurbppXO0C4bFzFezNBGEF+5jvee4BxA72MDM=; b=rZEZAFKgsW65C0PUJAvNoxUROIS9876ePthBqfVtxZnKu+uzIfok5CzxImyDtLMhBTr+TY6hyEHXKrer9Oc+AWUI3ashAr3lmh+Hou3u3jl8vJx+cHVrKIIm6bxBfk0S19I7YUVpHv12FXnWw/s8xx6Lj4ZSziR5UlPiVijFy9U= Received: from BYAPR07CA0021.namprd07.prod.outlook.com (2603:10b6:a02:bc::34) by BN3PR12MB9572.namprd12.prod.outlook.com (2603:10b6:408:2ca::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Tue, 9 Sep 2025 11:45:43 +0000 Received: from SJ1PEPF000023D5.namprd21.prod.outlook.com (2603:10b6:a02:bc:cafe::2a) by BYAPR07CA0021.outlook.office365.com (2603:10b6:a02:bc::34) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9115.15 via Frontend Transport; Tue, 9 Sep 2025 11:45:43 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF000023D5.mail.protection.outlook.com (10.167.244.70) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9137.0 via Frontend Transport; Tue, 9 Sep 2025 11:45:42 +0000 Received: from tapi.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 9 Sep 2025 04:45:30 -0700 From: Swapnil Sapkal To: , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , James Clark Subject: [PATCH RESEND v4 05/11] perf sched stats: Add schedstat v16 support Date: Tue, 9 Sep 2025 11:42:21 +0000 Message-ID: <20250909114227.58802-6-swapnil.sapkal@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250909114227.58802-1-swapnil.sapkal@amd.com> References: <20250909114227.58802-1-swapnil.sapkal@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000023D5:EE_|BN3PR12MB9572:EE_ X-MS-Office365-Filtering-Correlation-Id: 86d70807-9292-4e97-3968-08ddef966838 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|36860700013|82310400026|7416014|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ZVG+5SG5n9VS882SbqRlsF6NgU8nTErQS4DVl1XavgTGVsLvILwE6dDbRavT?= =?us-ascii?Q?3a06lIkw49eo9s5Jn+wU8rIwD+pgidvycb7utzfVfP2/PWNNkH84Tqc89E6K?= =?us-ascii?Q?E4scJrtKnFVfwoFaReI4hAiHiLdV1Mxbg60IYTgHKw2lkP8W8mXx7CiNlwJX?= =?us-ascii?Q?K5Qi0zx0QdiG/m0t4zUaYTOZV7G6UtvobsI6GQ5A1//J6NPjjd+/eISLozT3?= =?us-ascii?Q?T60J+7BwgFJhyu+/g7cl+MLnBwuZrwCz7N1vL+bnFKcQQkr1nqJTC5QFXppJ?= =?us-ascii?Q?RUHDnzZoL7sc56nSRFay/GIN/6l8lmk4yi4Rh/w22PzF+1sV9CiK/FG9XSbh?= =?us-ascii?Q?ZU4dHvKv+FAoUOxZeHcMVhQz5vXcUVEgvkF2gJAx+niQXJUUgZouCjWlFIEl?= =?us-ascii?Q?Y2Qblv864WA0QI9OGAPJfS3l247klQ1UhslEcl0DKIOdO3E4P9F53HsLJcQb?= =?us-ascii?Q?+0xiai+kmxjbOdtNthTI65r1pvYyujKLtiGwJOtjqy75IYVt7v8qVVl1Tdrf?= =?us-ascii?Q?LFw+mxE+1mcb//lLs5nQPJX5waDoo/LrdXTBoy4JrGgs6B+hjzODjuJ74JuG?= =?us-ascii?Q?g7O6YHMfyLofihs3pL89/X4dHLKa6FGrHU8tlq778BXB9RWceSfcwSvVxfX0?= =?us-ascii?Q?d7m7IvhS+0gE5wLAK9agFTPfk8ITVj/OwD1V0QagXgVW1X7a5qbcVPf33CAW?= =?us-ascii?Q?iF0IUG3SjvJQm9NMB7HhxPph/mxHs9mIaShVz0N/UpjsbU8dP0kxhBIrmrm7?= =?us-ascii?Q?WjcEHotoDfltuYJQuVAYqD8GX05WzcG/dSVQBkqj082B3o9Fm9qPEkMuQkU2?= =?us-ascii?Q?LMeRlDSy/D7iQA4rNNsWQd3udfpwVpd7WUoBy6TMH2V239s1o3gHRo0VR+Jz?= =?us-ascii?Q?+mz0dmoLvj6RVseUcM0yzSNdiqR2ngINsqaPy5eGffqthIYhoEyogJQluSeX?= =?us-ascii?Q?bEFdyNKHtJN/CFe2GB8UoNG+zeP8CBpe06zR8QqY15JNpbIur7G6WZJGJcFK?= =?us-ascii?Q?u+SxuoJYrRzQVofSooxlvlkHqIsvPE11xMj+3M5XgkTvxCuvohiNxuNI14f2?= =?us-ascii?Q?YyGjdjZ5+vUY0rEwvmdX8ynMyTTFBmEjNMRVdQeWJKSW/zkaFZFKbXaxTkL3?= =?us-ascii?Q?6UKR47x7PKoOw0LWp6wULEPa5MB9YiqOHeGHL4i11MbGXAO5vDbOaBHBlfcc?= =?us-ascii?Q?NwTZcgs6klzxTxy1sZKfasg3w0N0KKe/1v2SN3iAARrc9AG3DKH4KtXNspHB?= =?us-ascii?Q?nJIiBLKJkWpZTbmT/+LZb+Cy1UfKfo/q+5QMM3ZMWLCAL6OwrURTabkaXdiW?= =?us-ascii?Q?FNK/OBO1si5IKxWLB9cBEk/kMt/3COw3MIZnL1F7RZIVahjNtD42jPkL2eiZ?= =?us-ascii?Q?fEOkAxXPiZh1XLUW/96l4x/UfHdBrjZml2MlbyN95iku8B/URIsh8N829KeW?= =?us-ascii?Q?i4exN3A7fW3KhoCtKI5T09kwsGQl+cnQcqpU+2bgA5RMjQD2llX/ntSsEcII?= =?us-ascii?Q?bA2z4XZzNRlUUZv8DNEEM7/9WqUOnKua5MKY?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(36860700013)(82310400026)(7416014)(376014);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2025 11:45:42.7790 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 86d70807-9292-4e97-3968-08ddef966838 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000023D5.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR12MB9572 Content-Type: text/plain; charset="utf-8" /proc/schedstat file output is standardized with version number. Add support to record and raw dump v16 version layout. Co-developed-by: Ravi Bangoria Signed-off-by: Ravi Bangoria Tested-by: James Clark Signed-off-by: Swapnil Sapkal --- tools/lib/perf/Makefile | 2 +- tools/lib/perf/include/perf/event.h | 14 ++ tools/lib/perf/include/perf/schedstat-v16.h | 146 ++++++++++++++++++++ tools/perf/util/event.c | 6 + tools/perf/util/synthetic-events.c | 6 + 5 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 tools/lib/perf/include/perf/schedstat-v16.h diff --git a/tools/lib/perf/Makefile b/tools/lib/perf/Makefile index 9fa28e512ca8..965e066fd780 100644 --- a/tools/lib/perf/Makefile +++ b/tools/lib/perf/Makefile @@ -179,7 +179,7 @@ install_lib: libs cp -fpR $(LIBPERF_ALL) $(DESTDIR)$(libdir_SQ) =20 HDRS :=3D bpf_perf.h core.h cpumap.h threadmap.h evlist.h evsel.h event.h = mmap.h -HDRS +=3D schedstat-v15.h +HDRS +=3D schedstat-v15.h schedstat-v16.h INTERNAL_HDRS :=3D cpumap.h evlist.h evsel.h lib.h mmap.h rc_check.h threa= dmap.h xyarray.h =20 INSTALL_HDRS_PFX :=3D $(DESTDIR)$(prefix)/include/perf diff --git a/tools/lib/perf/include/perf/event.h b/tools/lib/perf/include/p= erf/event.h index 7ed7bae73b55..4c38a58e19c3 100644 --- a/tools/lib/perf/include/perf/event.h +++ b/tools/lib/perf/include/perf/event.h @@ -489,6 +489,12 @@ struct perf_record_schedstat_cpu_v15 { #undef CPU_FIELD }; =20 +struct perf_record_schedstat_cpu_v16 { +#define CPU_FIELD(_type, _name, _desc, _format, _is_pct, _pct_of, _ver) _= type _name +#include "schedstat-v16.h" +#undef CPU_FIELD +}; + struct perf_record_schedstat_cpu { struct perf_event_header header; __u64 timestamp; @@ -498,6 +504,7 @@ struct perf_record_schedstat_cpu { char __pad[2]; union { struct perf_record_schedstat_cpu_v15 v15; + struct perf_record_schedstat_cpu_v16 v16; }; }; =20 @@ -507,6 +514,12 @@ struct perf_record_schedstat_domain_v15 { #undef DOMAIN_FIELD }; =20 +struct perf_record_schedstat_domain_v16 { +#define DOMAIN_FIELD(_type, _name, _desc, _format, _is_jiffies, _ver) _ty= pe _name +#include "schedstat-v16.h" +#undef DOMAIN_FIELD +}; + #define DOMAIN_NAME_LEN 16 =20 struct perf_record_schedstat_domain { @@ -517,6 +530,7 @@ struct perf_record_schedstat_domain { __u16 domain; union { struct perf_record_schedstat_domain_v15 v15; + struct perf_record_schedstat_domain_v16 v16; }; }; =20 diff --git a/tools/lib/perf/include/perf/schedstat-v16.h b/tools/lib/perf/i= nclude/perf/schedstat-v16.h new file mode 100644 index 000000000000..3462b79c29af --- /dev/null +++ b/tools/lib/perf/include/perf/schedstat-v16.h @@ -0,0 +1,146 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifdef CPU_FIELD +CPU_FIELD(__u32, yld_count, "sched_yield() count", + "%11u", false, yld_count, v16); +CPU_FIELD(__u32, array_exp, "Legacy counter can be ignored", + "%11u", false, array_exp, v16); +CPU_FIELD(__u32, sched_count, "schedule() called", + "%11u", false, sched_count, v16); +CPU_FIELD(__u32, sched_goidle, "schedule() left the processor idle", + "%11u", true, sched_count, v16); +CPU_FIELD(__u32, ttwu_count, "try_to_wake_up() was called", + "%11u", false, ttwu_count, v16); +CPU_FIELD(__u32, ttwu_local, "try_to_wake_up() was called to wake up the l= ocal cpu", + "%11u", true, ttwu_count, v16); +CPU_FIELD(__u64, rq_cpu_time, "total runtime by tasks on this processor (i= n jiffies)", + "%11llu", false, rq_cpu_time, v16); +CPU_FIELD(__u64, run_delay, "total waittime by tasks on this processor (in= jiffies)", + "%11llu", true, rq_cpu_time, v16); +CPU_FIELD(__u64, pcount, "total timeslices run on this cpu", + "%11llu", false, pcount, v16); +#endif /* CPU_FIELD */ + +#ifdef DOMAIN_FIELD +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, busy_lb_count, + "load_balance() count on cpu busy", "%11u", true, v16); +DOMAIN_FIELD(__u32, busy_lb_balanced, + "load_balance() found balanced on cpu busy", "%11u", true, v16); +DOMAIN_FIELD(__u32, busy_lb_failed, + "load_balance() move task failed on cpu busy", "%11u", true, v16); +DOMAIN_FIELD(__u32, busy_lb_imbalance, + "imbalance sum on cpu busy", "%11u", false, v16); +DOMAIN_FIELD(__u32, busy_lb_gained, + "pull_task() count on cpu busy", "%11u", false, v16); +DOMAIN_FIELD(__u32, busy_lb_hot_gained, + "pull_task() when target task was cache-hot on cpu busy", "%11u", fa= lse, v16); +DOMAIN_FIELD(__u32, busy_lb_nobusyq, + "load_balance() failed to find busier queue on cpu busy", "%11u", tr= ue, v16); +DOMAIN_FIELD(__u32, busy_lb_nobusyg, + "load_balance() failed to find busier group on cpu busy", "%11u", tr= ue, v16); +#ifdef DERIVED_CNT_FIELD +DERIVED_CNT_FIELD(busy_lb_success_count, "load_balance() success count on = cpu busy", "%11u", + busy_lb_count, busy_lb_balanced, busy_lb_failed, v16); +#endif +#ifdef DERIVED_AVG_FIELD +DERIVED_AVG_FIELD(busy_lb_avg_pulled, + "avg task pulled per successful lb attempt (cpu busy)", "%11.2Lf", + busy_lb_count, busy_lb_balanced, busy_lb_failed, busy_lb_gained, v16); +#endif +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, idle_lb_count, + "load_balance() count on cpu idle", "%11u", true, v16); +DOMAIN_FIELD(__u32, idle_lb_balanced, + "load_balance() found balanced on cpu idle", "%11u", true, v16); +DOMAIN_FIELD(__u32, idle_lb_failed, + "load_balance() move task failed on cpu idle", "%11u", true, v16); +DOMAIN_FIELD(__u32, idle_lb_imbalance, + "imbalance sum on cpu idle", "%11u", false, v16); +DOMAIN_FIELD(__u32, idle_lb_gained, + "pull_task() count on cpu idle", "%11u", false, v16); +DOMAIN_FIELD(__u32, idle_lb_hot_gained, + "pull_task() when target task was cache-hot on cpu idle", "%11u", fa= lse, v16); +DOMAIN_FIELD(__u32, idle_lb_nobusyq, + "load_balance() failed to find busier queue on cpu idle", "%11u", tr= ue, v16); +DOMAIN_FIELD(__u32, idle_lb_nobusyg, + "load_balance() failed to find busier group on cpu idle", "%11u", tr= ue, v16); +#ifdef DERIVED_CNT_FIELD +DERIVED_CNT_FIELD(idle_lb_success_count, "load_balance() success count on = cpu idle", "%11u", + idle_lb_count, idle_lb_balanced, idle_lb_failed, v16); +#endif +#ifdef DERIVED_AVG_FIELD +DERIVED_AVG_FIELD(idle_lb_avg_pulled, + "avg task pulled per successful lb attempt (cpu idle)", "%11.2Lf", + idle_lb_count, idle_lb_balanced, idle_lb_failed, idle_lb_gained, v16); +#endif +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, newidle_lb_count, + "load_balance() count on cpu newly idle", "%11u", true, v16); +DOMAIN_FIELD(__u32, newidle_lb_balanced, + "load_balance() found balanced on cpu newly idle", "%11u", true, v16= ); +DOMAIN_FIELD(__u32, newidle_lb_failed, + "load_balance() move task failed on cpu newly idle", "%11u", true, v= 16); +DOMAIN_FIELD(__u32, newidle_lb_imbalance, + "imbalance sum on cpu newly idle", "%11u", false, v16); +DOMAIN_FIELD(__u32, newidle_lb_gained, + "pull_task() count on cpu newly idle", "%11u", false, v16); +DOMAIN_FIELD(__u32, newidle_lb_hot_gained, + "pull_task() when target task was cache-hot on cpu newly idle", "%11= u", false, v16); +DOMAIN_FIELD(__u32, newidle_lb_nobusyq, + "load_balance() failed to find busier queue on cpu newly idle", "%11= u", true, v16); +DOMAIN_FIELD(__u32, newidle_lb_nobusyg, + "load_balance() failed to find busier group on cpu newly idle", "%11= u", true, v16); +#ifdef DERIVED_CNT_FIELD +DERIVED_CNT_FIELD(newidle_lb_success_count, + "load_balance() success count on cpu newly idle", "%11u", + newidle_lb_count, newidle_lb_balanced, newidle_lb_failed, v16); +#endif +#ifdef DERIVED_AVG_FIELD +DERIVED_AVG_FIELD(newidle_lb_avg_count, + "avg task pulled per successful lb attempt (cpu newly idle)", "%11.2Lf= ", + newidle_lb_count, newidle_lb_balanced, newidle_lb_failed, newidle_lb_g= ained, v16); +#endif +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, alb_count, + "active_load_balance() count", "%11u", false, v16); +DOMAIN_FIELD(__u32, alb_failed, + "active_load_balance() move task failed", "%11u", false, v16); +DOMAIN_FIELD(__u32, alb_pushed, + "active_load_balance() successfully moved a task", "%11u", false, v1= 6); +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, sbe_count, + "sbe_count is not used", "%11u", false, v16); +DOMAIN_FIELD(__u32, sbe_balanced, + "sbe_balanced is not used", "%11u", false, v16); +DOMAIN_FIELD(__u32, sbe_pushed, + "sbe_pushed is not used", "%11u", false, v16); +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, sbf_count, + "sbf_count is not used", "%11u", false, v16); +DOMAIN_FIELD(__u32, sbf_balanced, + "sbf_balanced is not used", "%11u", false, v16); +DOMAIN_FIELD(__u32, sbf_pushed, + "sbf_pushed is not used", "%11u", false, v16); +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, ttwu_wake_remote, + "try_to_wake_up() awoke a task that last ran on a diff cpu", "%11u",= false, v16); +DOMAIN_FIELD(__u32, ttwu_move_affine, + "try_to_wake_up() moved task because cache-cold on own cpu", "%11u",= false, v16); +DOMAIN_FIELD(__u32, ttwu_move_balance, + "try_to_wake_up() started passive balancing", "%11u", false, v16); +#endif /* DOMAIN_FIELD */ diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 41fb942ef701..88a5dad240ac 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -584,6 +584,9 @@ size_t perf_event__fprintf_schedstat_cpu(union perf_eve= nt *event, FILE *fp) if (version =3D=3D 15) { #include return size; + } else if (version =3D=3D 16) { +#include + return size; } #undef CPU_FIELD =20 @@ -603,6 +606,9 @@ size_t perf_event__fprintf_schedstat_domain(union perf_= event *event, FILE *fp) if (version =3D=3D 15) { #include return size; + } else if (version =3D=3D 16) { +#include + return size; } #undef DOMAIN_FIELD =20 diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index 01135d80fde5..499c819bb8ff 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -2567,6 +2567,8 @@ static union perf_event *__synthesize_schedstat_cpu(s= truct io *io, __u16 version =20 if (version =3D=3D 15) { #include + } else if (version =3D=3D 16) { +#include } #undef CPU_FIELD =20 @@ -2620,6 +2622,8 @@ static union perf_event *__synthesize_schedstat_domai= n(struct io *io, __u16 vers =20 if (version =3D=3D 15) { #include + } else if (version =3D=3D 16) { +#include } #undef DOMAIN_FIELD =20 @@ -2661,6 +2665,8 @@ int perf_event__synthesize_schedstat(const struct per= f_tool *tool, =20 if (!strcmp(line, "version 15\n")) { version =3D 15; + } else if (!strcmp(line, "version 16\n")) { + version =3D 16; } else { pr_err("Unsupported %s version: %s", path, line + 8); goto out_free_line; --=20 2.43.0 From nobody Thu Oct 2 23:53:20 2025 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2078.outbound.protection.outlook.com [40.107.92.78]) (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 B17AD322DBA; Tue, 9 Sep 2025 11:46:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.92.78 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418379; cv=fail; b=hNi62rIm4GzDTT54/dmgTa+fff/Ve6b6FkIaK8RKT6t/YsnSRPNL9Zafwi3WV3GB6+KOrripZXFyzoHjWDVuzRFCu/umnBqQB9CekI3lbvTcfZSgRiHeSrRM4ygbv3awdCjgjf/PQmIyjWyo+I+j3hxW7Xsc+QxO2Rr7nrOGf94= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418379; c=relaxed/simple; bh=ffxZZVxcCMTd5sNfKEQjltVA8IDqY0raRClZTCvHXz4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=DFvyj4vq73NkcBYK4vPRBtUq9FIcokhQq2qHWLvFLoGerGGUmlDEpapV8Lpblz/uXg+ftPCkBn1V0bnOr4sD6GqqmLJeWsawo6dmxqkEhycqqfcQu82HF5tkDUsqZ3K35YQOzkRo6a2g0MbP8vreIGUmUvEgCs1v7vGeuD+mKmE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=fwTPC/i8; arc=fail smtp.client-ip=40.107.92.78 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="fwTPC/i8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=N/WLFsEQWSZLutQA1yJNIFtK1KKwuj8QCA4vxZTv2J8wxbu1Fjx8VusJm+/IkJ7NlSx+kRlcqokDubnL9TE77RSHyjfOizdZPgFNBtt6sLb8WPpQKeeLjP4jkU0U5d/DEnNB1nNrzpdsVlI65+842yxaF7hVszzsQ8BqlumqaWfAKq5x20OnCMxvxqVfJLg+6cVjVtsHPO8YNhDB5hZeR1OpEo13oFHU1O2AFxL/UfBtiCslwu0Kqtcw3N3vFObu5KQQ9mTp5WThchTqlMpJU9GJqgvIi2Xi42ToO1pjfiX9AHmwF/3IzjHObnhxcKvEUa4q381iUDEk0PpdKRumsQ== 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=w7sR6OqLrrB8HM+mtGl71OnW6DKfS4QcLrsHkSsr4kM=; b=lCAm2sKEx93EjRhEQPBlYvlvkB+83jAGpGwzHoNqxV1Zz2TT6NherN8PCk82loUaOvK5W3k7+9iKCpd2TZbeEWXl7i1Bu3TQXRediy+npVEB/x2iMETtcoXhO1JuJ843U+W+EjyBnF1iTP23+P4v1EM1+yc6BR1B5AJriiuEOx7BBGGW979n8TIZMFmbL/iPjzYlnlMewNzzz3GCRAPI1DJJEtU8ttF0J2RSaM7oNfiD7cR5k13JKt9ywEIHrfbTcBG8HZhKEK3sFJLt+afkLEU9hPbvQsAVLEYwjdC5Vt6Sf0Y9yfvcSdMwRTJ8gIhk2haiXuLlbyb+HZbjjZDtZg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=infradead.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=w7sR6OqLrrB8HM+mtGl71OnW6DKfS4QcLrsHkSsr4kM=; b=fwTPC/i8a+9aq9vdNgM/9GgXpKTlER1mLsRyngMPKL3x5piWC50u6goeMmbo8+8YNmEDgTkbroRx2JjmGYCGsBP4qRULfaU76aG0Wb6tYbF41vfOjnuSdzZTURcafIEgGFwHVZKLswUGW8hReQ8k6gwhDM63IL4xcTLD463Hg7o= Received: from BY3PR05CA0039.namprd05.prod.outlook.com (2603:10b6:a03:39b::14) by DM6PR12MB4338.namprd12.prod.outlook.com (2603:10b6:5:2a2::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Tue, 9 Sep 2025 11:46:11 +0000 Received: from SJ1PEPF000023D7.namprd21.prod.outlook.com (2603:10b6:a03:39b:cafe::b0) by BY3PR05CA0039.outlook.office365.com (2603:10b6:a03:39b::14) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9115.14 via Frontend Transport; Tue, 9 Sep 2025 11:46:10 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF000023D7.mail.protection.outlook.com (10.167.244.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9137.0 via Frontend Transport; Tue, 9 Sep 2025 11:46:10 +0000 Received: from tapi.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 9 Sep 2025 04:45:57 -0700 From: Swapnil Sapkal To: , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH RESEND v4 06/11] perf sched stats: Add schedstat v17 support Date: Tue, 9 Sep 2025 11:42:22 +0000 Message-ID: <20250909114227.58802-7-swapnil.sapkal@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250909114227.58802-1-swapnil.sapkal@amd.com> References: <20250909114227.58802-1-swapnil.sapkal@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000023D7:EE_|DM6PR12MB4338:EE_ X-MS-Office365-Filtering-Correlation-Id: 40dfebb1-67e4-4240-71cd-08ddef9678b6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|7416014|376014|36860700013|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?gEe76buHM2s6k162/OEVg40Gr7MSetqM10Wsct+PTLefCSw44KtrDDO7NqhO?= =?us-ascii?Q?+d8EAHZ3ghkWeARia0gJQaGkRP9hUe9VkDos6YiuHL8zUudh/U2U7s4j5dUh?= =?us-ascii?Q?yMylgAz1jrFVuqEEMM1d0T7+EWooqtpdCN5oAvm7psvtlXaIy475oWCyG3VX?= =?us-ascii?Q?D4Sr+rCiwd/lhAbQ4vaukR8UdmULbRiohpWrjgM69BpWEh33xZ0OJKYbjoVZ?= =?us-ascii?Q?kVh6INNR3G28+JrcuSfe1fymw9W9PPdXoRwNzLetLeKA5bTg7HIxubx1n+79?= =?us-ascii?Q?jNeh6lMkmbE9S3UbaBWZFFeFmlmr1xitIf0yJONvlGwS6MkP0epFMMQdjQHO?= =?us-ascii?Q?xgkN+29M1YIfcbFzk+UXieF/nFT9Fgjco7u4bYiGDAcxqs9zvNGjACOPkUQ+?= =?us-ascii?Q?cDXndct85YNIrUqfIJPvLJmBflHL+VreOUxNuHODP13ebfbO5qYaal0IZ0Q+?= =?us-ascii?Q?qEZ1/QgcHsIqvB8EiZD+usOuGZH47nRrJ+OY+7lLLhcqXGvlmvgxfFF1yQ75?= =?us-ascii?Q?B6W63bHPqSG3g1zM94lYic3hGskOtnDo1D5nDT8JpQah+WeMwxA1yRX8XaO0?= =?us-ascii?Q?CTjepsAx2KMSJGovyj0A7LnemraXy3I5kXQUcGaqefXLRaDaP1V9UY2o/vEL?= =?us-ascii?Q?WYQgHHK7RYDCOiwe1fBvWcyZaoHYL1HpDLmWnZhFgYjmar+kqiLjSRZ9+1KI?= =?us-ascii?Q?B5cIkaviiJpdF1DclDDCyrHk+FklnhwTcUUD/MlGtc0CCWthyLEnxVSY8ie2?= =?us-ascii?Q?ccYahQGIe/NgLfydTFYynguIbBy+HcGIpq2pgha4MafXuRF1jC8fo7js1JpL?= =?us-ascii?Q?CSIjfKh8fj/+tD4G5zJXzBYjZm4x44hN4xiU0OUCBsoZ7UbtoFw1wn1PCZ+V?= =?us-ascii?Q?tgG+X59dXIJZ70l5SWMTUGdPYOEKDCXGD2KUL7Y3e7UV2FZVDmWR5gbjatYU?= =?us-ascii?Q?PNQxIwtTUklm9KNNMaxDsTcjeqt1HPMr7dO8W33pJcDNX4iHEf8Sd/4LmokL?= =?us-ascii?Q?dS0vl4q6dg+k5AYzlknUwH1izlHccNdJ0PUVjzAOkObcDojjVfWDxxY+n5zm?= =?us-ascii?Q?0olJlUMG9d+04Hp4nfgeyww4VyZQJRTxkK+cj2jJJiUPW4QbECaW5i/SuiiY?= =?us-ascii?Q?mp0LtIH09rCuQ8gsGBrfcJIrlMzh3m1ZFft4OYsMhyHiNLgIXZ7BTLx4zgKi?= =?us-ascii?Q?Q05q8puqgtHFv70P5XqwD9/UdSKRPWSzggushWXC7eihjwzd1EoomJY/Uqtp?= =?us-ascii?Q?ATs7+oLF5XRl59DVw1NdeDszEUGTqIrqOGFMBNneZwaFUmcZPeCLcyDfy94C?= =?us-ascii?Q?Om30CDdQsdHQ6mVajZAK8T4JkYpLmB8eHOQmLLqplGmt/MQ7HVGaiJKmtTtd?= =?us-ascii?Q?rv8JBG0SuuPFbAbL2KzpOHpTWNhXRb4rYbWjUAEo4RdyyqpgiZMdaclGEpzt?= =?us-ascii?Q?k0heT8G3xR4EleSmkFh7Kcao+Pv5snJoMLlVYWhF8RWw1klf0O9RH65smwrL?= =?us-ascii?Q?GPWwDmkTDz/50H19+PTxauR/Pi/lJPNWtgHH?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(7416014)(376014)(36860700013)(1800799024);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2025 11:46:10.4501 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 40dfebb1-67e4-4240-71cd-08ddef9678b6 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000023D7.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4338 Content-Type: text/plain; charset="utf-8" /proc/schedstat file output is standardized with version number. Add support to record and raw dump v17 version layout. Co-developed-by: Ravi Bangoria Signed-off-by: Ravi Bangoria Signed-off-by: Swapnil Sapkal --- tools/lib/perf/Makefile | 2 +- tools/lib/perf/include/perf/event.h | 14 ++ tools/lib/perf/include/perf/schedstat-v17.h | 164 ++++++++++++++++++++ tools/perf/util/event.c | 6 + tools/perf/util/synthetic-events.c | 11 ++ 5 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 tools/lib/perf/include/perf/schedstat-v17.h diff --git a/tools/lib/perf/Makefile b/tools/lib/perf/Makefile index 965e066fd780..27e6490f64dc 100644 --- a/tools/lib/perf/Makefile +++ b/tools/lib/perf/Makefile @@ -179,7 +179,7 @@ install_lib: libs cp -fpR $(LIBPERF_ALL) $(DESTDIR)$(libdir_SQ) =20 HDRS :=3D bpf_perf.h core.h cpumap.h threadmap.h evlist.h evsel.h event.h = mmap.h -HDRS +=3D schedstat-v15.h schedstat-v16.h +HDRS +=3D schedstat-v15.h schedstat-v16.h schedstat-v17.h INTERNAL_HDRS :=3D cpumap.h evlist.h evsel.h lib.h mmap.h rc_check.h threa= dmap.h xyarray.h =20 INSTALL_HDRS_PFX :=3D $(DESTDIR)$(prefix)/include/perf diff --git a/tools/lib/perf/include/perf/event.h b/tools/lib/perf/include/p= erf/event.h index 4c38a58e19c3..5a93a84f49f8 100644 --- a/tools/lib/perf/include/perf/event.h +++ b/tools/lib/perf/include/perf/event.h @@ -495,6 +495,12 @@ struct perf_record_schedstat_cpu_v16 { #undef CPU_FIELD }; =20 +struct perf_record_schedstat_cpu_v17 { +#define CPU_FIELD(_type, _name, _desc, _format, _is_pct, _pct_of, _ver) _= type _name +#include "schedstat-v17.h" +#undef CPU_FIELD +}; + struct perf_record_schedstat_cpu { struct perf_event_header header; __u64 timestamp; @@ -505,6 +511,7 @@ struct perf_record_schedstat_cpu { union { struct perf_record_schedstat_cpu_v15 v15; struct perf_record_schedstat_cpu_v16 v16; + struct perf_record_schedstat_cpu_v17 v17; }; }; =20 @@ -520,6 +527,12 @@ struct perf_record_schedstat_domain_v16 { #undef DOMAIN_FIELD }; =20 +struct perf_record_schedstat_domain_v17 { +#define DOMAIN_FIELD(_type, _name, _desc, _format, _is_jiffies, _ver) _ty= pe _name +#include "schedstat-v17.h" +#undef DOMAIN_FIELD +}; + #define DOMAIN_NAME_LEN 16 =20 struct perf_record_schedstat_domain { @@ -531,6 +544,7 @@ struct perf_record_schedstat_domain { union { struct perf_record_schedstat_domain_v15 v15; struct perf_record_schedstat_domain_v16 v16; + struct perf_record_schedstat_domain_v17 v17; }; }; =20 diff --git a/tools/lib/perf/include/perf/schedstat-v17.h b/tools/lib/perf/i= nclude/perf/schedstat-v17.h new file mode 100644 index 000000000000..865dc7c1039c --- /dev/null +++ b/tools/lib/perf/include/perf/schedstat-v17.h @@ -0,0 +1,164 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifdef CPU_FIELD +CPU_FIELD(__u32, yld_count, "sched_yield() count", + "%11u", false, yld_count, v17); +CPU_FIELD(__u32, array_exp, "Legacy counter can be ignored", + "%11u", false, array_exp, v17); +CPU_FIELD(__u32, sched_count, "schedule() called", + "%11u", false, sched_count, v17); +CPU_FIELD(__u32, sched_goidle, "schedule() left the processor idle", + "%11u", true, sched_count, v17); +CPU_FIELD(__u32, ttwu_count, "try_to_wake_up() was called", + "%11u", false, ttwu_count, v17); +CPU_FIELD(__u32, ttwu_local, "try_to_wake_up() was called to wake up the l= ocal cpu", + "%11u", true, ttwu_count, v17); +CPU_FIELD(__u64, rq_cpu_time, "total runtime by tasks on this processor (i= n jiffies)", + "%11llu", false, rq_cpu_time, v17); +CPU_FIELD(__u64, run_delay, "total waittime by tasks on this processor (in= jiffies)", + "%11llu", true, rq_cpu_time, v17); +CPU_FIELD(__u64, pcount, "total timeslices run on this cpu", + "%11llu", false, pcount, v17); +#endif /* CPU_FIELD */ + +#ifdef DOMAIN_FIELD +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, busy_lb_count, + "load_balance() count on cpu busy", "%11u", true, v17); +DOMAIN_FIELD(__u32, busy_lb_balanced, + "load_balance() found balanced on cpu busy", "%11u", true, v17); +DOMAIN_FIELD(__u32, busy_lb_failed, + "load_balance() move task failed on cpu busy", "%11u", true, v17); +DOMAIN_FIELD(__u32, busy_lb_imbalance_load, + "imbalance in load on cpu busy", "%11u", false, v17); +DOMAIN_FIELD(__u32, busy_lb_imbalance_util, + "imbalance in utilization on cpu busy", "%11u", false, v17); +DOMAIN_FIELD(__u32, busy_lb_imbalance_task, + "imbalance in number of tasks on cpu busy", "%11u", false, v17); +DOMAIN_FIELD(__u32, busy_lb_imbalance_misfit, + "imbalance in misfit tasks on cpu busy", "%11u", false, v17); +DOMAIN_FIELD(__u32, busy_lb_gained, + "pull_task() count on cpu busy", "%11u", false, v17); +DOMAIN_FIELD(__u32, busy_lb_hot_gained, + "pull_task() when target task was cache-hot on cpu busy", "%11u", fa= lse, v17); +DOMAIN_FIELD(__u32, busy_lb_nobusyq, + "load_balance() failed to find busier queue on cpu busy", "%11u", tr= ue, v17); +DOMAIN_FIELD(__u32, busy_lb_nobusyg, + "load_balance() failed to find busier group on cpu busy", "%11u", tr= ue, v17); +#ifdef DERIVED_CNT_FIELD +DERIVED_CNT_FIELD(busy_lb_success_count, "load_balance() success count on = cpu busy", "%11u", + busy_lb_count, busy_lb_balanced, busy_lb_failed, v17); +#endif +#ifdef DERIVED_AVG_FIELD +DERIVED_AVG_FIELD(busy_lb_avg_pulled, + "avg task pulled per successful lb attempt (cpu busy)", "%11.2Lf", + busy_lb_count, busy_lb_balanced, busy_lb_failed, busy_lb_gained, v17); +#endif +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, idle_lb_count, + "load_balance() count on cpu idle", "%11u", true, v17); +DOMAIN_FIELD(__u32, idle_lb_balanced, + "load_balance() found balanced on cpu idle", "%11u", true, v17); +DOMAIN_FIELD(__u32, idle_lb_failed, + "load_balance() move task failed on cpu idle", "%11u", true, v17); +DOMAIN_FIELD(__u32, idle_lb_imbalance_load, + "imbalance in load on cpu idle", "%11u", false, v17); +DOMAIN_FIELD(__u32, idle_lb_imbalance_util, + "imbalance in utilization on cpu idle", "%11u", false, v17); +DOMAIN_FIELD(__u32, idle_lb_imbalance_task, + "imbalance in number of tasks on cpu idle", "%11u", false, v17); +DOMAIN_FIELD(__u32, idle_lb_imbalance_misfit, + "imbalance in misfit tasks on cpu idle", "%11u", false, v17); +DOMAIN_FIELD(__u32, idle_lb_gained, + "pull_task() count on cpu idle", "%11u", false, v17); +DOMAIN_FIELD(__u32, idle_lb_hot_gained, + "pull_task() when target task was cache-hot on cpu idle", "%11u", fa= lse, v17); +DOMAIN_FIELD(__u32, idle_lb_nobusyq, + "load_balance() failed to find busier queue on cpu idle", "%11u", tr= ue, v17); +DOMAIN_FIELD(__u32, idle_lb_nobusyg, + "load_balance() failed to find busier group on cpu idle", "%11u", tr= ue, v17); +#ifdef DERIVED_CNT_FIELD +DERIVED_CNT_FIELD(idle_lb_success_count, "load_balance() success count on = cpu idle", "%11u", + idle_lb_count, idle_lb_balanced, idle_lb_failed, v17); +#endif +#ifdef DERIVED_AVG_FIELD +DERIVED_AVG_FIELD(idle_lb_avg_pulled, + "avg task pulled per successful lb attempt (cpu idle)", "%11.2Lf", + idle_lb_count, idle_lb_balanced, idle_lb_failed, idle_lb_gained, v17); +#endif +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, newidle_lb_count, + "load_balance() count on cpu newly idle", "%11u", true, v17); +DOMAIN_FIELD(__u32, newidle_lb_balanced, + "load_balance() found balanced on cpu newly idle", "%11u", true, v17= ); +DOMAIN_FIELD(__u32, newidle_lb_failed, + "load_balance() move task failed on cpu newly idle", "%11u", true, v= 17); +DOMAIN_FIELD(__u32, newidle_lb_imbalance_load, + "imbalance in load on cpu newly idle", "%11u", false, v17); +DOMAIN_FIELD(__u32, newidle_lb_imbalance_util, + "imbalance in utilization on cpu newly idle", "%11u", false, v17); +DOMAIN_FIELD(__u32, newidle_lb_imbalance_task, + "imbalance in number of tasks on cpu newly idle", "%11u", false, v17= ); +DOMAIN_FIELD(__u32, newidle_lb_imbalance_misfit, + "imbalance in misfit tasks on cpu newly idle", "%11u", false, v17); +DOMAIN_FIELD(__u32, newidle_lb_gained, + "pull_task() count on cpu newly idle", "%11u", false, v17); +DOMAIN_FIELD(__u32, newidle_lb_hot_gained, + "pull_task() when target task was cache-hot on cpu newly idle", "%11= u", false, v17); +DOMAIN_FIELD(__u32, newidle_lb_nobusyq, + "load_balance() failed to find busier queue on cpu newly idle", "%11= u", true, v17); +DOMAIN_FIELD(__u32, newidle_lb_nobusyg, + "load_balance() failed to find busier group on cpu newly idle", "%11= u", true, v17); +#ifdef DERIVED_CNT_FIELD +DERIVED_CNT_FIELD(newidle_lb_success_count, + "load_balance() success count on cpu newly idle", "%11u", + newidle_lb_count, newidle_lb_balanced, newidle_lb_failed, v17); +#endif +#ifdef DERIVED_AVG_FIELD +DERIVED_AVG_FIELD(newidle_lb_avg_pulled, + "avg task pulled per successful lb attempt (cpu newly idle)", "%11.2Lf= ", + newidle_lb_count, newidle_lb_balanced, newidle_lb_failed, newidle_lb_g= ained, v17); +#endif +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, alb_count, + "active_load_balance() count", "%11u", false, v17); +DOMAIN_FIELD(__u32, alb_failed, + "active_load_balance() move task failed", "%11u", false, v17); +DOMAIN_FIELD(__u32, alb_pushed, + "active_load_balance() successfully moved a task", "%11u", false, v1= 7); +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, sbe_count, + "sbe_count is not used", "%11u", false, v17); +DOMAIN_FIELD(__u32, sbe_balanced, + "sbe_balanced is not used", "%11u", false, v17); +DOMAIN_FIELD(__u32, sbe_pushed, + "sbe_pushed is not used", "%11u", false, v17); +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, sbf_count, + "sbf_count is not used", "%11u", false, v17); +DOMAIN_FIELD(__u32, sbf_balanced, + "sbf_balanced is not used", "%11u", false, v17); +DOMAIN_FIELD(__u32, sbf_pushed, + "sbf_pushed is not used", "%11u", false, v17); +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY(" "); +#endif +DOMAIN_FIELD(__u32, ttwu_wake_remote, + "try_to_wake_up() awoke a task that last ran on a diff cpu", "%11u",= false, v17); +DOMAIN_FIELD(__u32, ttwu_move_affine, + "try_to_wake_up() moved task because cache-cold on own cpu", "%11u",= false, v17); +DOMAIN_FIELD(__u32, ttwu_move_balance, + "try_to_wake_up() started passive balancing", "%11u", false, v17); +#endif /* DOMAIN_FIELD */ diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 88a5dad240ac..d50fd1c00dfc 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -587,6 +587,9 @@ size_t perf_event__fprintf_schedstat_cpu(union perf_eve= nt *event, FILE *fp) } else if (version =3D=3D 16) { #include return size; + } else if (version =3D=3D 17) { +#include + return size; } #undef CPU_FIELD =20 @@ -609,6 +612,9 @@ size_t perf_event__fprintf_schedstat_domain(union perf_= event *event, FILE *fp) } else if (version =3D=3D 16) { #include return size; + } else if (version =3D=3D 17) { +#include + return size; } #undef DOMAIN_FIELD =20 diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index 499c819bb8ff..0c97ed711b60 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -2569,6 +2569,8 @@ static union perf_event *__synthesize_schedstat_cpu(s= truct io *io, __u16 version #include } else if (version =3D=3D 16) { #include + } else if (version =3D=3D 17) { +#include } #undef CPU_FIELD =20 @@ -2595,6 +2597,11 @@ static union perf_event *__synthesize_schedstat_doma= in(struct io *io, __u16 vers return NULL; =20 ch =3D io__get_dec(io, &d_num); + if (version >=3D 17) { + /* Skip domain name as it can be extracted from perf header */ + while (io__get_char(io) !=3D ' ') + continue; + } =20 /* Skip cpumask as it can be extracted from perf header */ while (io__get_char(io) !=3D ' ') @@ -2624,6 +2631,8 @@ static union perf_event *__synthesize_schedstat_domai= n(struct io *io, __u16 vers #include } else if (version =3D=3D 16) { #include + } else if (version =3D=3D 17) { +#include } #undef DOMAIN_FIELD =20 @@ -2667,6 +2676,8 @@ int perf_event__synthesize_schedstat(const struct per= f_tool *tool, version =3D 15; } else if (!strcmp(line, "version 16\n")) { version =3D 16; + } else if (!strcmp(line, "version 17\n")) { + version =3D 17; } else { pr_err("Unsupported %s version: %s", path, line + 8); goto out_free_line; --=20 2.43.0 From nobody Thu Oct 2 23:53:20 2025 Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2085.outbound.protection.outlook.com [40.107.220.85]) (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 741793A1C9; Tue, 9 Sep 2025 11:46:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.220.85 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418405; cv=fail; b=R6VPuD2MObNI8vAgVMzbPDjkmqi0q8QTYIYhSqiLwaWrUdl/11Q5Esblj/+iHI5yuzLhkBN2ESdVSuKDXJJnkpeTy9xuIKcdZFD22o2yaNfyY2Sulv9+CVBFfF4NjcxBbyVmvQy8oEIxrPHWfO8pRC8M6Tpdz0RhTDHf8HHX3ZA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418405; c=relaxed/simple; bh=re5aark05SAWAjeVlSOp0aljB8igxjdDGEL8eDhq6OI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=XT47dduQxd828bttj1pKzyb+Wzg5H1FPlXqL4QIf5T2l++sis1Eac4cE69iHo1PRjFiaP2mjCleLvbAbyP2w2qTu7e4jk+WAY0In5d6XLTQIt8HGL2vWzYX5FXOxVu4xA4wqZrn9MuhWTC3Rcmmq2UpPq8sNLJ2BxEBFjuyD2pc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=48gNy20U; arc=fail smtp.client-ip=40.107.220.85 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="48gNy20U" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CvzgmjGsMkxasFTks9mh1xmTfIvkb+vOs7TaAC0H4IAkYGW0p0LgN+s/2HY+5nL0YCMLJiESLdp2dJvhGcBTQhQQ2khHplPziXlCgqMD/ofSs+QwwB3wOxq0VCENW4XuSij8eLkzT/HzeUU8MwF67QYjjv3Xf2Wq0XzyLWbZUfB0E2EKt1ZvDqaai9ZDZkuNwnbyaHKrPX/i7c9dgn0BnJGARtnfOB/fFI+RvT+3xO7JcA/ED4CgFWlw5e/z5ub5T10zroq9ACJoA+TWtnlUfx0xNk41xSpHXYdYKVfkHim7fiXW0GnuiQOht3F3PovvxEoX/XtLnAjWLUVGs9bMrw== 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=QZDLb27WQGUgDzCconJAK6S8FtNNRDhGSDwyXo4oPCM=; b=T8djaWsmeE3FnUSSt0Bj8A7BUljPrgyW7WHYlPTWPhchKAcMHEfUhppZX9JWUq+pCDpLbHorGDgQxCHR1xHUTcpx3ajMyoqzKIKDb8am5DckGRBhHV+uhlS3uPx3114UFxGGlO9zC9mUT3fDloYloP8iIV/+nWJwmbdeKopqca44py/o5BeYRoGL4O5E82Kzc40KpZVcLQqTiDdflGLFNlhGKcOkyhaUUmeO8BJuH/lKSA/TzhVOfBVV6ASg3KnahAb0Wc+F5QU+gGX/RcDrnEw2B6uU5Z0FpEQPB04rdX15ulhAaBy7QCvQdhslhgpJgYSBS6VRNJDFvDO6iLzjcg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=infradead.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=QZDLb27WQGUgDzCconJAK6S8FtNNRDhGSDwyXo4oPCM=; b=48gNy20UxssRHeuMimPdYRxfFXFjGT7JIVtP3bnkfCnUn70RQ33GihzVR9cNwTOKIx6rODg60tUumMTeWmI3oy02qAjBw1HTtkUJ2JyeZh2YZ649WY2dybZ994xbZbPSffo5ycSG/5peh2m+CTnZ3U1Y0yPoUAx5HFpxhgBzJoA= Received: from SJ0PR03CA0038.namprd03.prod.outlook.com (2603:10b6:a03:33e::13) by SN7PR12MB6741.namprd12.prod.outlook.com (2603:10b6:806:26f::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Tue, 9 Sep 2025 11:46:37 +0000 Received: from SJ1PEPF000023D6.namprd21.prod.outlook.com (2603:10b6:a03:33e:cafe::2e) by SJ0PR03CA0038.outlook.office365.com (2603:10b6:a03:33e::13) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9115.15 via Frontend Transport; Tue, 9 Sep 2025 11:46:37 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF000023D6.mail.protection.outlook.com (10.167.244.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9137.0 via Frontend Transport; Tue, 9 Sep 2025 11:46:37 +0000 Received: from tapi.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 9 Sep 2025 04:46:24 -0700 From: Swapnil Sapkal To: , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , James Clark Subject: [PATCH RESEND v4 07/11] perf sched stats: Add support for report subcommand Date: Tue, 9 Sep 2025 11:42:23 +0000 Message-ID: <20250909114227.58802-8-swapnil.sapkal@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250909114227.58802-1-swapnil.sapkal@amd.com> References: <20250909114227.58802-1-swapnil.sapkal@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000023D6:EE_|SN7PR12MB6741:EE_ X-MS-Office365-Filtering-Correlation-Id: 11070c80-ebeb-4067-5b43-08ddef9688d9 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|7416014|376014|36860700013|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?s3VDa5sJ7Ue/372w/eKGpGf2iAv5QU1nHpMYk/rKRWYBYsR00nGGDAFhOEQx?= =?us-ascii?Q?Oq59hqWVkeRmp6j9KUP1r9ht4keHZdlhUx14m45zScOD+hDAri+Xq5LoI6PM?= =?us-ascii?Q?YMkXz0GKxF5W+dBAjikjACknFQej7/feqi0qH3Ga3xkppAe2CqOABVPfC1nl?= =?us-ascii?Q?5dScHEcCljdCoMMI4zfAzsHAd+xwvtsp8GVgxiL7N5hXr5VVLsKhJXhG70K2?= =?us-ascii?Q?R7HSBrWiP9Jss4P1oxB6muaqR+sgYpM2o/flwekqZbjR0R2n1oGG6IFFLp71?= =?us-ascii?Q?N94I1IYRxQENusYXW+64MbnfzXCBZvt4wHlnaMuzYRtLg0ktid6o3EKPP/0H?= =?us-ascii?Q?Ezbt3LvcHwFKF4gTVIBIVgqq35k/7JDsFg37VpRt3U3xMTZPehW2VrKptkzK?= =?us-ascii?Q?jdbJVI6xvxxe/lZIpaBKsZ0CPIZn6AYxI7acV9GVnemx1tP8z2EvjDBFM7+u?= =?us-ascii?Q?u0yBSarzCFNGbcY/5BJP/qBt0d/KdBO9WQRzMS94jxDP7nN2njiPUtr7/LrW?= =?us-ascii?Q?J4RHo867kbDuo+W8xVcbjgiNBstdCBlEY3rbA80FnLIVQLqU3/DmB1fVRCGY?= =?us-ascii?Q?hri9VbwQa+MXGE53IUOxdu8Qom/ee+vM1JZNf9+unvNAv0bw6tA4msB/bpuo?= =?us-ascii?Q?JyvlcwXDfirJh6kRvFBdVRFKar8jeDGZALQvn86vboS+9BXDMbaWtf86/abV?= =?us-ascii?Q?B2xsgZHKNzQvDNArhUWO2Gja4f/e0ABKmsLZoeSRJGMkTkMNOZ34wjjZomiT?= =?us-ascii?Q?qHPLIXHXv4H0CbHl6jnCvNIhZ4RQZzCTo5Wv3lK4Yb2Sv71WUqv9JwTADgsZ?= =?us-ascii?Q?ZRz9TYUr3q4pKbOxl/c3XMwFOehmoO1SZWEfvbkp/lynl4zulif7iGDTJ3OL?= =?us-ascii?Q?spL+oeHcA+XHyxWqWaYBLqnRbLekzs1pNHLxUZmP3sERJY9KEnvG7zfrDe75?= =?us-ascii?Q?cSJvXMUXdBGj8pmuUXyqs451A7yM/zNIuPEe2JjHeiRdmInux05xRZj21YlA?= =?us-ascii?Q?LArf0lJ7H8XWXMrHl/e4ckLuC00lwHaTuPBNTMCE2Vu2vDQU0+lBfE3SvoaC?= =?us-ascii?Q?/3KXdlqQ/DJDuFavFYrI/+AWBPqB+aHEqQRJT3Q2AD78zDSw6870zGlncodp?= =?us-ascii?Q?LYsO6SUQDTbXpxDfteHoCT2qUe5OxtuJZ7LiQPMpVOKvHy6aHoYhaHpSWBCr?= =?us-ascii?Q?yzGlIa5FxxCtoEhADiaPYpyQj/U4hXXZIxl7lr74XWnnUPHF6g8BwjaPbDKT?= =?us-ascii?Q?/MyeFBIQL+mCpihgr01BJfVe3/fjB3Qt2taBbx5ghAkL8nYT06IHAoacxIJi?= =?us-ascii?Q?UvDcRWc6a3BvbQG93oqdXtXkwagEZQnmcsQodwC78XTICCOCqddyWLBR37YH?= =?us-ascii?Q?C7GYoCtpY8kLhnrgJcvwxPE9NwgINWOtemcXkxRYoXjIkyIKPG1Ut04x91KD?= =?us-ascii?Q?FLwnyOzs6rPYnrX5bhNoNLAjuih2rXkHCFiNEiadmR5ma6gWSYW3vzDQSn5T?= =?us-ascii?Q?10xJJWnB/4GOiljCJ/hK3UP8OB7P8JnKmQgk?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(7416014)(376014)(36860700013)(1800799024);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2025 11:46:37.5217 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 11070c80-ebeb-4067-5b43-08ddef9688d9 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000023D6.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB6741 Content-Type: text/plain; charset="utf-8" `perf sched stats record` captures two sets of samples. For workload profile, first set right before workload starts and second set after workload finishes. For the systemwide profile, first set at the beginning of profile and second set on receiving SIGINT signal. Add `perf sched stats report` subcommand that will read both the set of samples, get the diff and render a final report. Final report prints scheduler stat at cpu granularity as well as sched domain granularity. Example usage: # perf sched stats record # perf sched stats report Co-developed-by: Ravi Bangoria Signed-off-by: Ravi Bangoria Tested-by: James Clark Signed-off-by: Swapnil Sapkal --- tools/perf/builtin-sched.c | 509 ++++++++++++++++++++++++++++++++++++- 1 file changed, 508 insertions(+), 1 deletion(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 2573491fa5f8..e23018798f5b 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -3940,6 +3940,505 @@ static int perf_sched__schedstat_record(struct perf= _sched *sched, return err; } =20 +struct schedstat_domain { + struct list_head domain_list; + struct perf_record_schedstat_domain *domain_data; +}; + +struct schedstat_cpu { + struct list_head cpu_list; + struct list_head domain_head; + struct perf_record_schedstat_cpu *cpu_data; +}; + +static struct list_head cpu_head =3D LIST_HEAD_INIT(cpu_head); +static struct schedstat_cpu *cpu_second_pass; +static struct schedstat_domain *domain_second_pass; +static bool after_workload_flag; +static bool verbose_field; + +static void store_schedtstat_cpu_diff(struct schedstat_cpu *after_workload) +{ + struct perf_record_schedstat_cpu *before =3D cpu_second_pass->cpu_data; + struct perf_record_schedstat_cpu *after =3D after_workload->cpu_data; + __u16 version =3D after_workload->cpu_data->version; + +#define CPU_FIELD(_type, _name, _desc, _format, _is_pct, _pct_of, _ver) \ + (before->_ver._name =3D after->_ver._name - before->_ver._name) + + if (version =3D=3D 15) { +#include + } else if (version =3D=3D 16) { +#include + } else if (version =3D=3D 17) { +#include + } + +#undef CPU_FIELD +} + +static void store_schedstat_domain_diff(struct schedstat_domain *after_wor= kload) +{ + struct perf_record_schedstat_domain *before =3D domain_second_pass->domai= n_data; + struct perf_record_schedstat_domain *after =3D after_workload->domain_dat= a; + __u16 version =3D after_workload->domain_data->version; + +#define DOMAIN_FIELD(_type, _name, _desc, _format, _is_jiffies, _ver) \ + (before->_ver._name =3D after->_ver._name - before->_ver._name) + + if (version =3D=3D 15) { +#include + } else if (version =3D=3D 16) { +#include + } else if (version =3D=3D 17) { +#include + } +#undef DOMAIN_FIELD +} + +static inline void print_cpu_stats(struct perf_record_schedstat_cpu *cs) +{ + printf("%-65s %12s %12s\n", "DESC", "COUNT", "PCT_CHANGE"); + printf("%.*s\n", 100, graph_dotted_line); + +#define CALC_PCT(_x, _y) ((_y) ? ((double)(_x) / (_y)) * 100 : 0.0) + +#define CPU_FIELD(_type, _name, _desc, _format, _is_pct, _pct_of, _ver) \ + do { \ + printf("%-65s: " _format, verbose_field ? _desc : #_name, \ + cs->_ver._name); \ + if (_is_pct) { \ + printf(" ( %8.2lf%% )", \ + CALC_PCT(cs->_ver._name, cs->_ver._pct_of)); \ + } \ + printf("\n"); \ + } while (0) + + if (cs->version =3D=3D 15) { +#include + } else if (cs->version =3D=3D 16) { +#include + } else if (cs->version =3D=3D 17) { +#include + } + +#undef CPU_FIELD +#undef CALC_PCT +} + +static inline void print_domain_stats(struct perf_record_schedstat_domain = *ds, + __u64 jiffies) +{ + printf("%-65s %12s %14s\n", "DESC", "COUNT", "AVG_JIFFIES"); + +#define DOMAIN_CATEGORY(_desc) \ + do { \ + size_t _len =3D strlen(_desc); \ + size_t _pre_dash_cnt =3D (100 - _len) / 2; \ + size_t _post_dash_cnt =3D 100 - _len - _pre_dash_cnt; \ + print_separator((int)_pre_dash_cnt, _desc, (int)_post_dash_cnt);\ + } while (0) + +#define CALC_AVG(_x, _y) ((_y) ? (long double)(_x) / (_y) : 0.0) + +#define DOMAIN_FIELD(_type, _name, _desc, _format, _is_jiffies, _ver) \ + do { \ + printf("%-65s: " _format, verbose_field ? _desc : #_name, \ + ds->_ver._name); \ + if (_is_jiffies) { \ + printf(" $ %11.2Lf $", \ + CALC_AVG(jiffies, ds->_ver._name)); \ + } \ + printf("\n"); \ + } while (0) + +#define DERIVED_CNT_FIELD(_name, _desc, _format, _x, _y, _z, _ver) \ + printf("*%-64s: " _format "\n", verbose_field ? _desc : #_name, \ + (ds->_ver._x) - (ds->_ver._y) - (ds->_ver._z)) + +#define DERIVED_AVG_FIELD(_name, _desc, _format, _x, _y, _z, _w, _ver) \ + printf("*%-64s: " _format "\n", verbose_field ? _desc : #_name, \ + CALC_AVG(ds->_ver._w, \ + ((ds->_ver._x) - (ds->_ver._y) - (ds->_ver._z)))) + + if (ds->version =3D=3D 15) { +#include + } else if (ds->version =3D=3D 16) { +#include + } else if (ds->version =3D=3D 17) { +#include + } + +#undef DERIVED_AVG_FIELD +#undef DERIVED_CNT_FIELD +#undef DOMAIN_FIELD +#undef CALC_AVG +#undef DOMAIN_CATEGORY +} + +static void summarize_schedstat_cpu(struct schedstat_cpu *summary_cpu, + struct schedstat_cpu *cptr, + int cnt, bool is_last) +{ + struct perf_record_schedstat_cpu *summary_cs =3D summary_cpu->cpu_data, + *temp_cs =3D cptr->cpu_data; + +#define CPU_FIELD(_type, _name, _desc, _format, _is_pct, _pct_of, _ver) \ + do { \ + summary_cs->_ver._name +=3D temp_cs->_ver._name; \ + if (is_last) \ + summary_cs->_ver._name /=3D cnt; \ + } while (0) + + if (cptr->cpu_data->version =3D=3D 15) { +#include + } else if (cptr->cpu_data->version =3D=3D 16) { +#include + } else if (cptr->cpu_data->version =3D=3D 17) { +#include + } +#undef CPU_FIELD +} + +static void summarize_schedstat_domain(struct schedstat_domain *summary_do= main, + struct schedstat_domain *dptr, + int cnt, bool is_last) +{ + struct perf_record_schedstat_domain *summary_ds =3D summary_domain->domai= n_data, + *temp_ds =3D dptr->domain_data; + +#define DOMAIN_FIELD(_type, _name, _desc, _format, _is_jiffies, _ver) \ + do { \ + summary_ds->_ver._name +=3D temp_ds->_ver._name; \ + if (is_last) \ + summary_ds->_ver._name /=3D cnt; \ + } while (0) + + if (dptr->domain_data->version =3D=3D 15) { +#include + } else if (dptr->domain_data->version =3D=3D 16) { +#include + } else if (dptr->domain_data->version =3D=3D 17) { +#include + } +#undef DOMAIN_FIELD +} + +static int get_all_cpu_stats(struct list_head *head) +{ + struct schedstat_cpu *cptr =3D list_first_entry(head, struct schedstat_cp= u, cpu_list); + struct schedstat_cpu *summary_head =3D NULL; + struct perf_record_schedstat_domain *ds; + struct perf_record_schedstat_cpu *cs; + struct schedstat_domain *dptr, *tdptr; + bool is_last =3D false; + int cnt =3D 1; + int ret =3D 0; + + if (cptr) { + summary_head =3D zalloc(sizeof(*summary_head)); + if (!summary_head) + return -ENOMEM; + + summary_head->cpu_data =3D zalloc(sizeof(*cs)); + memcpy(summary_head->cpu_data, cptr->cpu_data, sizeof(*cs)); + + INIT_LIST_HEAD(&summary_head->domain_head); + + list_for_each_entry(dptr, &cptr->domain_head, domain_list) { + tdptr =3D zalloc(sizeof(*tdptr)); + if (!tdptr) + return -ENOMEM; + + tdptr->domain_data =3D zalloc(sizeof(*ds)); + if (!tdptr->domain_data) + return -ENOMEM; + + memcpy(tdptr->domain_data, dptr->domain_data, sizeof(*ds)); + list_add_tail(&tdptr->domain_list, &summary_head->domain_head); + } + } + + + list_for_each_entry(cptr, head, cpu_list) { + if (list_is_first(&cptr->cpu_list, head)) + continue; + + if (list_is_last(&cptr->cpu_list, head)) + is_last =3D true; + + cnt++; + summarize_schedstat_cpu(summary_head, cptr, cnt, is_last); + tdptr =3D list_first_entry(&summary_head->domain_head, struct schedstat_= domain, + domain_list); + + list_for_each_entry(dptr, &cptr->domain_head, domain_list) { + summarize_schedstat_domain(tdptr, dptr, cnt, is_last); + tdptr =3D list_next_entry(tdptr, domain_list); + } + } + + list_add(&summary_head->cpu_list, head); + + return ret; +} + +static void print_field_description(struct schedstat_cpu *cptr) +{ +#define CPU_FIELD(_type, _name, _desc, _format, _is_pct, _pct_of, _ver) \ + printf("%-30s-> %s\n", #_name, _desc) \ + +#define DOMAIN_CATEGORY(_desc) \ + do { \ + size_t _len =3D strlen(_desc); \ + size_t _pre_dash_cnt =3D (100 - _len) / 2; \ + size_t _post_dash_cnt =3D 100 - _len - _pre_dash_cnt; \ + print_separator((int)_pre_dash_cnt, _desc, (int)_post_dash_cnt);\ + } while (0) + +#define DOMAIN_FIELD(_type, _name, _desc, _format, _is_jiffies, _ver) \ + printf("%-30s-> %s\n", #_name, _desc) \ + +#define DERIVED_CNT_FIELD(_name, _desc, _format, _x, _y, _z, _ver) \ + printf("*%-29s-> %s\n", #_name, _desc) \ + +#define DERIVED_AVG_FIELD(_name, _desc, _format, _x, _y, _z, _w, _ver) \ + printf("*%-29s-> %s\n", #_name, _desc) \ + + if (cptr->cpu_data->version =3D=3D 15) { +#include + } else if (cptr->cpu_data->version =3D=3D 16) { +#include + } else if (cptr->cpu_data->version =3D=3D 17) { +#include + } +#undef CPU_FIELD +#undef DOMAIN_CATEGORY +#undef DERIVED_CNT_FIELD +#undef DERIVED_AVG_FIELD +#undef DOMAIN_FIELD +} + +static int show_schedstat_data(struct list_head *head, struct cpu_domain_m= ap **cd_map) +{ + struct schedstat_cpu *cptr =3D list_first_entry(head, struct schedstat_cp= u, cpu_list); + __u64 jiffies =3D cptr->cpu_data->timestamp; + struct perf_record_schedstat_domain *ds; + struct perf_record_schedstat_cpu *cs; + struct schedstat_domain *dptr; + bool is_summary =3D true; + int ret =3D 0; + + printf("Description\n"); + print_separator(100, "", 0); + printf("%-30s-> %s\n", "DESC", "Description of the field"); + printf("%-30s-> %s\n", "COUNT", "Value of the field"); + printf("%-30s-> %s\n", "PCT_CHANGE", "Percent change with corresponding b= ase value"); + printf("%-30s-> %s\n", "AVG_JIFFIES", + "Avg time in jiffies between two consecutive occurrence of event"); + + if (!verbose_field) { + print_separator(100, "", 0); + print_field_description(cptr); + } + + print_separator(100, "", 0); + printf("\n"); + + printf("%-65s: %11llu\n", "Time elapsed (in jiffies)", jiffies); + print_separator(100, "", 0); + + ret =3D get_all_cpu_stats(head); + + list_for_each_entry(cptr, head, cpu_list) { + cs =3D cptr->cpu_data; + printf("\n"); + print_separator(100, "", 0); + + if (is_summary) + printf("CPU \n"); + else + printf("CPU %d\n", cs->cpu); + + print_separator(100, "", 0); + print_cpu_stats(cs); + print_separator(100, "", 0); + + list_for_each_entry(dptr, &cptr->domain_head, domain_list) { + struct domain_info *dinfo; + + ds =3D dptr->domain_data; + dinfo =3D cd_map[ds->cpu]->domains[ds->domain]; + if (is_summary) + if (dinfo->dname) + printf("CPU , DOMAIN %s\n", dinfo->dname); + else + printf("CPU , DOMAIN %d\n", dinfo->domain); + else { + if (dinfo->dname) + printf("CPU %d, DOMAIN %s CPUS ", cs->cpu, dinfo->dname); + else + printf("CPU %d, DOMAIN %d CPUS ", cs->cpu, dinfo->domain); + + printf("%s\n", dinfo->cpulist); + } + print_separator(100, "", 0); + print_domain_stats(ds, jiffies); + print_separator(100, "", 0); + } + is_summary =3D false; + } + return ret; +} + +static int perf_sched__process_schedstat(struct perf_session *session __ma= ybe_unused, + union perf_event *event) +{ + struct perf_cpu this_cpu; + static __u32 initial_cpu; + + switch (event->header.type) { + case PERF_RECORD_SCHEDSTAT_CPU: + this_cpu.cpu =3D event->schedstat_cpu.cpu; + break; + case PERF_RECORD_SCHEDSTAT_DOMAIN: + this_cpu.cpu =3D event->schedstat_domain.cpu; + break; + default: + return 0; + } + + if (user_requested_cpus && !perf_cpu_map__has(user_requested_cpus, this_c= pu)) + return 0; + + if (event->header.type =3D=3D PERF_RECORD_SCHEDSTAT_CPU) { + struct schedstat_cpu *temp =3D zalloc(sizeof(*temp)); + + if (!temp) + return -ENOMEM; + + temp->cpu_data =3D zalloc(sizeof(*temp->cpu_data)); + if (!temp->cpu_data) + return -ENOMEM; + + memcpy(temp->cpu_data, &event->schedstat_cpu, sizeof(*temp->cpu_data)); + + if (!list_empty(&cpu_head) && temp->cpu_data->cpu =3D=3D initial_cpu) + after_workload_flag =3D true; + + if (!after_workload_flag) { + if (list_empty(&cpu_head)) + initial_cpu =3D temp->cpu_data->cpu; + + list_add_tail(&temp->cpu_list, &cpu_head); + INIT_LIST_HEAD(&temp->domain_head); + } else { + if (temp->cpu_data->cpu =3D=3D initial_cpu) { + cpu_second_pass =3D list_first_entry(&cpu_head, struct schedstat_cpu, + cpu_list); + cpu_second_pass->cpu_data->timestamp =3D + temp->cpu_data->timestamp - cpu_second_pass->cpu_data->timestamp; + } else { + cpu_second_pass =3D list_next_entry(cpu_second_pass, cpu_list); + } + domain_second_pass =3D list_first_entry(&cpu_second_pass->domain_head, + struct schedstat_domain, domain_list); + store_schedtstat_cpu_diff(temp); + free(temp); + } + } else if (event->header.type =3D=3D PERF_RECORD_SCHEDSTAT_DOMAIN) { + struct schedstat_cpu *cpu_tail; + struct schedstat_domain *temp =3D zalloc(sizeof(*temp)); + + if (!temp) + return -ENOMEM; + + temp->domain_data =3D zalloc(sizeof(*temp->domain_data)); + if (!temp->domain_data) + return -ENOMEM; + + memcpy(temp->domain_data, &event->schedstat_domain, sizeof(*temp->domain= _data)); + + if (!after_workload_flag) { + cpu_tail =3D list_last_entry(&cpu_head, struct schedstat_cpu, cpu_list); + list_add_tail(&temp->domain_list, &cpu_tail->domain_head); + } else { + store_schedstat_domain_diff(temp); + domain_second_pass =3D list_next_entry(domain_second_pass, domain_list); + free(temp); + } + } + + return 0; +} + +static void free_schedstat(struct list_head *head) +{ + struct schedstat_domain *dptr, *n1; + struct schedstat_cpu *cptr, *n2; + + list_for_each_entry_safe(cptr, n2, head, cpu_list) { + list_for_each_entry_safe(dptr, n1, &cptr->domain_head, domain_list) { + list_del_init(&dptr->domain_list); + free(dptr); + } + list_del_init(&cptr->cpu_list); + free(cptr); + } +} + +static int perf_sched__schedstat_report(struct perf_sched *sched) +{ + struct cpu_domain_map **cd_map; + struct perf_session *session; + struct target target =3D {}; + struct perf_data data =3D { + .path =3D input_name, + .mode =3D PERF_DATA_MODE_READ, + }; + int err =3D 0; + + sched->tool.schedstat_cpu =3D perf_sched__process_schedstat; + sched->tool.schedstat_domain =3D perf_sched__process_schedstat; + + session =3D perf_session__new(&data, &sched->tool); + if (IS_ERR(session)) { + pr_err("Perf session creation failed.\n"); + return PTR_ERR(session); + } + + if (cpu_list) + target.cpu_list =3D cpu_list; + else + target.system_wide =3D true; + + err =3D evlist__create_maps(session->evlist, &target); + if (err < 0) + goto out; + + user_requested_cpus =3D session->evlist->core.user_requested_cpus; + + err =3D perf_session__process_events(session); + + if (!err) { + setup_pager(); + + if (list_empty(&cpu_head)) { + pr_err("Data is not available\n"); + err =3D -1; + goto out; + } + + cd_map =3D session->header.env.cpu_domain; + err =3D show_schedstat_data(&cpu_head, cd_map); + } + +out: + free_schedstat(&cpu_head); + perf_session__delete(session); + return err; +} + static bool schedstat_events_exposed(void) { /* @@ -4117,9 +4616,12 @@ int cmd_sched(int argc, const char **argv) OPT_PARENT(sched_options) }; const struct option stats_options[] =3D { + OPT_STRING('i', "input", &input_name, "file", + "`stats report` with input filename"), OPT_STRING('o', "output", &output_name, "file", "`stats record` with output filename"), OPT_STRING('C', "cpu", &cpu_list, "cpu", "list of cpus to profile"), + OPT_BOOLEAN('v', "verbose", &verbose_field, "Show explanation for fields = in the report"), OPT_END() }; =20 @@ -4244,7 +4746,7 @@ int cmd_sched(int argc, const char **argv) if (!ret) ret =3D perf_sched__timehist(&sched); } else if (!strcmp(argv[0], "stats")) { - const char *const stats_subcommands[] =3D {"record", NULL}; + const char *const stats_subcommands[] =3D {"record", "report", NULL}; =20 argc =3D parse_options_subcommand(argc, argv, stats_options, stats_subcommands, @@ -4256,6 +4758,11 @@ int cmd_sched(int argc, const char **argv) argc =3D parse_options(argc, argv, stats_options, stats_usage, 0); return perf_sched__schedstat_record(&sched, argc, argv); + } else if (argv[0] && !strcmp(argv[0], "report")) { + if (argc) + argc =3D parse_options(argc, argv, stats_options, + stats_usage, 0); + return perf_sched__schedstat_report(&sched); } usage_with_options(stats_usage, stats_options); } else { --=20 2.43.0 From nobody Thu Oct 2 23:53:20 2025 Received: from NAM02-BN1-obe.outbound.protection.outlook.com (mail-bn1nam02on2057.outbound.protection.outlook.com [40.107.212.57]) (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 906CA30EF63; Tue, 9 Sep 2025 11:47:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.212.57 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418431; cv=fail; b=r/jmWV1N3aYi/HgElrh8wEK7dR0xsRWW4H3bJxiGOVYAXLrIFPGWdheEoIXqqdaLkKC86Tb/qIyEKdz86x8ZsHlKXt7IQy5u98MKHCHm2ht/P5LidvKJv22TuikGIq6E35sJ2d0f6AJ+/1tF+81pq8+xSGTPegFdI+AWQiK5lrs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418431; c=relaxed/simple; bh=oJxD9HD7rdyJGgnHN2gjkU3Lff8G/dTRLSuyQK3Z/Zs=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=REramAzvl0O0NQ6pMny/h9umRuMEhUHllqtpxJEfikL04GvSDsrSpURHpCLv/9PIktA66h6wsANFcalGumXB9Lo+Za4q4It5iS9SH09rtk+4QXEfNj+jYywA6KPUEVHY94n+qvs4KrfKM0rbSnNQMCVbviGxIXVhXEqKoLdQGdM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=hhLTPUZl; arc=fail smtp.client-ip=40.107.212.57 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="hhLTPUZl" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=URPTko4KMioZ3rgjttVcw2Xv1Yw9yrYXF9Jh56LbxIv9cZQzWbLO44uCdsEXYZSZCabN5gsCKhpEMZSrDZPhqtW6rauq654pPcvRy+1/P/5g681x+KkCi7+TywmJpFQInnLEExRvp3sxW3uQwoJfumhi/otdSueGDaISCaiS49DerQyHz6eJyz8P/fzFww/bpwO08w7UB+10wCVwT1d/m8oe8rFSTZNoL9Rs/QW/i5XYUV3WTtqxTjFCLERZ302d1QOv+HKip/zgsRuYQgqMAQUAbX6BuRX423CnyCqFdFRUGIPi5YCIeeTqZO9bqZSSW6K4/e0gTKhnrTZEAR2iEA== 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=EuH4Jc2ohVg1C3/9sqpJ9GnIhkjwQPX1zsqKJUfarPQ=; b=beuB0MoB9vsmQfPBuboNZcCVQdZtPctJwEVcS4iTo4K8dIfRj+RZ7fIGQUMyApGsPVYdhW/abvsOOBMnM8DgCL7lEpxi+bs4k6MlBSNpvuZ3wvtIzqbKQ8HL6l2r/NtS2VWZFl2V5KXy94wG+d5vxPLNFa0nVTUyDgAk+FXn2fJjRHdSvNX60/xDRGqWwU2/nfbvQyUBmfAMRV5icYs+mze7Cs0QyrrpO5LWvbfYX7JlTvN3JIMgJO8HQqgrWnOrzA56VoYTB9WXGV6Akqxx6Uk/q06UXWFFIRgvh3CXkmrlGHQmGflTGt1uF6zBzjeH2x+M8VTlVb3Smit7nizoUw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=infradead.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EuH4Jc2ohVg1C3/9sqpJ9GnIhkjwQPX1zsqKJUfarPQ=; b=hhLTPUZlipyAgeooWo8M+xijYZM4ID3/SNRmpW8LZGM5G67iulrNaz5hELfh62xMg9Iek360Px0jG2VIOwhao1ZHnsoFxff6pzK7miZ8+Ii5apxZSm+9izjIt+2FX003jFjTqaFvZH8V2YsaMiPHMF539c24cYtUOWdGXRftP6I= Received: from SJ0PR03CA0236.namprd03.prod.outlook.com (2603:10b6:a03:39f::31) by DS0PR12MB7608.namprd12.prod.outlook.com (2603:10b6:8:13b::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Tue, 9 Sep 2025 11:47:05 +0000 Received: from SJ1PEPF000023D9.namprd21.prod.outlook.com (2603:10b6:a03:39f:cafe::4e) by SJ0PR03CA0236.outlook.office365.com (2603:10b6:a03:39f::31) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9094.22 via Frontend Transport; Tue, 9 Sep 2025 11:47:04 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF000023D9.mail.protection.outlook.com (10.167.244.74) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9137.0 via Frontend Transport; Tue, 9 Sep 2025 11:47:04 +0000 Received: from tapi.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 9 Sep 2025 04:46:50 -0700 From: Swapnil Sapkal To: , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , James Clark Subject: [PATCH RESEND v4 08/11] perf sched stats: Add support for live mode Date: Tue, 9 Sep 2025 11:42:24 +0000 Message-ID: <20250909114227.58802-9-swapnil.sapkal@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250909114227.58802-1-swapnil.sapkal@amd.com> References: <20250909114227.58802-1-swapnil.sapkal@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000023D9:EE_|DS0PR12MB7608:EE_ X-MS-Office365-Filtering-Correlation-Id: c4c2056e-2875-4437-d856-08ddef9698cd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|376014|7416014|36860700013|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?5NU5Wjkeliyjqzz0ay06pS/CqUz+EELCCP2xfXbqOKTLbpIiYmPlh0EqlASC?= =?us-ascii?Q?QbNulD3tA1tChfDPaQ00ZGhOmEvkuCs/awu+8A0OqYE/AIUl1xFyNGzvmsik?= =?us-ascii?Q?BTHyQwe9p5aH1XnctRrqVu2H4rN0v13puvJCS/g2A8/AfDVbpYNslB7Y6xn/?= =?us-ascii?Q?qm2Wr6IiL54xEkl3+ZIi60KbnNeztL/wQCSBsO6juBQDI+V1+dd4QeC0Fwnp?= =?us-ascii?Q?9mqr9vY2SiuRtsnONtuSHyc6bEdktZLI8NXWUHEGApqMFBq8pT45Bf7h9s81?= =?us-ascii?Q?uMDbZYOPW7JITbHjOE7QoAXL5jQ6QbUqK3aJdAqwoEP1l5LUoEe/B0g4426s?= =?us-ascii?Q?ZS/RdsiXI5YJtmXng8bw2GAZEcu+AHcIcfSTGf/4zkgJYlY40lMkNPHFyynD?= =?us-ascii?Q?M8YFvGibieWkrtinmrZySxlZ6QwpowjX3lblBWDpF1RaGyFKCYBzV6RECo1U?= =?us-ascii?Q?+Dpa53RP7zPqW72MlIZO1UAzRli/BQsf8CVwzQ5ok3IaiGoyKyno75ONSpiU?= =?us-ascii?Q?33egH7kbCrcdheWS8VEi3pmd5dJnMIHDbtR0wx8eiurSYzTNsd/2MlMfIm4e?= =?us-ascii?Q?Y8g9iewYKjE507WY/RhN5z4wtCI3Nd4dbIwziGdOk1RPrXsZyOf7dtznxmer?= =?us-ascii?Q?rL7SwmtZHHnp47+SwWNsBvDAG/q3muurCTmvo1uuIOPjCLfRVFFmChm4S+21?= =?us-ascii?Q?O8KRGLiFLDQdANt/O2tAb0nof0mMlE54k8lP1u10fb0GUYpNjnqM3sPjvXr+?= =?us-ascii?Q?FkknzgC1y1eZFGnK3FRxYRWFo1ohp5VGSlULCwRa4rGidI3njV+GB5Fklh6L?= =?us-ascii?Q?SGIQupnD0TPXbjqf3D6kiA/0zaY96NYvLKQgvh7brFjdenf6rrYqC3slofa7?= =?us-ascii?Q?tK609nGN2/hab0TZAiztydhp8vKfIATdtYKeZjipA4G8bD12bq4rrAi2yCgV?= =?us-ascii?Q?krgHEdi2Jb5ro2I9LCNeiRD8R2LUm5COHMWASs/Ri/deukbFqZWKqspcRK2M?= =?us-ascii?Q?o3bWtvZR8bYDA93d4xE7Mr0DuhkXieumKGcJjEJr7KXa18kKcyZ7Qvy3LhHa?= =?us-ascii?Q?rPSBU+8w10yujQ9fGyGYv2OG2y9dqFck1GVb3wrqsvQVmSlyyvN2m6sVOkMx?= =?us-ascii?Q?EqPviMofBfwmNBSNdm08tnp+g4o2eCCfzlt8XbhVLP9bUVBRNE8cmfGV2/LM?= =?us-ascii?Q?Y29O6Rxa8Tc2Kyp4zFAhANUtgIwd0bIbIwcnEyFaTYqJe0I2imw44SzHSdpx?= =?us-ascii?Q?ny0fItEqq9L+qyrJPgvqQvWa2AD4IKDkxWvzRI76uYIHfXQP3u1TB82R7C4F?= =?us-ascii?Q?YRTan1uqO0zy9ukVqYLYPUdKP4nDw8C5Yu37HOnyt4xVpGPbiLjkNY5yerND?= =?us-ascii?Q?RE2PXMRz/6lLzCO8wdZkhXBw+07XKe1q/Oh1L7/ICHQEP9cT8GQqubT3XRTI?= =?us-ascii?Q?RlvX+KxfN7oFcnstjl5akZ2HSSbNcJIqKhCHUCgNMDjlbQ+OTjDkYVV7iVxM?= =?us-ascii?Q?SUjFdT14D3GHUGvQdauTPJosknwVmLY+zpIh?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(376014)(7416014)(36860700013)(1800799024);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2025 11:47:04.2890 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c4c2056e-2875-4437-d856-08ddef9698cd X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000023D9.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7608 Content-Type: text/plain; charset="utf-8" The live mode works similar to simple `perf stat` command, by profiling the target and printing results on the terminal as soon as the target finishes. Example usage: # perf sched stats -- sleep 10 Co-developed-by: Ravi Bangoria Signed-off-by: Ravi Bangoria Tested-by: James Clark Signed-off-by: Swapnil Sapkal --- tools/perf/builtin-sched.c | 99 +++++++++++++++++++++++++++++++++++++- tools/perf/util/header.c | 6 +-- tools/perf/util/header.h | 5 ++ 3 files changed, 106 insertions(+), 4 deletions(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index e23018798f5b..ce04349cc4ff 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -4439,6 +4439,103 @@ static int perf_sched__schedstat_report(struct perf= _sched *sched) return err; } =20 +static int process_synthesized_event_live(const struct perf_tool *tool __m= aybe_unused, + union perf_event *event, + struct perf_sample *sample __maybe_unused, + struct machine *machine __maybe_unused) +{ + return perf_sched__process_schedstat(NULL, event); +} + +static int perf_sched__schedstat_live(struct perf_sched *sched, + int argc, const char **argv) +{ + struct cpu_domain_map **cd_map =3D NULL; + struct target target =3D {}; + u32 __maybe_unused md; + struct evlist *evlist; + u32 nr =3D 0, sv; + int reset =3D 0; + int err =3D 0; + + signal(SIGINT, sighandler); + signal(SIGCHLD, sighandler); + signal(SIGTERM, sighandler); + + evlist =3D evlist__new(); + if (!evlist) + return -ENOMEM; + + /* + * `perf sched schedstat` does not support workload profiling (-p pid) + * since /proc/schedstat file contains cpu specific data only. Hence, a + * profile target is either set of cpus or systemwide, never a process. + * Note that, although `-- ` is supported, profile data are + * still cpu/systemwide. + */ + if (cpu_list) + target.cpu_list =3D cpu_list; + else + target.system_wide =3D true; + + if (argc) { + err =3D evlist__prepare_workload(evlist, &target, argv, false, NULL); + if (err) + goto out; + } + + err =3D evlist__create_maps(evlist, &target); + if (err < 0) + goto out; + + user_requested_cpus =3D evlist->core.user_requested_cpus; + + err =3D perf_event__synthesize_schedstat(&(sched->tool), + process_synthesized_event_live, + user_requested_cpus); + if (err < 0) + goto out; + + err =3D enable_sched_schedstats(&reset); + if (err < 0) + goto out; + + if (argc) + evlist__start_workload(evlist); + + /* wait for signal */ + pause(); + + if (reset) { + err =3D disable_sched_schedstat(); + if (err < 0) + goto out; + } + + err =3D perf_event__synthesize_schedstat(&(sched->tool), + process_synthesized_event_live, + user_requested_cpus); + if (err) + goto out; + + setup_pager(); + + if (list_empty(&cpu_head)) { + pr_err("Data is not available\n"); + err =3D -1; + goto out; + } + + nr =3D cpu__max_present_cpu().cpu; + cd_map =3D build_cpu_domain_map(&sv, &md, nr); + show_schedstat_data(&cpu_head, cd_map); +out: + free_cpu_domain_info(cd_map, sv, nr); + free_schedstat(&cpu_head); + evlist__delete(evlist); + return err; +} + static bool schedstat_events_exposed(void) { /* @@ -4764,7 +4861,7 @@ int cmd_sched(int argc, const char **argv) stats_usage, 0); return perf_sched__schedstat_report(&sched); } - usage_with_options(stats_usage, stats_options); + return perf_sched__schedstat_live(&sched, argc, argv); } else { usage_with_options(sched_usage, sched_options); } diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 7ff7434bac2c..e8f4d00b5261 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -1621,7 +1621,7 @@ static int write_pmu_caps(struct feat_fd *ff, return 0; } =20 -static void free_cpu_domain_info(struct cpu_domain_map **cd_map, u32 sched= stat_version, u32 nr) +void free_cpu_domain_info(struct cpu_domain_map **cd_map, u32 schedstat_ve= rsion, u32 nr) { for (u32 i =3D 0; i < nr; i++) { if (cd_map[i]->domains) { @@ -1641,8 +1641,8 @@ static void free_cpu_domain_info(struct cpu_domain_ma= p **cd_map, u32 schedstat_v free(cd_map); } =20 -static struct cpu_domain_map **build_cpu_domain_map(u32 *schedstat_versio= n, u32 *max_sched_domains, - u32 nr) +struct cpu_domain_map **build_cpu_domain_map(u32 *schedstat_version, u32 = *max_sched_domains, + u32 nr) { struct domain_info *domain_info; struct cpu_domain_map **cd_map; diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h index edcb95e0dc49..d67d26dad88e 100644 --- a/tools/perf/util/header.h +++ b/tools/perf/util/header.h @@ -209,4 +209,9 @@ char *get_cpuid_str(struct perf_cpu cpu); char *get_cpuid_allow_env_override(struct perf_cpu cpu); =20 int strcmp_cpuid_str(const char *s1, const char *s2); + +struct cpu_domain_map **build_cpu_domain_map(u32 *schedstat_version, u32 = *max_sched_domains, + u32 nr); + +void free_cpu_domain_info(struct cpu_domain_map **cd_map, u32 schedstat_ve= rsion, u32 nr); #endif /* __PERF_HEADER_H */ --=20 2.43.0 From nobody Thu Oct 2 23:53:20 2025 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2079.outbound.protection.outlook.com [40.107.93.79]) (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 5290C2F4A12; Tue, 9 Sep 2025 11:47:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.93.79 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418466; cv=fail; b=qmVEg5GK+VwsFD/gK7KBNvb+njvoG/UbJvM5AqXIMq3ZZGuyCB0iLCzvUvW7DXEE8oCnUmv9bCGFLVta8D4tkrOJMaaboqkRIbEcFTcQ9TeQ8PK/qgCPhbrQ3+b0xM796ZLcYYBl+C5l5nh/CvXZMLQlG5auP8N65EFf9a9NggE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418466; c=relaxed/simple; bh=SBsqX4CeInj4sWuL7kZmsQuwMKuDg09fvMlG1BX+VWo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ZHA61d2ocbIY0/zJMDG4psKe92rIiDe9if17y7ULUKjlmHq+iwniVYuCeFxjJgcwVONn5l1CId8saVVbLZejAK6rD47j1JK66/BuvL5XVBpw1o0tDl/wamWUFn0GbhQoMF2nSCb/Gu69iKJM47oPBnP9sbykvAjHIf/jb9oOJ0M= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=iOoGB6BR; arc=fail smtp.client-ip=40.107.93.79 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="iOoGB6BR" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=h4l/TZLwJsID4hq9RiTQrkSGFFoGWGCHeQ6Z7bc5WIFZvep5EkPUSsGE4KXJAmqVASswfOVo3s8HTXx/JmIZgi3+aK3YV/uUBBcEMU0PNX0uRYZEmi5QlHWkSMX26TcfzYfn54eJVSNDneVkV5uGtwrw/1NC3XO0D75xh51vGI9Ui0afaWUmkQuMCWKnVwvwLQ/cuoTKS9794z11nWmr2MAcVWKCpvkjtPl/L44tlyEzdyfsxqCbyfkaEXhbARVxh0XA2jpckTPDDDaHnkl4Br4XYu+bVcdM87A63zGUYef6QhDexsgRMEaM3VzdSoZQVMgqOh0stuf5y/eYDH4auA== 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=WIE5Gw/1BIn5T1u0lQSCQIA2+Z8heWmoReYZku0YHWc=; b=r/reND5wuzAj/ivyfKbESKguNImo/rWPenSMveGb7OTDYnMgv2GlUCC7aiDVcXk+aUJ7oiOSOLVjr4MS/PHi4Qufhp6NL+A9ReTGIl9Jd2Y5XeaVgO9vmijPU1+NdvqDgSV/2Mw+m9feMB7CnUILg2BZxEfz89TW78dMur5PK5QqHcKklimFCmEVfAqoWxPCF3vT8/Hm0lIi2ZzRiNZsZWCdBehVfearXZhAf02EKGK0QCYl/bXuttiUREXpw8moMy1Ff16lgdExxji3z9S9wKA9a/nncD1n83ETpCFNAcx0rYI/9vPxss7kGS/WL6Ehsx4nOuSvHoYEur792n88mA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=infradead.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=WIE5Gw/1BIn5T1u0lQSCQIA2+Z8heWmoReYZku0YHWc=; b=iOoGB6BRg2waJyxRm/rJk1HIIEVFlU+uomdRv2XMDOwnnq3NTlygGT2D/DMZpw07ViM29+g0ohUYs/uopYNXTwI/9BFHDwrLrDXY44bPhXlfXuetxgsVznp9oKsgFOhO1HSn/43YVAXBZEMxEpOt+wh6mj/9Oi1zo8OxkiIyjc0= Received: from MW4PR03CA0252.namprd03.prod.outlook.com (2603:10b6:303:b4::17) by DS0PR12MB6583.namprd12.prod.outlook.com (2603:10b6:8:d1::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Tue, 9 Sep 2025 11:47:35 +0000 Received: from SJ1PEPF000023D4.namprd21.prod.outlook.com (2603:10b6:303:b4:cafe::69) by MW4PR03CA0252.outlook.office365.com (2603:10b6:303:b4::17) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9094.22 via Frontend Transport; Tue, 9 Sep 2025 11:47:35 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF000023D4.mail.protection.outlook.com (10.167.244.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9137.0 via Frontend Transport; Tue, 9 Sep 2025 11:47:33 +0000 Received: from tapi.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 9 Sep 2025 04:47:18 -0700 From: Swapnil Sapkal To: , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH RESEND v4 09/11] perf sched stats: Add support for diff subcommand Date: Tue, 9 Sep 2025 11:42:25 +0000 Message-ID: <20250909114227.58802-10-swapnil.sapkal@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250909114227.58802-1-swapnil.sapkal@amd.com> References: <20250909114227.58802-1-swapnil.sapkal@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000023D4:EE_|DS0PR12MB6583:EE_ X-MS-Office365-Filtering-Correlation-Id: 74eab9ac-639a-48a7-ab48-08ddef96aa6f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|376014|7416014|1800799024|36860700013; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?3H+sQAQCioVPwkVyMMa/63R5u5naTVIV5WGTjEcM+KoMMiO+erNB/BTN2koZ?= =?us-ascii?Q?GBlZQaHTfn3SGlZDos932sEZ41occkt3ZO+GedmngRJ7mwyid3P6qvZZM1Vq?= =?us-ascii?Q?yi7w1BB/cQeN7dcoVs3hF8V0hQvqKoClsU4d+WXmdZqz1kO3j1Qyt4EqoIN9?= =?us-ascii?Q?wXiF/qNHDXk2ezh9TQK4oEZyuOIXP5emYD2vov8hyHALGIXSqRozeXIgjGbW?= =?us-ascii?Q?PCSmzVI8DoLx4wsL5ghTg99+/ae9i8ViNvUnQZwDcHFUyJz69pBIK/wOhLfI?= =?us-ascii?Q?moJQx8TGvQXG0otlRZjrOu7yJrFTF6cloKOh/CiyU+uswRej/6xqAC4rii2b?= =?us-ascii?Q?b9++UpPKmPTA/tFbTXwyu4V7e5lxeaDn+dqxsWYUFYQLNoyuAiEz8OJxwZfI?= =?us-ascii?Q?eFWKYQ7wOvzBVXV2pFYxVYeaGn1XLwZjZU6XVh6Oweeip5l/WTHxk8Y61r0y?= =?us-ascii?Q?iAI0wZopcO+8ydFtALQ5F49bTjBRIFU58CzvYa+F+JiAjq/lkqP8T9946K4i?= =?us-ascii?Q?+DyQuVWez1PVocjbx5a6Hfrdwt2gwBIGAStDbQR0t6uN2nb4la5ZTj0f6eGY?= =?us-ascii?Q?xHHHS66ZHwnI29/KOpmFuT7hj9ixa6OQ2p9K6WdW5ULmB29r/ducjewBzfu3?= =?us-ascii?Q?hlocSajv4ciHVG5bhoJbqL/WqhLinc27EB+vvuIcpIaycF+NGyPv6HvVK9yJ?= =?us-ascii?Q?lTN84tO2/lTEzs+VXpjcWIZU7Fmd48dBVYML3el6lXlHM0QKortqOFcfhN4L?= =?us-ascii?Q?882e/uV1G6csWIeHfDQoC7XKmdZymBhUf92EeYo2j54hW4D4oPqThnXhqCN/?= =?us-ascii?Q?o7Rfqndh8M1FHtTb/1Z3heZCmL9fMvHttPV9EPqRsIDNrD6fl1KCBjE1rlcJ?= =?us-ascii?Q?9X7sXnLV2yZIwfzQRc987xbHyR0exrwEI8JAf5vq6qnjUdqlbwiPbrvz7f6a?= =?us-ascii?Q?Etn4hCvyvEqjxjKmbsIuMsHIIgz9Xd50adW1iRRaXne/p8QBZtgZoM78fO95?= =?us-ascii?Q?rYQt8CKDgs4uPGNqnlYxt98WH3laIkvTmW/xZ6REL8K2JVcyfAY2uleZ3QcO?= =?us-ascii?Q?Q/q+eJab/Kd9VCCWpDVqgiNlY5iadV9hKwaOjiek/o/wGgi1wBvrVr/bFFbM?= =?us-ascii?Q?Og7hKkp3criTSADp2kQG9HgoLLbO0gcJYr704mgHQbbGq+TicBbtt2+dpMA3?= =?us-ascii?Q?AhNaUdxYgqBgUFgO/KPuh48kieXtVIP74YcWwJonEzI3k869dhNxTk4QNHqX?= =?us-ascii?Q?kMjvZG8bhIC9V0uwiXiPCdXRCEgSz4oXaFwgsoedMUpPgECJmHOIutGQyBSd?= =?us-ascii?Q?3NhP4rrPNx0majdoST3m7JDbisUuSnFtpfNEmvrYbFWCgGeK3OxMK8rJ1NFG?= =?us-ascii?Q?sbCHZPZ0CTkLYiGOL0XNsqCfU8qAVyOuPeSoCyh8iLaFhB9BSPtH86XfaPmJ?= =?us-ascii?Q?G6VYKR1XPFKRlfBfIwGOItagrNvSvcQ6wB/J6zjVr7VeH70p03Sr2r8siGxI?= =?us-ascii?Q?11ShGQX3Mzln5FhgRci6QVcsbfFEsdpzFKfz?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(376014)(7416014)(1800799024)(36860700013);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2025 11:47:33.8717 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 74eab9ac-639a-48a7-ab48-08ddef96aa6f X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000023D4.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB6583 Content-Type: text/plain; charset="utf-8" `perf sched stats diff` subcommand will take two perf.data files as an input and it will print the diff between the two perf.data files. The default input to this subcommnd is perf.data.old and perf.data. Example usage: # perf sched stats diff sample1.data sample2.data Signed-off-by: Ravi Bangoria Signed-off-by: Swapnil Sapkal --- tools/perf/builtin-sched.c | 315 ++++++++++++++++++++++++++++++------- 1 file changed, 258 insertions(+), 57 deletions(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index ce04349cc4ff..ebce69180330 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -3996,29 +3996,46 @@ static void store_schedstat_domain_diff(struct sche= dstat_domain *after_workload) #undef DOMAIN_FIELD } =20 -static inline void print_cpu_stats(struct perf_record_schedstat_cpu *cs) +#define PCT_CHNG(_x, _y) ((_x) ? ((double)((double)(_y) - (_x)) / (= _x)) * 100 : 0.0) +static inline void print_cpu_stats(struct perf_record_schedstat_cpu *cs1, + struct perf_record_schedstat_cpu *cs2) { - printf("%-65s %12s %12s\n", "DESC", "COUNT", "PCT_CHANGE"); - printf("%.*s\n", 100, graph_dotted_line); + printf("%-65s ", "DESC"); + if (!cs2) + printf("%12s %12s", "COUNT", "PCT_CHANGE"); + else + printf("%12s %11s %12s %14s %10s", "COUNT1", "COUNT2", "PCT_CHANGE", + "PCT_CHANGE1", "PCT_CHANGE2"); + + printf("\n"); + print_separator(100, "", 0); =20 #define CALC_PCT(_x, _y) ((_y) ? ((double)(_x) / (_y)) * 100 : 0.0) =20 -#define CPU_FIELD(_type, _name, _desc, _format, _is_pct, _pct_of, _ver) \ - do { \ - printf("%-65s: " _format, verbose_field ? _desc : #_name, \ - cs->_ver._name); \ - if (_is_pct) { \ - printf(" ( %8.2lf%% )", \ - CALC_PCT(cs->_ver._name, cs->_ver._pct_of)); \ - } \ - printf("\n"); \ +#define CPU_FIELD(_type, _name, _desc, _format, _is_pct, _pct_of, _ver) \ + do { \ + printf("%-65s: " _format, verbose_field ? _desc : #_name, \ + cs1->_ver._name); \ + if (!cs2) { \ + if (_is_pct) \ + printf(" ( %8.2lf%% )", \ + CALC_PCT(cs1->_ver._name, cs1->_ver._pct_of)); \ + } else { \ + printf("," _format " | %8.2lf%% |", cs2->_ver._name, \ + PCT_CHNG(cs1->_ver._name, cs2->_ver._name)); \ + if (_is_pct) \ + printf(" ( %8.2lf%%, %8.2lf%% )", \ + CALC_PCT(cs1->_ver._name, cs1->_ver._pct_of), \ + CALC_PCT(cs2->_ver._name, cs2->_ver._pct_of)); \ + } \ + printf("\n"); \ } while (0) =20 - if (cs->version =3D=3D 15) { + if (cs1->version =3D=3D 15) { #include - } else if (cs->version =3D=3D 16) { + } else if (cs1->version =3D=3D 16) { #include - } else if (cs->version =3D=3D 17) { + } else if (cs1->version =3D=3D 17) { #include } =20 @@ -4026,10 +4043,17 @@ static inline void print_cpu_stats(struct perf_reco= rd_schedstat_cpu *cs) #undef CALC_PCT } =20 -static inline void print_domain_stats(struct perf_record_schedstat_domain = *ds, - __u64 jiffies) +static inline void print_domain_stats(struct perf_record_schedstat_domain = *ds1, + struct perf_record_schedstat_domain *ds2, + __u64 jiffies1, __u64 jiffies2) { - printf("%-65s %12s %14s\n", "DESC", "COUNT", "AVG_JIFFIES"); + printf("%-65s ", "DESC"); + if (!ds2) + printf("%12s %14s", "COUNT", "AVG_JIFFIES"); + else + printf("%12s %11s %12s %16s %12s", "COUNT1", "COUNT2", "PCT_CHANGE", + "AVG_JIFFIES1", "AVG_JIFFIES2"); + printf("\n"); =20 #define DOMAIN_CATEGORY(_desc) \ do { \ @@ -4044,28 +4068,54 @@ static inline void print_domain_stats(struct perf_r= ecord_schedstat_domain *ds, #define DOMAIN_FIELD(_type, _name, _desc, _format, _is_jiffies, _ver) \ do { \ printf("%-65s: " _format, verbose_field ? _desc : #_name, \ - ds->_ver._name); \ - if (_is_jiffies) { \ - printf(" $ %11.2Lf $", \ - CALC_AVG(jiffies, ds->_ver._name)); \ + ds1->_ver._name); \ + if (!ds2) { \ + if (_is_jiffies) \ + printf(" $ %11.2Lf $", \ + CALC_AVG(jiffies1, ds1->_ver._name)); \ + } else { \ + printf("," _format " | %8.2lf%% |", ds2->_ver._name, \ + PCT_CHNG(ds1->_ver._name, ds2->_ver._name)); \ + if (_is_jiffies) \ + printf(" $ %11.2Lf, %11.2Lf $", \ + CALC_AVG(jiffies1, ds1->_ver._name), \ + CALC_AVG(jiffies2, ds2->_ver._name)); \ } \ printf("\n"); \ } while (0) =20 #define DERIVED_CNT_FIELD(_name, _desc, _format, _x, _y, _z, _ver) \ - printf("*%-64s: " _format "\n", verbose_field ? _desc : #_name, \ - (ds->_ver._x) - (ds->_ver._y) - (ds->_ver._z)) + do { \ + __u32 t1 =3D ds1->_ver._x - ds1->_ver._y - ds1->_ver._z; \ + printf("*%-64s: " _format, verbose_field ? _desc : #_name, t1); \ + if (ds2) { \ + __u32 t2 =3D ds2->_ver._x - ds2->_ver._y - ds2->_ver._z; \ + printf("," _format " | %8.2lf%% |", t2, \ + PCT_CHNG(t1, t2)); \ + } \ + printf("\n"); \ + } while (0) =20 #define DERIVED_AVG_FIELD(_name, _desc, _format, _x, _y, _z, _w, _ver) \ - printf("*%-64s: " _format "\n", verbose_field ? _desc : #_name, \ - CALC_AVG(ds->_ver._w, \ - ((ds->_ver._x) - (ds->_ver._y) - (ds->_ver._z)))) + do { \ + __u32 t1 =3D ds1->_ver._x - ds1->_ver._y - ds1->_ver._z; \ + printf("*%-64s: " _format, verbose_field ? _desc : #_name, \ + CALC_AVG(ds1->_ver._w, t1)); \ + if (ds2) { \ + __u32 t2 =3D ds2->_ver._x - ds2->_ver._y - ds2->_ver._z; \ + printf("," _format " | %8.2Lf%% |", \ + CALC_AVG(ds2->_ver._w, t2), \ + PCT_CHNG(CALC_AVG(ds1->_ver._w, t1), \ + CALC_AVG(ds2->_ver._w, t2))); \ + } \ + printf("\n"); \ + } while (0) =20 - if (ds->version =3D=3D 15) { + if (ds1->version =3D=3D 15) { #include - } else if (ds->version =3D=3D 16) { + } else if (ds1->version =3D=3D 16) { #include - } else if (ds->version =3D=3D 17) { + } else if (ds1->version =3D=3D 17) { #include } =20 @@ -4075,6 +4125,7 @@ static inline void print_domain_stats(struct perf_rec= ord_schedstat_domain *ds, #undef CALC_AVG #undef DOMAIN_CATEGORY } +#undef PCT_CHNG =20 static void summarize_schedstat_cpu(struct schedstat_cpu *summary_cpu, struct schedstat_cpu *cptr, @@ -4219,13 +4270,16 @@ static void print_field_description(struct schedsta= t_cpu *cptr) #undef DOMAIN_FIELD } =20 -static int show_schedstat_data(struct list_head *head, struct cpu_domain_m= ap **cd_map) +static int show_schedstat_data(struct list_head *head1, struct cpu_domain_= map **cd_map1, + struct list_head *head2, struct cpu_domain_map **cd_map2, + bool summary_only) { - struct schedstat_cpu *cptr =3D list_first_entry(head, struct schedstat_cp= u, cpu_list); - __u64 jiffies =3D cptr->cpu_data->timestamp; - struct perf_record_schedstat_domain *ds; - struct perf_record_schedstat_cpu *cs; - struct schedstat_domain *dptr; + struct schedstat_cpu *cptr1 =3D list_first_entry(head1, struct schedstat_= cpu, cpu_list); + struct perf_record_schedstat_domain *ds1 =3D NULL, *ds2 =3D NULL; + struct perf_record_schedstat_cpu *cs1 =3D NULL, *cs2 =3D NULL; + struct schedstat_domain *dptr1 =3D NULL, *dptr2 =3D NULL; + struct schedstat_cpu *cptr2 =3D NULL; + __u64 jiffies1 =3D 0, jiffies2 =3D 0; bool is_summary =3D true; int ret =3D 0; =20 @@ -4239,53 +4293,103 @@ static int show_schedstat_data(struct list_head *h= ead, struct cpu_domain_map **c =20 if (!verbose_field) { print_separator(100, "", 0); - print_field_description(cptr); + print_field_description(cptr1); } =20 print_separator(100, "", 0); printf("\n"); =20 - printf("%-65s: %11llu\n", "Time elapsed (in jiffies)", jiffies); + printf("%-65s: ", "Time elapsed (in jiffies)"); + jiffies1 =3D cptr1->cpu_data->timestamp; + printf("%11llu", jiffies1); + if (head2) { + cptr2 =3D list_first_entry(head2, struct schedstat_cpu, cpu_list); + jiffies2 =3D cptr2->cpu_data->timestamp; + printf(",%11llu", jiffies2); + } + printf("\n"); + print_separator(100, "", 0); =20 - ret =3D get_all_cpu_stats(head); + ret =3D get_all_cpu_stats(head1); + if (cptr2) + ret =3D get_all_cpu_stats(head2); + + list_for_each_entry(cptr1, head1, cpu_list) { + struct cpu_domain_map *cd_info1 =3D NULL, *cd_info2 =3D NULL; + + cs1 =3D cptr1->cpu_data; + cd_info1 =3D cd_map1[cs1->cpu]; + if (cptr2) { + cs2 =3D cptr2->cpu_data; + cd_info2 =3D cd_map2[cs2->cpu]; + dptr2 =3D list_first_entry(&cptr2->domain_head, struct schedstat_domain, + domain_list); + } + + if (cs2 && cs1->cpu !=3D cs2->cpu) { + pr_err("Failed because matching cpus not found for diff\n"); + return -1; + } + + if (cd_info2 && cd_info1->nr_domains !=3D cd_info2->nr_domains) { + pr_err("Failed because nr_domains is not same for cpus\n"); + return -1; + } =20 - list_for_each_entry(cptr, head, cpu_list) { - cs =3D cptr->cpu_data; printf("\n"); print_separator(100, "", 0); =20 if (is_summary) printf("CPU \n"); else - printf("CPU %d\n", cs->cpu); + printf("CPU %d\n", cs1->cpu); =20 print_separator(100, "", 0); - print_cpu_stats(cs); + print_cpu_stats(cs1, cs2); print_separator(100, "", 0); =20 - list_for_each_entry(dptr, &cptr->domain_head, domain_list) { - struct domain_info *dinfo; + list_for_each_entry(dptr1, &cptr1->domain_head, domain_list) { + struct domain_info *dinfo1 =3D NULL, *dinfo2 =3D NULL; + + ds1 =3D dptr1->domain_data; + dinfo1 =3D cd_info1->domains[ds1->domain]; + if (dptr2) { + ds2 =3D dptr2->domain_data; + dinfo2 =3D cd_info2->domains[ds2->domain]; + } + + if (dinfo2 && dinfo1->domain !=3D dinfo2->domain) { + pr_err("Failed because matching domain not found for diff\n"); + return -1; + } =20 - ds =3D dptr->domain_data; - dinfo =3D cd_map[ds->cpu]->domains[ds->domain]; if (is_summary) - if (dinfo->dname) - printf("CPU , DOMAIN %s\n", dinfo->dname); + if (dinfo1->dname) + printf("CPU , DOMAIN %s\n", dinfo1->dname); else - printf("CPU , DOMAIN %d\n", dinfo->domain); + printf("CPU , DOMAIN %d\n", dinfo1->domain); else { - if (dinfo->dname) - printf("CPU %d, DOMAIN %s CPUS ", cs->cpu, dinfo->dname); + if (dinfo1->dname) + printf("CPU %d, DOMAIN %s CPUS ", cs1->cpu, dinfo1->dname); else - printf("CPU %d, DOMAIN %d CPUS ", cs->cpu, dinfo->domain); + printf("CPU %d, DOMAIN %d CPUS ", cs1->cpu, dinfo1->domain); =20 - printf("%s\n", dinfo->cpulist); + printf("%s\n", dinfo1->cpulist); } print_separator(100, "", 0); - print_domain_stats(ds, jiffies); + print_domain_stats(ds1, ds2, jiffies1, jiffies2); print_separator(100, "", 0); + + if (dptr2) + dptr2 =3D list_next_entry(dptr2, domain_list); } + if (summary_only) + break; + + if (cptr2) + cptr2 =3D list_next_entry(cptr2, cpu_list); + is_summary =3D false; } return ret; @@ -4430,7 +4534,7 @@ static int perf_sched__schedstat_report(struct perf_s= ched *sched) } =20 cd_map =3D session->header.env.cpu_domain; - err =3D show_schedstat_data(&cpu_head, cd_map); + err =3D show_schedstat_data(&cpu_head, cd_map, NULL, NULL, false); } =20 out: @@ -4439,6 +4543,98 @@ static int perf_sched__schedstat_report(struct perf_= sched *sched) return err; } =20 +static int perf_sched__schedstat_diff(struct perf_sched *sched, + int argc, const char **argv) +{ + struct list_head *cpu_head_ses0 =3D NULL, *cpu_head_ses1 =3D NULL; + struct cpu_domain_map **cd_map0 =3D NULL, **cd_map1 =3D NULL; + struct perf_session *session[2]; + struct perf_data data[2]; + int ret =3D 0, err =3D 0; + static const char *defaults[] =3D { + "perf.data.old", + "perf.data", + }; + + if (argc) { + if (argc =3D=3D 1) + defaults[1] =3D argv[0]; + else if (argc =3D=3D 2) { + defaults[0] =3D argv[0]; + defaults[1] =3D argv[1]; + } else { + pr_err("perf sched stats diff is not supported with more than 2 files.\= n"); + goto out_ret; + } + } + + sched->tool.schedstat_cpu =3D perf_sched__process_schedstat; + sched->tool.schedstat_domain =3D perf_sched__process_schedstat; + + data[0].path =3D defaults[0]; + data[0].mode =3D PERF_DATA_MODE_READ; + session[0] =3D perf_session__new(&data[0], &sched->tool); + if (IS_ERR(session[0])) { + ret =3D PTR_ERR(session[0]); + pr_err("Failed to open %s\n", data[0].path); + goto out_delete_ses0; + } + + err =3D perf_session__process_events(session[0]); + if (err) + goto out_delete_ses0; + + cd_map0 =3D session[0]->header.env.cpu_domain; + cpu_head_ses0 =3D &cpu_head; + after_workload_flag =3D false; + INIT_LIST_HEAD(&cpu_head); + + data[1].path =3D defaults[1]; + data[1].mode =3D PERF_DATA_MODE_READ; + session[1] =3D perf_session__new(&data[1], &sched->tool); + if (IS_ERR(session[1])) { + ret =3D PTR_ERR(session[1]); + pr_err("Failed to open %s\n", data[1].path); + goto out_delete_ses1; + } + + err =3D perf_session__process_events(session[1]); + if (err) + goto out_delete_ses1; + + cd_map1 =3D session[1]->header.env.cpu_domain; + cpu_head_ses1 =3D &cpu_head; + after_workload_flag =3D false; + setup_pager(); + + if (list_empty(cpu_head_ses1)) { + pr_err("Data is not available\n"); + ret =3D -1; + goto out_delete_ses1; + } + + if (list_empty(cpu_head_ses0)) { + pr_err("Data is not available\n"); + ret =3D -1; + goto out_delete_ses0; + } + + show_schedstat_data(cpu_head_ses0, cd_map0, cpu_head_ses1, cd_map1, true); + +out_delete_ses1: + free_schedstat(cpu_head_ses1); + if (!IS_ERR(session[1])) + perf_session__delete(session[1]); + +out_delete_ses0: + free_schedstat(cpu_head_ses0); + if (!IS_ERR(session[0])) + perf_session__delete(session[0]); + +out_ret: + return ret; +} + static int process_synthesized_event_live(const struct perf_tool *tool __m= aybe_unused, union perf_event *event, struct perf_sample *sample __maybe_unused, @@ -4528,7 +4724,7 @@ static int perf_sched__schedstat_live(struct perf_sch= ed *sched, =20 nr =3D cpu__max_present_cpu().cpu; cd_map =3D build_cpu_domain_map(&sv, &md, nr); - show_schedstat_data(&cpu_head, cd_map); + show_schedstat_data(&cpu_head, cd_map, NULL, NULL, false); out: free_cpu_domain_info(cd_map, sv, nr); free_schedstat(&cpu_head); @@ -4860,6 +5056,11 @@ int cmd_sched(int argc, const char **argv) argc =3D parse_options(argc, argv, stats_options, stats_usage, 0); return perf_sched__schedstat_report(&sched); + } else if (argv[0] && !strcmp(argv[0], "diff")) { + if (argc) + argc =3D parse_options(argc, argv, stats_options, + stats_usage, 0); + return perf_sched__schedstat_diff(&sched, argc, argv); } return perf_sched__schedstat_live(&sched, argc, argv); } else { --=20 2.43.0 From nobody Thu Oct 2 23:53:20 2025 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2051.outbound.protection.outlook.com [40.107.237.51]) (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 A9458322A15; Tue, 9 Sep 2025 11:48:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.237.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418484; cv=fail; b=h8n4vGgcJT/MtFjKDMcAN19Lcz06SkTjIOJ5D1/YQlz1floPLdq8eoxz6Z6zhZB8GhZHkKywJH8fVQgHp84vWL4XQnWL5LZNz9YKkr7S0I77TVoKVUStRqHvTnxx6dzAqowJohB/J4wwWfkmZVURvUtFp2zhhY3rjgq/OWRs3QE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418484; c=relaxed/simple; bh=EfcLY3NDp1lMvkV1Jfb+289V3teDCdYSigVXRWpSN7g=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=sYra9hIaHCJ9jRUkyA9uNaL+4kFmdYYmBD62koAwwRgXVIIpI2IRudxq6orTOL2QhVcpIgdxRehQ7Vudjcy2ErKu2vWHCYUhk8et7bbGFmSlTtbZas3lcZPlFLDQaOk3zjDDOYDHtwBtRNC6YFbHMbDtZsV09s/kwcHLpXaJvTk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=EcHzSlEI; arc=fail smtp.client-ip=40.107.237.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="EcHzSlEI" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xFet5MTkx8fPRLPmqgJAX6bgep/0c+OZon0KFuwrX6XYiUTXjwj04j5RnEboLOUVvAQhs2fx/g5NtHJUYo+QlFAXcyp7Dv9QiKiqbWSlbHtbQ0gadunnoW/mhIrvuyluUUbisFbjviW/WDP5EqBF/8Zz/TZ0M2oaVpcOndaIbnZDDASMB3NyQYJ/a6I7ZSAaX+uahE81YuuDy+HxwZMr/HfdhQcY33pBXQ7zRFzVkBO3JuzMSxvk4ittsZIecqGSEIuNwj3D01A5wbQf7F8nRdeAT9lOxalWzJDoDLj1wkzF4RzkNP/Unq3mvXazTjFf7ZAohogXVQFa9YLS5zHr1Q== 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=ZSWJRxFUSRR/75Ge00v7x+d4eXsR1bungyJ55lp1BIU=; b=tOTpYJVp67qoK9UD8hcdInCpu/EGXKJlrW2hLu0qPwpJ4BMt4SuInatZn3iRgmiJ4tJSuNF8Ds/T9DhcGPYGeZNpjfm9HFw3MqjzyMUjZBW6itzVxxRSMtIA3WO0ZVIzEO1xoLO+3Butfp4Y6+6fbBzF295lhb5n16k/KE0+gLj9ZWn3U/X/tK+OZoq7Cn6AI3LJWGHuAlpp6UOo/8XIEjOIiC+Cg1+XItldYBnRVdRhMHuMRc0C5iWa/l8HLYlHy2QAklNkBBBrsyNB3/gMa4cRL6lmmccSoSqvVyJCDLBo6Nm0u4rtB+pfWRnUH2h6U0WG8FZCl/mwoECMaurcwA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=infradead.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZSWJRxFUSRR/75Ge00v7x+d4eXsR1bungyJ55lp1BIU=; b=EcHzSlEIvhKScNjRLMtqxAVAEOeEjCEmkvQMcnWB3sPxbhjjT3rRqByhTsMZa0aCdyfcu3eMu1BFFrPVovN5s0Kyt/0StHBPwpaNN0q5i2thDMaQWLy5s0x9HSuwMAh2a/7vyHF7b7SaGN3JYsqnUzuHda0ktdfmH08ToXwdhw4= Received: from BYAPR07CA0077.namprd07.prod.outlook.com (2603:10b6:a03:12b::18) by DM4PR12MB6184.namprd12.prod.outlook.com (2603:10b6:8:a6::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Tue, 9 Sep 2025 11:47:58 +0000 Received: from SJ1PEPF000023D3.namprd21.prod.outlook.com (2603:10b6:a03:12b:cafe::fc) by BYAPR07CA0077.outlook.office365.com (2603:10b6:a03:12b::18) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9115.15 via Frontend Transport; Tue, 9 Sep 2025 11:47:57 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF000023D3.mail.protection.outlook.com (10.167.244.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9137.0 via Frontend Transport; Tue, 9 Sep 2025 11:47:57 +0000 Received: from tapi.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 9 Sep 2025 04:47:45 -0700 From: Swapnil Sapkal To: , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH RESEND v4 10/11] perf sched stats: Add basic perf sched stats test Date: Tue, 9 Sep 2025 11:42:26 +0000 Message-ID: <20250909114227.58802-11-swapnil.sapkal@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250909114227.58802-1-swapnil.sapkal@amd.com> References: <20250909114227.58802-1-swapnil.sapkal@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000023D3:EE_|DM4PR12MB6184:EE_ X-MS-Office365-Filtering-Correlation-Id: 17c7c995-c196-49c8-5cb3-08ddef96b89a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|82310400026|376014|1800799024|36860700013; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?IGYnRUBokuvYUP0JmHpQ+wW/fE32vhGM1BDppRSMA7WAkH1E7KqTmmMqsYDf?= =?us-ascii?Q?eAJVTlfn4/CbsUR0XIMDLboTX7yQj4xGsSrnpKUF8fHSP5gS5ld9DzF++HAV?= =?us-ascii?Q?0zST1S9PmI8ChO1/6/r88tkIZFJLQi+6NFIdJgBJ9ZNW+q6GcHxwQIlCzId9?= =?us-ascii?Q?iBJMirvrheZ6QtgSPa5Qy6X+PW4W4mEeELpeyx+o/KZF1WHBdjuEIu2nnsGh?= =?us-ascii?Q?LnHGL69QTHNlsOLmdlZ9/u/E1MUxrt3BYWug0LbPMEqX73Srakbv980YKKQu?= =?us-ascii?Q?FL4DmeGpcpjer2mDXb7wGw70OBgNE1Qaef2xSR1mbQiQo26pOMCdJ1vqn3Kx?= =?us-ascii?Q?1mjZB/2gEDt2BG02eEI4GiNFwK3Znm6mbz1jdsV6DGWXcH4etJqhh6aTW4fW?= =?us-ascii?Q?jsKUKkTYcHljMniIkRVjTEo4e8HB1CYpulCI3TPNIWHkew1LGJAfLa6eoJ4n?= =?us-ascii?Q?Ot0aNXl8AdFUmueA9bITm+2EgSEZnG9oIy84O7rGjKkmaobdfcy9Lh+nFw2P?= =?us-ascii?Q?/I5K7FCZHA4kxGA8wStnxWanlTz9qjvxhhX95jEurVSIVCFmtm/9f6p6s+XA?= =?us-ascii?Q?4RgIM9wy1EyZQ0d78UI23uxBLNhlvKo2Ze2Nhea1UTPX2oN+Joq6Rm8UiZJH?= =?us-ascii?Q?NzSbV8/CW/A9AFLpNnMROZutD0g3TPG4DUeAhhRwkG6y3B//zth9QF009YjD?= =?us-ascii?Q?ZmoLK/JfY5jtExVQ9R3vKVO8zcxAx6wT3A+I8BHGUnWQ5oVIHc6INa9qNzIb?= =?us-ascii?Q?wkXh+NXI7CgHleGwB+paF/kqLn1Cf/c1PO4dtRnAfpti+Um4RlTD2x4Y/ODi?= =?us-ascii?Q?S3YaDtqfUNGUoRlNRvk5C2UOzfwa35XGOy04qe/nNEYrjzcN5PF3kBRdXAfx?= =?us-ascii?Q?mFjgeF/52fu26IjCD+nu2W/u0CMKLSPsn0WvgT/BrI7vyq4mnpSPVeOm/ZIe?= =?us-ascii?Q?eJ16FO8BgBM+UZIhQhKhxhPAMr+qrnAzjYL42yYb8GkTYUfmr+8yK0MpbznI?= =?us-ascii?Q?87hmhT3GEXPLqahZnejHCWvrQxd4mQM5OJDx9YnAKO98WfnCDF72wwrZocyn?= =?us-ascii?Q?BW1PrZ5DKYVyx1IfbFOBsheA9qOuTY5akY/YxoZ6bCeGsay4BoCc35fJyLPH?= =?us-ascii?Q?QuNiNMz4LV9U+TkT9J0CdFyOeCA4MNbX4wLk9O9H4AWTOrWmweIGbga3N/gg?= =?us-ascii?Q?E4Bqdf5D4/Pp9zXmWOTs3NQRWP6fj9SgR89D/f/g1jBnhX5ego0BSwmQe/aF?= =?us-ascii?Q?wG11tkgEpi6yT6Qotm2nKOfVdJ+TsmOQnBFPAGUD9/1SuCbsmEo05HHjSdZQ?= =?us-ascii?Q?R2q20kxbF3oanEB65A52w1qAmHAVEZq6NUbPnPijKjyadJvg5OzF0fDujoMs?= =?us-ascii?Q?8Jo5RIG4XARCGdG7UQwwgiXV8iUlTOBNVq5GDoSAyCgaGKNNSMiesQfJ8dNY?= =?us-ascii?Q?6q+Dul/nKs2ZECtvJ6oTUoBdHXcuYzf3L/ENl10jfEeQ5Kk/6POb37vF87GH?= =?us-ascii?Q?erPzDxOOq12hXW/GfpGwsS7G3+5N0YfZ5w4s?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(7416014)(82310400026)(376014)(1800799024)(36860700013);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2025 11:47:57.6397 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 17c7c995-c196-49c8-5cb3-08ddef96b89a X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000023D3.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB6184 Content-Type: text/plain; charset="utf-8" Add basic test for perf sched stats {record|report|diff} subcommand. Signed-off-by: Swapnil Sapkal --- tools/perf/tests/shell/perf_sched_stats.sh | 64 ++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 tools/perf/tests/shell/perf_sched_stats.sh diff --git a/tools/perf/tests/shell/perf_sched_stats.sh b/tools/perf/tests/= shell/perf_sched_stats.sh new file mode 100755 index 000000000000..2b1410b050d0 --- /dev/null +++ b/tools/perf/tests/shell/perf_sched_stats.sh @@ -0,0 +1,64 @@ +#!/bin/sh +# perf sched stats tests +# SPDX-License-Identifier: GPL-2.0 + +set -e + +err=3D0 +test_perf_sched_stats_record() { + echo "Basic perf sched stats record test" + if ! perf sched stats record true 2>&1 | \ + grep -E -q "[ perf sched stats: Wrote samples to perf.data ]" + then + echo "Basic perf sched stats record test [Failed]" + err=3D1 + return + fi + echo "Basic perf sched stats record test [Success]" +} + +test_perf_sched_stats_report() { + echo "Basic perf sched stats report test" + perf sched stats record true > /dev/null + if ! perf sched stats report 2>&1 | grep -E -q "Description" + then + echo "Basic perf sched stats report test [Failed]" + err=3D1 + rm perf.data + return + fi + rm perf.data + echo "Basic perf sched stats report test [Success]" +} + +test_perf_sched_stats_live() { + echo "Basic perf sched stats live mode test" + if ! perf sched stats true 2>&1 | grep -E -q "Description" + then + echo "Basic perf sched stats live mode test [Failed]" + err=3D1 + return + fi + echo "Basic perf sched stats live mode test [Success]" +} + +test_perf_sched_stats_diff() { + echo "Basic perf sched stats diff test" + perf sched stats record true > /dev/null + perf sched stats record true > /dev/null + if ! perf sched stats diff > /dev/null + then + echo "Basic perf sched stats diff test [Failed]" + err=3D1 + rm perf.data.old perf.data + return + fi + rm perf.data.old perf.data + echo "Basic perf sched stats diff test [Success]" +} + +test_perf_sched_stats_record +test_perf_sched_stats_report +test_perf_sched_stats_live +test_perf_sched_stats_diff +exit $err --=20 2.43.0 From nobody Thu Oct 2 23:53:20 2025 Received: from NAM02-BN1-obe.outbound.protection.outlook.com (mail-bn1nam02on2068.outbound.protection.outlook.com [40.107.212.68]) (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 8468523D7FC; Tue, 9 Sep 2025 11:48:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.212.68 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418513; cv=fail; b=GXPEIjTavh3Z9l833rpJ6jw19GoHSxCgjcpdNUzeHF2h9lSSTSiFFC/2gVoM0aDmuoPw3UcF69IreOe43d5SKgQp+OKaJdpWGdNG9kX/rC21c/X6TJmSPpo58Be9y1ntzYU5687CkUjl+kNgqXAHa+lK1rFjWmrJXNKVhxXKEH8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757418513; c=relaxed/simple; bh=gqAZxoZKLiec3qn/670jAHkQUcHad5CAYPsvx7cZ5xo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=LG0H6pZ8GnCNrfpX2Dx1vaT0OhKB9tnfuTLPDVuoxfimkH4rh7ayI0hrvyQWnbgAa9ulcP546KY8nzLjD87T/KY94QWMC2UVZ9PwmgqmmfebSTJ5wm978GGLQG6jJFCqgEGhqeCymdxj9rj2KfauF1OQYtUnkNzN1l+w5/izruc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=aYJ1lDL2; arc=fail smtp.client-ip=40.107.212.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="aYJ1lDL2" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kMTFyD4U7QazT57szyPYsmAL7igdKPTGYGE4SSrF/WbaW5RaHXEV0Mz48/RzQYgOJG4ohANcxCMF4VqC3fuf9QrDvRSarIiN3V5TcKsD31YFJeiD1taicJutQaoEWKX9hHDgwILW0cz9aKRbmhJ4hd78IWQjSVquW33x+kfAtBzFD04eW6hOoJmZgN7FxyrvZNEGSFSR94BFs487GI8utheGKYFdcLpDYcMBb26bmGLmTv63DkIt8JYPp9NwouFvIRZNuOka28LkRSjksug4b+Oh7OFFunh6AUMBJWIJaDVNj+zkSZupY4Mv36KT1x9RimbkJEqRLlMdm3xw8aedbQ== 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=TR5lwR7ocSYg9xggvlfqb4UMGVkz4dpo1j/gcmPJlg0=; b=WSFbPKQatNewVH2pmhpTa15kuMzjXX4beSXOLy8+7RBgP319z6sHxltCic/ax5vbIMo+YYVnrd57tOBdUroyEWYQGD9N666q1rj+AA+dFZuVugyYL3l5oThYGYhAxqzA5/ortGLqHRqgFqg4t/BeDST0uhrOqv7amEExd4d1rsqWCfVFJE/O/LrJ+kx9c4WrCa7srB4Rf6jfKVDcb0eLZZQqJmdGG/93h089N3D2MIssb7HpQK/wWrJ3HmatVcLjCEXsGoGQC6hUYQUyUxBKE5e8ApyTAaKms1osb8W2Lj4+R63cvSSG5vEkrKbrTGG8TdVsb1YWDXdo7jaQpvSpfw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=infradead.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=TR5lwR7ocSYg9xggvlfqb4UMGVkz4dpo1j/gcmPJlg0=; b=aYJ1lDL2Sw2jOR35I+3NJnP8GJAtD5exV7k0AcPifTxtaRGLRiF7dv+Y08Xwz+HR52L3fm32PPVC3XrFakf2lDsqqmEa07IN53GNNtScT0ATSu3z7Px1CdmO+crPwY7nXC21clKe+lzh9FM1O2EtL2SjSIWFxOU9WvTOo9hl9k0= Received: from MW4PR04CA0215.namprd04.prod.outlook.com (2603:10b6:303:87::10) by MW4PR12MB6756.namprd12.prod.outlook.com (2603:10b6:303:1e9::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.22; Tue, 9 Sep 2025 11:48:25 +0000 Received: from SJ1PEPF000023D8.namprd21.prod.outlook.com (2603:10b6:303:87:cafe::3f) by MW4PR04CA0215.outlook.office365.com (2603:10b6:303:87::10) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9094.22 via Frontend Transport; Tue, 9 Sep 2025 11:48:25 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF000023D8.mail.protection.outlook.com (10.167.244.73) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9137.0 via Frontend Transport; Tue, 9 Sep 2025 11:48:25 +0000 Received: from tapi.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 9 Sep 2025 04:48:12 -0700 From: Swapnil Sapkal To: , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH RESEND v4 11/11] perf sched stats: Add details in man page Date: Tue, 9 Sep 2025 11:42:27 +0000 Message-ID: <20250909114227.58802-12-swapnil.sapkal@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250909114227.58802-1-swapnil.sapkal@amd.com> References: <20250909114227.58802-1-swapnil.sapkal@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000023D8:EE_|MW4PR12MB6756:EE_ X-MS-Office365-Filtering-Correlation-Id: 2436f2a6-f032-4239-6388-08ddef96c8eb X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|82310400026|376014|1800799024|36860700013|13003099007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?WrJWsSLEu4Jb3JfxDKKshKrXBZ3PVNJ3nqIPeyZ/WjYHr0yEScBF3goO3u/c?= =?us-ascii?Q?7+LnDirLqCIr0184TM44p4PhJ0BNHKm2pPMTFSHSdu3tF0pfy9Vji8ahFeRW?= =?us-ascii?Q?6uCCPuWmtiCiEJdrKRCLaAxMh5wIIG16u5aHXOpx0gS4a4NGnYvHbUMj6VS3?= =?us-ascii?Q?FdjeDh/jf+4s5hqLzl/GsFYZlqSRc8avO1lxNdx6e1ULbC4Z6a3qikKbjUBN?= =?us-ascii?Q?bWr/T/quMawE032TTc6gm38pxPBrOu9W1oMLUkrbeB4TTfUb38Eyc5661dPg?= =?us-ascii?Q?Usel3bFIvLyyCJUBnJLlnaubboJ+LTNYfSKrXfPVufTvNPQODEeuAkbxT7XF?= =?us-ascii?Q?72K6dTIDz3HCZHatinaVAIr3cqqSL5RG9LBzISbKxMcCTQNDRsUSFWzrpV0z?= =?us-ascii?Q?KLC+8gcvh/kyBZOClpqud+cIEE4XPBt0CthIjwI/u8FzTETSbQnmL7Ja8bmd?= =?us-ascii?Q?e8JyLUZcAoKq6wk4zhn9ZAc0WA8h3EMXLySWeNgrsL7l9kgDaaqkXBfqPzDP?= =?us-ascii?Q?VcsFlJymT4eK7eEMHCWFZZqY+9WcJ6z47YqghVPBCISvKej/6+nXPJ+XOaBb?= =?us-ascii?Q?afKUvF0+5MK/g6g6K0N7KFZCWVR6vgkYNZ6kn6x2p4IEB0Lim/LWNNV1LFJd?= =?us-ascii?Q?qO8nmGdJtoQl0HbkLYJR90g5pCL/ktmmK/zznMMMznSJ4EXfqJuYqHR/ZeUt?= =?us-ascii?Q?0Utt4Fc9mBiOsgfKstO+0Yzd6YiJxKTmaONh9cgjnUbfcGR6mZB9dLb4ecuX?= =?us-ascii?Q?m3i9ovGw0S0tvVhrzDuc+6ffMpo20YAt3sJKVPViNVkE0hZl227x9GdgqHhm?= =?us-ascii?Q?XljBodrzPOzoQGuhlci91ge17xrINxEFCnEVEahn5R4MKeoX/4Pt5At9N+rN?= =?us-ascii?Q?l5LPv6KSpCil9rwse1w7e5gj7roTtyuoBDHjW7Zp4QktZXAcvojLIZ4IZZaN?= =?us-ascii?Q?3QMO0X+Fgu39p2WtsvDAAdRIka2s5BXT5UZjANy886SOsvSNsDHrfDXI8ve4?= =?us-ascii?Q?jIIBNQuZHz7jm/XM40Hu48FHNaKnIYN7mIDjt/ai5Lq8LvvEhSBvSzVp03Ev?= =?us-ascii?Q?5W5yaMR34G7mG0zCexHoMrcnEB6pQ6nQt+xZhYFRHybGWXzYslGixtFTqttm?= =?us-ascii?Q?o7BzJDZPH3cGQyApogLjG76l3Sn3f7NZeXGNqf+3tjQvD/N/8/1dx7csXFNU?= =?us-ascii?Q?UT4hksI46eKUXBWlM3aPPOtigSSn1i+QwOJS7a5Dv2LWWRg6udnLgyRM/9xR?= =?us-ascii?Q?UiRnVdm2Aweb56EHmT0btGQzwZt689imuQd/T0d5bU5ZWDbwB3R30X99dDDv?= =?us-ascii?Q?hTPZiELnVD6bNkE0J6KM7rm/IAThyuHpR2WQvKB0SS6vkVHegwln96i4psGa?= =?us-ascii?Q?ka2Mbsm0JZvyxY80ADN73NdiFzv/RB7XkDh5Uld1sj30g39HpKCZafk1FQ0J?= =?us-ascii?Q?mD3NEpiUtYWXxWTEWqbgADjnWSzcdWs0sdIXeCxqVUUCS6t5T9CevQ=3D=3D?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(7416014)(82310400026)(376014)(1800799024)(36860700013)(13003099007);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2025 11:48:25.0155 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2436f2a6-f032-4239-6388-08ddef96c8eb X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000023D8.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6756 Content-Type: text/plain; charset="utf-8" Document perf sched stats purpose, usage examples and guide on how to interpret the report data in the perf-sched man page. Signed-off-by: Ravi Bangoria Signed-off-by: Swapnil Sapkal --- tools/perf/Documentation/perf-sched.txt | 261 +++++++++++++++++++++++- 1 file changed, 260 insertions(+), 1 deletion(-) diff --git a/tools/perf/Documentation/perf-sched.txt b/tools/perf/Documenta= tion/perf-sched.txt index 6dbbddb6464d..5bfb7bb6c633 100644 --- a/tools/perf/Documentation/perf-sched.txt +++ b/tools/perf/Documentation/perf-sched.txt @@ -8,7 +8,7 @@ perf-sched - Tool to trace/measure scheduler properties (la= tencies) SYNOPSIS -------- [verse] -'perf sched' {record|latency|map|replay|script|timehist} +'perf sched' {record|latency|map|replay|script|timehist|stats} =20 DESCRIPTION ----------- @@ -80,8 +80,267 @@ There are several variants of 'perf sched': =20 Times are in msec.usec. =20 + 'perf sched stats {record | report | diff} ' to capture, repor= t the diff + in schedstat counters and show the difference between perf sched stats = report + respectively. schedstat counters which are present in the linux kernel = and are + exposed through the file ``/proc/schedstat``. These counters are enable= d or disabled + via the sysctl governed by the file ``/proc/sys/kernel/sched_schedstats= ``. These + counters accounts for many scheduler events such as ``schedule()`` call= s, load-balancing + events, ``try_to_wakeup()`` call among others. This is useful in unders= tading the + scheduler behavior for the workload. + + Note: The tool will not give correct results if there is topological re= ordering or + online/offline of cpus in between capturing snapshots of `/proc/s= chedstat`. + + Example usage: + perf sched stats record -- sleep 1 + perf sched stats report + perf sched stats diff + + A detailed description of the schedstats can be found in the Kernel Doc= umentation: + https://www.kernel.org/doc/html/latest/scheduler/sched-stats.html + + The result can be interprested as follows: + + The `perf sched stats report` starts with description of the columns pr= esent in + the report. These column names are given before cpu and domain stats to= improve + the readability of the report. + + -----------------------------------------------------------------------= ----------------------------- + DESC -> Description of the field + COUNT -> Value of the field + PCT_CHANGE -> Percent change with corresponding base value + AVG_JIFFIES -> Avg time in jiffies between two consecutive = occurrence of event + -----------------------------------------------------------------------= ----------------------------- + + Next is the total profiling time in terms of jiffies: + + -----------------------------------------------------------------------= ----------------------------- + Time elapsed (in jiffies) : 245= 37 + -----------------------------------------------------------------------= ----------------------------- + + Next is CPU scheduling statistics. These are simple diffs of /proc/sche= dstat CPU lines + along with description. The report also prints % relative to base stat. + + In the example below, schedule() left the CPU0 idle 36.58% of the time.= 0.45% of total + try_to_wake_up() was to wakeup local CPU. And, the total waittime by ta= sks on CPU0 is + 48.70% of the total runtime by tasks on the same CPU. + + -----------------------------------------------------------------------= ----------------------------- + CPU 0 + -----------------------------------------------------------------------= ----------------------------- + DESC = COUNT PCT_CHANGE + -----------------------------------------------------------------------= ----------------------------- + yld_count : = 0 + array_exp : = 0 + sched_count : = 402267 + sched_goidle : = 147161 ( 36.58% ) + ttwu_count : = 236309 + ttwu_local : = 1062 ( 0.45% ) + rq_cpu_time : 708= 3791148 + run_delay : 344= 9973971 ( 48.70% ) + pcount : = 255035 + -----------------------------------------------------------------------= ----------------------------- + + Next is load balancing statistics. For each of the sched domains + (eg: `SMT`, `MC`, `DIE`...), the scheduler computes statistics under + the following three categories: + + 1) Idle Load Balance: Load balancing performed on behalf of a long + idling CPU by some other CPU. + 2) Busy Load Balance: Load balancing performed when the CPU was busy. + 3) New Idle Balance : Load balancing performed when a CPU just became + idle. + + Under each of these three categories, sched stats report provides + different load balancing statistics. Along with direct stats, the + report also contains derived metrics prefixed with *. Example: + + -----------------------------------------------------------------------= ----------------------------- + CPU 0, DOMAIN SMT CPUS 0,64 + -----------------------------------------------------------------------= ----------------------------- + DESC = COUNT AVG_JIFFIES + ----------------------------------------- -------------= ----------------------------- + busy_lb_count : = 136 $ 17.08 $ + busy_lb_balanced : = 131 $ 17.73 $ + busy_lb_failed : = 0 $ 0.00 $ + busy_lb_imbalance_load : = 58 + busy_lb_imbalance_util : = 0 + busy_lb_imbalance_task : = 0 + busy_lb_imbalance_misfit : = 0 + busy_lb_gained : = 7 + busy_lb_hot_gained : = 0 + busy_lb_nobusyq : = 2 $ 1161.50 $ + busy_lb_nobusyg : = 129 $ 18.01 $ + *busy_lb_success_count : = 5 + *busy_lb_avg_pulled : = 1.40 + ----------------------------------------- -------------= ----------------------------- + idle_lb_count : = 449 $ 5.17 $ + idle_lb_balanced : = 382 $ 6.08 $ + idle_lb_failed : = 3 $ 774.33 $ + idle_lb_imbalance_load : = 0 + idle_lb_imbalance_util : = 0 + idle_lb_imbalance_task : = 71 + idle_lb_imbalance_misfit : = 0 + idle_lb_gained : = 67 + idle_lb_hot_gained : = 0 + idle_lb_nobusyq : = 0 $ 0.00 $ + idle_lb_nobusyg : = 382 $ 6.08 $ + *idle_lb_success_count : = 64 + *idle_lb_avg_pulled : = 1.05 + ---------------------------------------- -----------= ----------------------------- + newidle_lb_count : = 30471 $ 0.08 $ + newidle_lb_balanced : = 28490 $ 0.08 $ + newidle_lb_failed : = 633 $ 3.67 $ + newidle_lb_imbalance_load : = 0 + newidle_lb_imbalance_util : = 0 + newidle_lb_imbalance_task : = 2040 + newidle_lb_imbalance_misfit : = 0 + newidle_lb_gained : = 1348 + newidle_lb_hot_gained : = 0 + newidle_lb_nobusyq : = 6 $ 387.17 $ + newidle_lb_nobusyg : = 26634 $ 0.09 $ + *newidle_lb_success_count : = 1348 + *newidle_lb_avg_pulled : = 1.00 + -----------------------------------------------------------------------= ----------------------------- + + Consider following line: + + newidle_lb_balanced : = 28490 $ 0.08 $ + + While profiling was active, the load-balancer found 28490 times the load + needs to be balanced on a newly idle CPU 0. Following value encapsulated + inside $ is average jiffies between two events (28490 / 24537 =3D 0.08). + + Next are active_load_balance() stats. alb did not trigger while the + profiling was active, hence it's all 0s. + + --------------------------------- ----= ----------------------------- + alb_count : = 0 + alb_failed : = 0 + alb_pushed : = 0 + -----------------------------------------------------------------------= ----------------------------- + + Next are sched_balance_exec() and sched_balance_fork() stats. They are + not used but we kept it in RFC just for legacy purpose. Unless opposed, + we plan to remove them in next revision. + + Next are wakeup statistics. For every domain, the report also shows + task-wakeup statistics. Example: + + ------------------------------------------ --------------= ----------------------------- + ttwu_wake_remote : = 1590 + ttwu_move_affine : = 84 + ttwu_move_balance : = 0 + -----------------------------------------------------------------------= ----------------------------- + + Same set of stats are reported for each CPU and each domain level. + + How to interpret the diff + ~~~~~~~~~~~~~~~~~~~~~~~~~ + + The `perf sched stats diff` will also start with explaining the columns + present in the diff. Then it will show the diff in time in terms of + jiffies. The order of the values depends on the order of input data + files. It will take `perf.data.old` and `perf.data` respectively as the + defaults for comparison. Example: + + -----------------------------------------------------------------------= ----------------------------- + Time elapsed (in jiffies) : = 2009, 2001 + -----------------------------------------------------------------------= ----------------------------- + + Below is the sample representing the difference in cpu and domain stats= of + two runs. Here third column or the values enclosed in `|...|` shows the + percent change between the two. Second and fourth columns shows the + side-by-side representions of the corresponding fields from `perf sched + stats report`. + + -----------------------------------------------------------------------= ----------------------------- + CPU + -----------------------------------------------------------------------= ----------------------------- + DESC = COUNT1 COUNT2 PCT_CHANG> + -----------------------------------------------------------------------= ----------------------------- + yld_count : = 0, 0 | 0.00> + array_exp : = 0, 0 | 0.00> + sched_count : = 528533, 412573 | -21.94> + sched_goidle : = 193426, 146082 | -24.48> + ttwu_count : = 313134, 385975 | 23.26> + ttwu_local : = 1126, 1282 | 13.85> + rq_cpu_time : 825= 7200244, 8301250047 | 0.53> + run_delay : 472= 8347053, 3997100703 | -15.47> + pcount : = 335031, 266396 | -20.49> + -----------------------------------------------------------------------= ----------------------------- + + Below is the sample of domain stats diff: + + -----------------------------------------------------------------------= ----------------------------- + CPU , DOMAIN SMT + -----------------------------------------------------------------------= ----------------------------- + DESC = COUNT1 COUNT2 PCT_CHANG> + ----------------------------------------- -------------= ----------------------------- + busy_lb_count : = 122, 80 | -34.43> + busy_lb_balanced : = 115, 76 | -33.91> + busy_lb_failed : = 1, 3 | 200.00> + busy_lb_imbalance_load : = 35, 49 | 40.00> + busy_lb_imbalance_util : = 0, 0 | 0.00> + busy_lb_imbalance_task : = 0, 0 | 0.00> + busy_lb_imbalance_misfit : = 0, 0 | 0.00> + busy_lb_gained : = 7, 2 | -71.43> + busy_lb_hot_gained : = 0, 0 | 0.00> + busy_lb_nobusyq : = 0, 0 | 0.00> + busy_lb_nobusyg : = 115, 76 | -33.91> + *busy_lb_success_count : = 6, 1 | -83.33> + *busy_lb_avg_pulled : = 1.17, 2.00 | 71.43> + ----------------------------------------- -------------= ----------------------------- + idle_lb_count : = 568, 620 | 9.15> + idle_lb_balanced : = 462, 449 | -2.81> + idle_lb_failed : = 11, 21 | 90.91> + idle_lb_imbalance_load : = 0, 0 | 0.00> + idle_lb_imbalance_util : = 0, 0 | 0.00> + idle_lb_imbalance_task : = 115, 189 | 64.35> + idle_lb_imbalance_misfit : = 0, 0 | 0.00> + idle_lb_gained : = 103, 169 | 64.08> + idle_lb_hot_gained : = 0, 0 | 0.00> + idle_lb_nobusyq : = 0, 0 | 0.00> + idle_lb_nobusyg : = 462, 449 | -2.81> + *idle_lb_success_count : = 95, 150 | 57.89> + *idle_lb_avg_pulled : = 1.08, 1.13 | 3.92> + ---------------------------------------- -----------= ----------------------------- + newidle_lb_count : = 16961, 3155 | -81.40> + newidle_lb_balanced : = 15646, 2556 | -83.66> + newidle_lb_failed : = 397, 142 | -64.23> + newidle_lb_imbalance_load : = 0, 0 | 0.00> + newidle_lb_imbalance_util : = 0, 0 | 0.00> + newidle_lb_imbalance_task : = 1376, 655 | -52.40> + newidle_lb_imbalance_misfit : = 0, 0 | 0.00> + newidle_lb_gained : = 917, 457 | -50.16> + newidle_lb_hot_gained : = 0, 0 | 0.00> + newidle_lb_nobusyq : = 3, 1 | -66.67> + newidle_lb_nobusyg : = 14480, 2103 | -85.48> + *newidle_lb_success_count : = 918, 457 | -50.22> + *newidle_lb_avg_pulled : = 1.00, 1.00 | 0.11> + --------------------------------- ----= ----------------------------- + alb_count : = 0, 1 | 0.00> + alb_failed : = 0, 0 | 0.00> + alb_pushed : = 0, 1 | 0.00> + --------------------------------- -----= ----------------------------- + sbe_count : = 0, 0 | 0.00> + sbe_balanced : = 0, 0 | 0.00> + sbe_pushed : = 0, 0 | 0.00> + --------------------------------- -----= ----------------------------- + sbf_count : = 0, 0 | 0.00> + sbf_balanced : = 0, 0 | 0.00> + sbf_pushed : = 0, 0 | 0.00> + ------------------------------------------ --------------= ----------------------------- + ttwu_wake_remote : = 2031, 2914 | 43.48> + ttwu_move_affine : = 73, 124 | 69.86> + ttwu_move_balance : = 0, 0 | 0.00> + -----------------------------------------------------------------------= ----------------------------- + OPTIONS ------- +Applicable to {record|latency|map|replay|script} + -i:: --input=3D:: Input file name. (default: perf.data unless stdin is a fifo) --=20 2.43.0