From nobody Wed Dec 17 05:50:42 2025 Received: from NAM04-DM6-obe.outbound.protection.outlook.com (mail-dm6nam04on2051.outbound.protection.outlook.com [40.107.102.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 CD5511863C; Wed, 8 May 2024 06:05:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.102.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715148322; cv=fail; b=NUOuXKnEv5DjufkoZFAvzBZpGlOK2xyFRSfpvFuzPckOZ3ALpCmQtB6ag11zJOo4XKjrtuLzYk6fIYWZgA7E07tmV77t7MmBeDUil8E8gghB1PxokVP8LNJre1nUsIEvaU172apFU3ouf4ePti4LLMiA3Lui6bGgaqq3ReZBC4M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715148322; c=relaxed/simple; bh=z5VWE23tCeumW2tbUwJCHz6uR1PbUOPADnkOKAdPIvQ=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=AufVfoKe4cXrh4BfmWl+s2VhOeDVxX/Zp0jZr0xMNk7GRxxJEQrz59sdKVwMLdM5JV7Lud+oLZkFD3Q/TOuEal3igp3TZL0YDECFxSB85LGuKokZjP28p8nghZLKGnFZlh/Qjj3cFmhUkh/JWwtuc6wz1kFRQOObKeUcPbPvoqc= 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=yI42BjBc; arc=fail smtp.client-ip=40.107.102.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="yI42BjBc" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YojH39HXs2mf0jEECa/ASd8y/b7d3MHiGpSDgRU7ZHlVAUCUPFkOXrnjtKWD4i9EP5+UPA8xMejt6rwUPkQjIAsTmvzYcm1eu9xMo1nQ1nX2/eUBdhqKZGsvsmYYlTLQm64cojfnZ7MoWjI/41e2sJvrYYyZL2sVR0ifvEwOy4dy1Pq6jrXyGsSMIDcy8OibV+tsBbWSwSS1D4K97mfdPgMkHUafZpP/H6XODXqcNu9Y0OyGCqjlQRAJyJktrEK2HYRiYz4PxxgS+U+/an7BC7bYYbPGntqMEyN1I4EFL1IpdR5W6DINYq0OGqR4MuLaGQ0nE2PlUsZmD/ucLh8f4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=HS1ORoWQExkx6rktbhPzqAKYoaQi8LXjO9GrTzVQv+U=; b=HG5C2xiEXSmaz/WCklSIhv36dDadU7mhiY5G00bjeylod0YvS+umoiOQA1pAqrwpspxbmdz2oKJ5SuQzqFoluaDESe6B3RA/maclajQOQ8HqdD9RkUdhTdWyEabBrvA2S9FuWJjNNPuaGwsVCERTh05nxHLRFIj0oUuPCTRqUepDEyVGUqtC3dGuangRVzE7MZOFnWBV4XASBacFb5OveqqvUXdKfyvkEY+tlkFVSB4Ve29TFiOrAA8/FaUp5/8906vg0qaR3s7C/cN+Q64wbOw3MYhwFj4vkW1grS9bQ4Vnc5kmfA5KsXwVmLBKSDCwnXEQdLQfgX5pEhQ9mfm0Cg== 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=HS1ORoWQExkx6rktbhPzqAKYoaQi8LXjO9GrTzVQv+U=; b=yI42BjBcqwOE/bdlHRS/qH8qVSfTYdnovwbXNlA6gOfe94vzDOWIEsvDospOcqbp2czlZd9sWW0ODP0GnDgWU07PZRu/GsyyRjYj1s8nucfTACQUB3OS25cZIjd917YYqBcCCPsTEaHCXxdQShdqJmAlGbQ4pox1NndhQTwTI/w= Received: from PH7PR17CA0060.namprd17.prod.outlook.com (2603:10b6:510:325::24) by MW4PR12MB7000.namprd12.prod.outlook.com (2603:10b6:303:208::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.43; Wed, 8 May 2024 06:05:17 +0000 Received: from CY4PEPF0000FCC5.namprd03.prod.outlook.com (2603:10b6:510:325:cafe::bd) by PH7PR17CA0060.outlook.office365.com (2603:10b6:510:325::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.45 via Frontend Transport; Wed, 8 May 2024 06:05: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=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CY4PEPF0000FCC5.mail.protection.outlook.com (10.167.242.107) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7544.18 via Frontend Transport; Wed, 8 May 2024 06:05:16 +0000 Received: from BLR-5CG113396H.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Wed, 8 May 2024 01:05:07 -0500 From: Ravi Bangoria To: , , , , CC: , , , , , , , , , , , , , , , , , , , Subject: [RFC 1/4] perf sched: Make `struct perf_sched sched` a global variable Date: Wed, 8 May 2024 11:34:24 +0530 Message-ID: <20240508060427.417-2-ravi.bangoria@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240508060427.417-1-ravi.bangoria@amd.com> References: <20240508060427.417-1-ravi.bangoria@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: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000FCC5:EE_|MW4PR12MB7000:EE_ X-MS-Office365-Filtering-Correlation-Id: d1b72310-a59f-43ff-4c81-08dc6f24d55f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230031|376005|36860700004|82310400017|1800799015|7416005; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?1QHCSFQ9BDSJUlYuCqVUQZDaxfNgLkVJfNv2Az6Ep4pZ6tpMcqBy4gP43TNP?= =?us-ascii?Q?62aslwNIm7nxwyfqWCo/1EgkdO3njpXG+Dtmaq7AmzWI/4IPHrzn72rv+2ed?= =?us-ascii?Q?b7xRnqkke70RpuNNPP7ZH41xU26ikR1kRCRlwAvAWRE711W1hhPaAKBe+C2m?= =?us-ascii?Q?y79tCtC9UhwTxlyhfnwtgjQHcOarA1YIh8OUEA5Vw1njF14whq/i9+a5k8qf?= =?us-ascii?Q?1J2SBCX4OUWUpb4FIYaltlRzKMveZx7usemYy0G0nrNERq/MDFr5E4SkXQPx?= =?us-ascii?Q?vc/k5rIFihWY9D5yootmWQbPLcjd7StfAqyLz+q/Qb1SDr/O1Xt+dKUuamOz?= =?us-ascii?Q?e/1kJmgWjUeynboWq7M111pGB/v/LWWbZliFAG0Stuv9Qf5FhDjXWTa7lXBE?= =?us-ascii?Q?dZUQXEHHJCLfiWQPlGiDce+2qx8biwiVlBSbWg4WwrefVMV4qJ+3NQe9dTdi?= =?us-ascii?Q?jhyAe16nCoZsDwjinJoUxGFB9ji6p8amaTyp59QWjFGGt/R3EkNFaeJim8JU?= =?us-ascii?Q?n5dngt9+DoQCwaUm2SjwQ0EZGTrZbigqMdDSZeYlB0O8TJDPwF/pltk27Erg?= =?us-ascii?Q?2EFur7YYamVgMvHutrbQD1M5cL7E8/Aw6n5OtGnRyvApxsHWTXCicQKvjjJ0?= =?us-ascii?Q?FB5PBwKyx/qbLIc6tB3m91o5C76VcMq0yiFLMSd1cjEZ9DkcZyCfmK8kmwBb?= =?us-ascii?Q?bNCXpk4bUCO/rKraEVKYWPnJKYYMUb0McYvLgVuMspuJgnEEFlMFnnJwcl+l?= =?us-ascii?Q?EGco67sTE8j9vWeyPIy8d86gE1ZJk0QD0UpKRSN0AebtDHDSSwWXhTxqtLzj?= =?us-ascii?Q?lqMsgI/BEhvPF+llVvXlu99xvRB/UW2+tkDeRipzydpmYfQ9acYufJZVJWsV?= =?us-ascii?Q?fJbTqbmFJf/P6JZWEbMkUtJmTIzfghFMTygq1oCjIuD9NHzUB41+OkdYubJp?= =?us-ascii?Q?CHq+LOIauyoDwgViXhw/QdVEoWc3BBDU4ued0m/XFnVjKONcCW3+6adRS34C?= =?us-ascii?Q?RaGBmssfA29bqQbEiu8pf/0ysWLpmTqUSxXm3SfGriyJnckHBkOmXalmm9kc?= =?us-ascii?Q?tvKz5M/A/m5j62LEHMU/AurZuMQg/LfEKGTCfd8AWw5+8lSFnRSddEXKFf+G?= =?us-ascii?Q?Kjt4EDs76ha7pZwFoQKkD1K1Jr5UMr8TsAbgPQpbG6oiOC5VgDmbSbLXOOW7?= =?us-ascii?Q?lUQllViFwjWy4ECZPdL+5/B4VlPwMr6KNE0eJFZB7rIXeZnbUUQbosdhh+0O?= =?us-ascii?Q?bjncsnZuMQ73OuI7/DhqmY4U5VWJzbT0bpAh85OyjVEvLAL5LJLZdwiq4ZsT?= =?us-ascii?Q?zCaZahiec33xOVQ1UPHMLQEGSWNy/3UUQqIdGeBWs9auMsqFScCxIy6ibB2p?= =?us-ascii?Q?8nlGLVo+4R5OsCAW76PPEbUFTgdJ?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(376005)(36860700004)(82310400017)(1800799015)(7416005);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 May 2024 06:05:16.7972 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d1b72310-a59f-43ff-4c81-08dc6f24d55f 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=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000FCC5.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB7000 Content-Type: text/plain; charset="utf-8" Currently it is function local. Followup changes will add new fields to this structure, and those new fields will be used by callback functions to which there is no way to pass a pointer of `sched` variable. So make it a global variable. Also, rename it to `perf_sched` to be consistent with other builtin-*.c subtools nomenclature. Signed-off-by: Ravi Bangoria --- tools/perf/builtin-sched.c | 109 +++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 0fce7d8986c0..bc1317d7e106 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -3504,29 +3504,30 @@ static int __cmd_record(int argc, const char **argv) return ret; } =20 +static const char default_sort_order[] =3D "avg, max, switch, runtime"; +static struct perf_sched perf_sched =3D { + .tool =3D { + .sample =3D perf_sched__process_tracepoint_sample, + .comm =3D perf_sched__process_comm, + .namespaces =3D perf_event__process_namespaces, + .lost =3D perf_event__process_lost, + .fork =3D perf_sched__process_fork_event, + .ordered_events =3D true, + }, + .cmp_pid =3D LIST_HEAD_INIT(perf_sched.cmp_pid), + .sort_list =3D LIST_HEAD_INIT(perf_sched.sort_list), + .sort_order =3D default_sort_order, + .replay_repeat =3D 10, + .profile_cpu =3D -1, + .next_shortname1 =3D 'A', + .next_shortname2 =3D '0', + .skip_merge =3D 0, + .show_callchain =3D 1, + .max_stack =3D 5, +}; + int cmd_sched(int argc, const char **argv) { - static const char default_sort_order[] =3D "avg, max, switch, runtime"; - struct perf_sched sched =3D { - .tool =3D { - .sample =3D perf_sched__process_tracepoint_sample, - .comm =3D perf_sched__process_comm, - .namespaces =3D perf_event__process_namespaces, - .lost =3D perf_event__process_lost, - .fork =3D perf_sched__process_fork_event, - .ordered_events =3D true, - }, - .cmp_pid =3D LIST_HEAD_INIT(sched.cmp_pid), - .sort_list =3D LIST_HEAD_INIT(sched.sort_list), - .sort_order =3D default_sort_order, - .replay_repeat =3D 10, - .profile_cpu =3D -1, - .next_shortname1 =3D 'A', - .next_shortname2 =3D '0', - .skip_merge =3D 0, - .show_callchain =3D 1, - .max_stack =3D 5, - }; const struct option sched_options[] =3D { OPT_STRING('i', "input", &input_name, "file", "input file name"), @@ -3534,31 +3535,31 @@ int cmd_sched(int argc, const char **argv) "be more verbose (show symbol address, etc)"), OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, "dump raw trace in ASCII"), - OPT_BOOLEAN('f', "force", &sched.force, "don't complain, do it"), + OPT_BOOLEAN('f', "force", &perf_sched.force, "don't complain, do it"), OPT_END() }; const struct option latency_options[] =3D { - OPT_STRING('s', "sort", &sched.sort_order, "key[,key2...]", + OPT_STRING('s', "sort", &perf_sched.sort_order, "key[,key2...]", "sort by key(s): runtime, switch, avg, max"), - OPT_INTEGER('C', "CPU", &sched.profile_cpu, + OPT_INTEGER('C', "CPU", &perf_sched.profile_cpu, "CPU to profile on"), - OPT_BOOLEAN('p', "pids", &sched.skip_merge, + OPT_BOOLEAN('p', "pids", &perf_sched.skip_merge, "latency stats per pid instead of per comm"), OPT_PARENT(sched_options) }; const struct option replay_options[] =3D { - OPT_UINTEGER('r', "repeat", &sched.replay_repeat, + OPT_UINTEGER('r', "repeat", &perf_sched.replay_repeat, "repeat the workload replay N times (-1: infinite)"), OPT_PARENT(sched_options) }; const struct option map_options[] =3D { - OPT_BOOLEAN(0, "compact", &sched.map.comp, + OPT_BOOLEAN(0, "compact", &perf_sched.map.comp, "map output in compact mode"), - OPT_STRING(0, "color-pids", &sched.map.color_pids_str, "pids", + OPT_STRING(0, "color-pids", &perf_sched.map.color_pids_str, "pids", "highlight given pids in map"), - OPT_STRING(0, "color-cpus", &sched.map.color_cpus_str, "cpus", + OPT_STRING(0, "color-cpus", &perf_sched.map.color_cpus_str, "cpus", "highlight given CPUs in map"), - OPT_STRING(0, "cpus", &sched.map.cpus_str, "cpus", + OPT_STRING(0, "cpus", &perf_sched.map.cpus_str, "cpus", "display given CPUs in map"), OPT_PARENT(sched_options) }; @@ -3567,24 +3568,24 @@ int cmd_sched(int argc, const char **argv) "file", "vmlinux pathname"), OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name, "file", "kallsyms pathname"), - OPT_BOOLEAN('g', "call-graph", &sched.show_callchain, + OPT_BOOLEAN('g', "call-graph", &perf_sched.show_callchain, "Display call chains if present (default on)"), - OPT_UINTEGER(0, "max-stack", &sched.max_stack, + OPT_UINTEGER(0, "max-stack", &perf_sched.max_stack, "Maximum number of functions to display backtrace."), OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory", "Look for files with symbols relative to this directory"), - OPT_BOOLEAN('s', "summary", &sched.summary_only, + OPT_BOOLEAN('s', "summary", &perf_sched.summary_only, "Show only syscall summary with statistics"), - OPT_BOOLEAN('S', "with-summary", &sched.summary, + OPT_BOOLEAN('S', "with-summary", &perf_sched.summary, "Show all syscalls and summary with statistics"), - OPT_BOOLEAN('w', "wakeups", &sched.show_wakeups, "Show wakeup events"), - OPT_BOOLEAN('n', "next", &sched.show_next, "Show next task"), - OPT_BOOLEAN('M', "migrations", &sched.show_migrations, "Show migration ev= ents"), - OPT_BOOLEAN('V', "cpu-visual", &sched.show_cpu_visual, "Add CPU visual"), - OPT_BOOLEAN('I', "idle-hist", &sched.idle_hist, "Show idle events only"), - OPT_STRING(0, "time", &sched.time_str, "str", + OPT_BOOLEAN('w', "wakeups", &perf_sched.show_wakeups, "Show wakeup events= "), + OPT_BOOLEAN('n', "next", &perf_sched.show_next, "Show next task"), + OPT_BOOLEAN('M', "migrations", &perf_sched.show_migrations, "Show migrati= on events"), + OPT_BOOLEAN('V', "cpu-visual", &perf_sched.show_cpu_visual, "Add CPU visu= al"), + OPT_BOOLEAN('I', "idle-hist", &perf_sched.idle_hist, "Show idle events on= ly"), + OPT_STRING(0, "time", &perf_sched.time_str, "str", "Time span for analysis (start,stop)"), - OPT_BOOLEAN(0, "state", &sched.show_state, "Show task state when sched-ou= t"), + OPT_BOOLEAN(0, "state", &perf_sched.show_state, "Show task state when sch= ed-out"), OPT_STRING('p', "pid", &symbol_conf.pid_list_str, "pid[,pid...]", "analyze events only for given process id(s)"), OPT_STRING('t', "tid", &symbol_conf.tid_list_str, "tid[,tid...]", @@ -3645,31 +3646,31 @@ int cmd_sched(int argc, const char **argv) } else if (strlen(argv[0]) > 2 && strstarts("record", argv[0])) { return __cmd_record(argc, argv); } else if (strlen(argv[0]) > 2 && strstarts("latency", argv[0])) { - sched.tp_handler =3D &lat_ops; + perf_sched.tp_handler =3D &lat_ops; if (argc > 1) { argc =3D parse_options(argc, argv, latency_options, latency_usage, 0); if (argc) usage_with_options(latency_usage, latency_options); } - setup_sorting(&sched, latency_options, latency_usage); - return perf_sched__lat(&sched); + setup_sorting(&perf_sched, latency_options, latency_usage); + return perf_sched__lat(&perf_sched); } else if (!strcmp(argv[0], "map")) { if (argc) { argc =3D parse_options(argc, argv, map_options, map_usage, 0); if (argc) usage_with_options(map_usage, map_options); } - sched.tp_handler =3D &map_ops; - setup_sorting(&sched, latency_options, latency_usage); - return perf_sched__map(&sched); + perf_sched.tp_handler =3D &map_ops; + setup_sorting(&perf_sched, latency_options, latency_usage); + return perf_sched__map(&perf_sched); } else if (strlen(argv[0]) > 2 && strstarts("replay", argv[0])) { - sched.tp_handler =3D &replay_ops; + perf_sched.tp_handler =3D &replay_ops; if (argc) { argc =3D parse_options(argc, argv, replay_options, replay_usage, 0); if (argc) usage_with_options(replay_usage, replay_options); } - return perf_sched__replay(&sched); + return perf_sched__replay(&perf_sched); } else if (!strcmp(argv[0], "timehist")) { if (argc) { argc =3D parse_options(argc, argv, timehist_options, @@ -3677,13 +3678,13 @@ int cmd_sched(int argc, const char **argv) if (argc) usage_with_options(timehist_usage, timehist_options); } - if ((sched.show_wakeups || sched.show_next) && - sched.summary_only) { + if ((perf_sched.show_wakeups || perf_sched.show_next) && + perf_sched.summary_only) { pr_err(" Error: -s and -[n|w] are mutually exclusive.\n"); parse_options_usage(timehist_usage, timehist_options, "s", true); - if (sched.show_wakeups) + if (perf_sched.show_wakeups) parse_options_usage(NULL, timehist_options, "w", true); - if (sched.show_next) + if (perf_sched.show_next) parse_options_usage(NULL, timehist_options, "n", true); return -EINVAL; } @@ -3691,7 +3692,7 @@ int cmd_sched(int argc, const char **argv) if (ret) return ret; =20 - return perf_sched__timehist(&sched); + return perf_sched__timehist(&perf_sched); } else { usage_with_options(sched_usage, sched_options); } --=20 2.44.0 From nobody Wed Dec 17 05:50:42 2025 Received: from NAM02-BN1-obe.outbound.protection.outlook.com (mail-bn1nam02on2059.outbound.protection.outlook.com [40.107.212.59]) (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 61E6623754; Wed, 8 May 2024 06:05:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.212.59 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715148331; cv=fail; b=H52gjrT8ddvTjfOX4yzZCkUogBr7FgFdN2iZJ7+zMMFPlfJNWAZhJc6CdNedV77NqPrrNL9E7yonYLY43vxKFVLHmc0owsfSnyjWnkN4kuvstSB1Td6nvsADmvYL7X3TDnL5NCkVUsr6qqIBotcIii6qoZopGUnSpJemqqLPfm4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715148331; c=relaxed/simple; bh=J/ec2gYMHoMnU5ZoH+EPySBsc7X6uqEJNH/qylcOXeQ=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=QSdPH5tS86owJ3/2WPQ3hk9d5j+WLW60t1Qyl2qKC6knGTqOmOhCBOXXOjMq1gVxdh97i6NY49MCb4o8e43KgS4p/lExUEgf9qq9A55HOG20vY89armbu6BUD/Dm1EhfBs25x8+Z0vsA/6vfVypHqXJ1d0MF3xdZwObhKdhYMt4= 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=NYVTeZ8R; arc=fail smtp.client-ip=40.107.212.59 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="NYVTeZ8R" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=aGovUkFA/1N1bFOnhh+J//eIy5crsGQ6mP3V3Ef/iz3vNx5OD/8exPZ9lHIALe5U5VeXEDB5xZrtj7gdqx5gBEOhoZLpteC7MmjS7TD375dKtJhHxgNAv62x7p5hDwkbrr+FJzJ/fqQBfypmT/YGSzifl3m/Ei0r9VOYoUkSgmTM7zcykljYRJpGJ0S5fPKBbXA+IRfJkL9OIz6DHonAO1/dvEeIQcH2w09STvtDEMkpO8i6i8+GCUK+yF8mgrled+aOKUNSKzo37MMdVw7QPp2i/UiF4VE0UkqlpO2UKd0OqPn24z3QbWqX2yQeB7Iy7G2tLWNZQkTeRKBxX/X0/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=xQVasa1lBb+ZNnThoqNsFLOVF+lax3Z5cFSqOeRUesE=; b=UmnveLncJFUuMRhlT4jQ5mZIuUZejuYD1KoyN8vV136EoUZpaRPXRfIo42zqraABYiam1yDuldvUyiUFPVLeqe1uCI7eJqS25Ox+zJd9geBT/SSCatjhQeOAiqH9oTPLNdAjprqgGc0LrhBuLCpgnPC+36qd7w5nSYAMktBnz5NBdVZfiLSOXDy+o/7peNRanD7qd5JC8jQg8BEwnxFKIwx6Q27QANiGZHCqofo25oKkwYTXt4xBi4G7MRU4jQka99wgG2HO1rdnyw9WVs9Cu52e32UGA/5cgQxXZchw1cORhLNfpUVEcT7nciaG7cMBEfssYrXqXJ0A2KUyirthhw== 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=xQVasa1lBb+ZNnThoqNsFLOVF+lax3Z5cFSqOeRUesE=; b=NYVTeZ8RCCzG5gjHOxP39onKyJ63Gml7f3WcMzCYIJuwfnuvUPBC39nyY/3URnXCOogJMheRZje7zuHOgIiIJT1j501poqxMNUh98kxKNHseMpvMyKBebEqivD4ld5hCxpuV8mTNLVjDi8YudXRKF9nlYAI0ni/ng0RTu82PdWo= Received: from DS7PR05CA0065.namprd05.prod.outlook.com (2603:10b6:8:57::10) by IA0PR12MB7508.namprd12.prod.outlook.com (2603:10b6:208:440::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.42; Wed, 8 May 2024 06:05:26 +0000 Received: from CY4PEPF0000FCBF.namprd03.prod.outlook.com (2603:10b6:8:57:cafe::74) by DS7PR05CA0065.outlook.office365.com (2603:10b6:8:57::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.46 via Frontend Transport; Wed, 8 May 2024 06:05:26 +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=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CY4PEPF0000FCBF.mail.protection.outlook.com (10.167.242.101) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7544.18 via Frontend Transport; Wed, 8 May 2024 06:05:25 +0000 Received: from BLR-5CG113396H.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Wed, 8 May 2024 01:05:16 -0500 From: Ravi Bangoria To: , , , , CC: , , , , , , , , , , , , , , , , , , , Subject: [RFC 2/4] perf sched: Add template code for schedstat subcommand Date: Wed, 8 May 2024 11:34:25 +0530 Message-ID: <20240508060427.417-3-ravi.bangoria@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240508060427.417-1-ravi.bangoria@amd.com> References: <20240508060427.417-1-ravi.bangoria@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: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000FCBF:EE_|IA0PR12MB7508:EE_ X-MS-Office365-Filtering-Correlation-Id: 099447f6-4745-445b-e0cd-08dc6f24dac2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230031|82310400017|7416005|1800799015|36860700004|376005; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?YiBsZGHIoVL3rdsrgGBsV7cfqDmi4BSNT8b+lWEjUk+JNJ8PrGl1t4QkGFjV?= =?us-ascii?Q?yP3S++xxMDHo3c9j/t2nBYXr8Ph1PrljmmLohmPwxsvRc57HC9UuTreXLyrY?= =?us-ascii?Q?ipSTKR1Q9WGSOghGwtp35A7LI1MeFuoEdlUiEsS1Mofq4n3sdpdahubmfqS6?= =?us-ascii?Q?omWorXE0wOpfAFfXUYJPbr1vLYok7ziBS8L3HxYUYcI+71UgAf1CS8ZpNe+x?= =?us-ascii?Q?MXp14j/yCkPyAKCxE5NfPa2iIf5eVI6Xqot2TZ80Wvsl3dEi+0uFxzlWVkt0?= =?us-ascii?Q?jOmizuggPO/+WYlaHMdzPZL4d2TihjIZ7eqkHOJUYMirThdhoG9E6yWxsqQT?= =?us-ascii?Q?EPCmTOwbPq2ne3r6ZahYbVznifWbpLKZZXFScEwqy4ggIEbcvu0Jvph7BZD8?= =?us-ascii?Q?YE2r5Vf93HX9joVhrNrey0tiowRagVBD+zk2ETKao7wxGC9qv4nIHB6zhxEM?= =?us-ascii?Q?8HywZJNiJo9E+/tc3/PDIktOzB7qAMHwhG74mllTLpJhd8s1/BruMSkTS39f?= =?us-ascii?Q?+J9FAfWnJ7vhm3E6rurL9S2XyXiYNVB5Pv3fOzfqbFPKIWvVWfLSmoXFZSCF?= =?us-ascii?Q?GE8XCqbGTddoHTRWB4xf/1KlSVl2GZh8TGIy8NWbYw/YjNHGaYWBWUtulab5?= =?us-ascii?Q?tOyZ7Kf/YwozsqvDqBerw/noSV1/rYttUQR95mtw37FabrdNRougpPz62DMw?= =?us-ascii?Q?FW3DT9yQEKCLtN0N3mCYWPaZ+SXAAtlhJI1Lz6SFL3Ly6Lu3RxBIOMsuOCfO?= =?us-ascii?Q?2bR2okQn4suY5kqvWUSNkoePBTOtHVhcfVwILp8IXVFn8WnBCNlIT8UMAvFw?= =?us-ascii?Q?T3+fECcT3P1W86gcQKzLE5/62Zx4R8T+VYb30nbzj+nJ1fWD4PZEM6p+aTny?= =?us-ascii?Q?FRGjQYKzHqlOX3WAbNb+116jUvN8S2eurCoQJAAjpFvRj4XyWRxli7i42js9?= =?us-ascii?Q?fEKo4jtIlPEoWiklma3rcT1bD+Zo7Tk3OrddznxU71GLk9DRuVAx0mXcAX7u?= =?us-ascii?Q?ZPTaeAhJo6C59K6PA4KoYXAEjQUByydfA/3l4uAEEWme6LH56YNlpt6+O0jT?= =?us-ascii?Q?/mLGxoGOONHt18UWYz1YwaFuEo/FaBiXZNiQUQLuQPGv9pgA+RiCyI2UOk4G?= =?us-ascii?Q?z4RR0r6t5oHK7u/a+LD7LW0tPkRNXWiu2nuuPJTT9CKBeIczqFrBrsRDsEYV?= =?us-ascii?Q?KcquiyJ7tNq1hQ2Nc0O/u9k7/Pd4NCqdxpk4mKu1KJDn8wSzTCa3uyEmH4Eb?= =?us-ascii?Q?Q4bJuKyBktXSoG2NYkYO6AoDYEPcLO/6lJOFjTc8q7jQOCz1Km22QUWDmvtd?= =?us-ascii?Q?35oRzlF0yYUXPDd73k3rgm39Tt23hjonxVTjBp2NAckXq8R4Qnjc/VzMUwbD?= =?us-ascii?Q?gNL16YU=3D?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(82310400017)(7416005)(1800799015)(36860700004)(376005);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 May 2024 06:05:25.8384 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 099447f6-4745-445b-e0cd-08dc6f24dac2 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=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000FCBF.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB7508 Content-Type: text/plain; charset="utf-8" perf sched schedstat will allow user to record the profile with `record` subcommand and analyse it with `report` subcommand. Signed-off-by: Ravi Bangoria --- tools/perf/builtin-sched.c | 48 +++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index bc1317d7e106..717bdf113241 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -3504,6 +3504,21 @@ static int __cmd_record(int argc, const char **argv) return ret; } =20 +/* perf.data or any other output file name used by schedstat subcommand (o= nly). */ +const char *output_name; + +static int perf_sched__schedstat_record(struct perf_sched *sched __maybe_u= nused, + int argc __maybe_unused, + const char **argv __maybe_unused) +{ + return 0; +} + +static int perf_sched__schedstat_report(struct perf_sched *sched __maybe_u= nused) +{ + return 0; +} + static const char default_sort_order[] =3D "avg, max, switch, runtime"; static struct perf_sched perf_sched =3D { .tool =3D { @@ -3593,6 +3608,13 @@ int cmd_sched(int argc, const char **argv) OPT_STRING('C', "cpu", &cpu_list, "cpu", "list of cpus to profile"), OPT_PARENT(sched_options) }; + const struct option schedstat_options[] =3D { + OPT_STRING('i', "input", &input_name, "file", + "`schedstat report` with input filename"), + OPT_STRING('o', "output", &output_name, "file", + "`schedstat record` with output filename"), + OPT_END() + }; =20 const char * const latency_usage[] =3D { "perf sched latency []", @@ -3610,9 +3632,13 @@ int cmd_sched(int argc, const char **argv) "perf sched timehist []", NULL }; + const char *schedstat_usage[] =3D { + "perf sched schedstat {record|report} []", + NULL + }; const char *const sched_subcommands[] =3D { "record", "latency", "map", "replay", "script", - "timehist", NULL }; + "timehist", "schedstat", NULL }; const char *sched_usage[] =3D { NULL, NULL @@ -3693,6 +3719,26 @@ int cmd_sched(int argc, const char **argv) return ret; =20 return perf_sched__timehist(&perf_sched); + } else if (!strcmp(argv[0], "schedstat")) { + const char *const schedstat_subcommands[] =3D {"record", "report", NULL}; + + argc =3D parse_options_subcommand(argc, argv, schedstat_options, + schedstat_subcommands, + schedstat_usage, 0); + + if (argv[0] && !strcmp(argv[0], "record")) { + if (argc) + argc =3D parse_options(argc, argv, schedstat_options, + schedstat_usage, 0); + ret =3D perf_sched__schedstat_record(&perf_sched, argc, argv); + } else if (argv[0] && !strcmp(argv[0], "report")) { + if (argc) + argc =3D parse_options(argc, argv, schedstat_options, + schedstat_usage, 0); + ret =3D perf_sched__schedstat_report(&perf_sched); + } else { + usage_with_options(schedstat_usage, schedstat_options); + } } else { usage_with_options(sched_usage, sched_options); } --=20 2.44.0 From nobody Wed Dec 17 05:50:42 2025 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (mail-mw2nam10on2044.outbound.protection.outlook.com [40.107.94.44]) (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 A017417BB6; Wed, 8 May 2024 06:05:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.94.44 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715148345; cv=fail; b=tl2Bp/N5ukjOp+CBXGAblUiOVWC3PuuoycU5ZOi6CZ2eqBzzNZPVpogPA7FibDoUef02f3/WS1a6S+M34c3SA+RdVo67J+cscTbr0NAAA3XpXEaEgqgILgUoja2xc1mrFKtJyHpG1uuAAb58mcdIFrn3DuRZV2Cy8nCyiq1ywCE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715148345; c=relaxed/simple; bh=7pz2YzvvL9K4lY3+cKp753pecpmgOc6SuhQA9axd9I0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=d2hFNv1VlvmExyTlGnuejuRqWtqPWHEikrzeExVzEVGagckkRsvBN8EqwT4T+1bR6n2upP46B4XrYlYk1ZJOe6PaNrazU/eWSHX5QIBN2PGgH2alRW2i38UkGwkeJYzzYMOAG68cX7WS4CanXvkJSSHZbVYl1E9cUiXybJBo53c= 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=iG/jOY6I; arc=fail smtp.client-ip=40.107.94.44 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="iG/jOY6I" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Hgsn7GgDUuFoU5uD8yU41VH6nRKwspgsXF9xzqifTOszSk65oj+DnXEHW9HbATTlS6G5Md5BDcxEsG/Alb3vEUD6UGi3lZf7Mxar97Ni/4OMgBRMeeOFtKVdruendeMcFZsaxi7zZKwthxlNGzaqFcZdZD33pdL49hY17Vw4ekLGden0ukGFDYGFitZlElxrKgf8mYU15uLjZzv4xhIt6fz29ar5HhuXyDW8/G+5e0n563pnflk1iBvCMYeYplXlQ7yQpjhAehVXY4mTfylGXkddz/hvkoUkKhaoYTnxDf2d/37CqHkEyxLgTgyd6QRuygO26ORb3MEXQoC5iNFORw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=aPkYm8d9JXt+Q1BGB3ivJ2qbk+4ypuN61EGg5IfvmjM=; b=AUsMsVQLafKBWsTdC2Psq68v7EsD7H7cauW8M+Kus360bbV9Sk2Iql1YQoeZ/0TJd4rZ5y0xLWaCBYfc6tKIJtw/K/kEklpcsA4Md1LmelNvxOzjPnd80AmZ15lx5rvGSEn6pNDnDJFwOgmwkAl8JtuCiLvG1oZ8620zYFyL54xgCSMMl+PdSACGZBlE0DC3NH41e9Gs9bBt9nfE18Y0XEMmNKBPTpYF5mXdpAnuffP4PreEeyLYRXg/7RwDrIFXDyvV7IlGR56AyoJKBAe5ta+TgmE0xlOxUHL48/PVmUplGMAWdOAihaY7MkcxKCGJFsW0iahFXAgT0+QTIzKW1A== 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=aPkYm8d9JXt+Q1BGB3ivJ2qbk+4ypuN61EGg5IfvmjM=; b=iG/jOY6IfwfKDviaVsGoE13uZN8867XU6wxRxQzqJToN9ORmMFwZdAvSNb64W8aGMyr34INA1Kpcrs1SwEwcBvKN06lX5XanRHnZtnDqY8fIjr0GK6WJGrqukF7XK0OXQ5TYGm3wGIDOfTflLblHVTClP9W5Yr+BbWCA4lCNlnk= Received: from DS7PR05CA0071.namprd05.prod.outlook.com (2603:10b6:8:57::14) by IA0PR12MB8862.namprd12.prod.outlook.com (2603:10b6:208:48e::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.43; Wed, 8 May 2024 06:05:37 +0000 Received: from CY4PEPF0000FCBF.namprd03.prod.outlook.com (2603:10b6:8:57:cafe::29) by DS7PR05CA0071.outlook.office365.com (2603:10b6:8:57::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.45 via Frontend Transport; Wed, 8 May 2024 06:05:36 +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=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CY4PEPF0000FCBF.mail.protection.outlook.com (10.167.242.101) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7544.18 via Frontend Transport; Wed, 8 May 2024 06:05:36 +0000 Received: from BLR-5CG113396H.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Wed, 8 May 2024 01:05:25 -0500 From: Ravi Bangoria To: , , , , CC: , , , , , , , , , , , , , , , , , , , Subject: [RFC 3/4] perf sched schedstat: Add record and rawdump support Date: Wed, 8 May 2024 11:34:26 +0530 Message-ID: <20240508060427.417-4-ravi.bangoria@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240508060427.417-1-ravi.bangoria@amd.com> References: <20240508060427.417-1-ravi.bangoria@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: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000FCBF:EE_|IA0PR12MB8862:EE_ X-MS-Office365-Filtering-Correlation-Id: a947e426-4d3d-48f0-5e20-08dc6f24e132 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230031|376005|7416005|82310400017|1800799015|36860700004; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?hLpxVXapyg7EUrkG8WpRNOD8pts6/ZmJDGlaxz6aYxgg29K2vmZBlhgsS951?= =?us-ascii?Q?AsmJRQZ9d20VyZ/oIPRdM3xxruYFDm8dZnsodJz5pA46fWAmnp8qT0MQ8D97?= =?us-ascii?Q?ljPGVg3WohJrKUAQ7tQXMUxIaLWhtXrPxBzK1VesQBBUFcJlmOt1njF4kZKN?= =?us-ascii?Q?bkU0FQPZJvWVEtHR62tmxp8I1ZTtm1jHD/Oltii/0k8Idr7IiMXG9KNSx9OM?= =?us-ascii?Q?LBOgRNj9yFbmHzY+ImfOTPgoTjzoCfI0HKEAcartNpbv1im6ZV1l6bhDDrS+?= =?us-ascii?Q?byuj2+wi1UrORVSHL8i+++QVa3uIvrNzul265ivTIGicF/cyym6rRwgERSkv?= =?us-ascii?Q?1+C7u9fLE5pzdvQ02eeroikRUJJJQvbtLaRuOrS6VfD3jXDyG/LVbg6SvtSW?= =?us-ascii?Q?jdx+8Ee+dGRvCylxdkpANBTDN51OybhkKIB4fBMLDfUZyMHgOrgUbz7QiLYk?= =?us-ascii?Q?1PIbZDRxvgLUgjEZPBz0j5xZD6SIX5Y36X2Wk64AiG+Sn1jBYXWcLsJ/vMqN?= =?us-ascii?Q?hFVxWYmeYfah9EsgPgcqF3Q0nc8rVufMqZawijGF+Qs4g1+bIs5BEMHg1F1E?= =?us-ascii?Q?gKb3cwwGeSjUf4ycU1vyz699A7weOgo9XDhgjp9i6RehkPPqVsPB5BeM8lKc?= =?us-ascii?Q?JgUOL/avk6lHf5o2SOjPfuYDelF4J+iT0CyBXG38RJ02PcZVublwyiV4NfJx?= =?us-ascii?Q?qtoij29R3JsodtRR7fkpcSS0Kc2KnvVLvR0DIuq1NRNgIolEwTfzqhfJ8gcy?= =?us-ascii?Q?byULpU7nTeJB+RvUQvFykgi0ykup66T230x+n9bFHkenXQpJjsuydAi8pJL9?= =?us-ascii?Q?4gze1V6wA5pgqkz0p8nER9vvfsFdVean9TT2ynV8/gVPrzOfTZ3TsF6WXZsX?= =?us-ascii?Q?Q9qORNnty4J5y338GFNDzhyCz9BL/PHIO8LJC14R1IH7c37LccJxkrS/Q0Yo?= =?us-ascii?Q?+tLr3Uuiki9uhSsRY1i8eP6uQ1mbYhJ/M3QsmfBlF/42U9NJaNV0YasdOYOr?= =?us-ascii?Q?h2ssTB0hI7mBCORwtwYxXZLojBoCUSsJhTtzj9LFmpR85QDRi3L8ixGO4vpO?= =?us-ascii?Q?lbaPy0u04+KA8Rk2mwfeAnvN+2z5x4rS7BxMyNdX6OsVn/74rA1oN3zIQu5y?= =?us-ascii?Q?MiD3vdU+jkF4QO43GFoacMDQ72nhh4jW8Wwxr8ufYTpq+hkP4DNiE2Irx+x+?= =?us-ascii?Q?r5jghKZSHyq9PHO6B8e6kuuxD7zBAONNKnBQFmb5ZvB2C0LJqURkEr05NiQt?= =?us-ascii?Q?3v9U9p2WvzlII7zMXFacMJ1TaPsbXHzHOBNP4VbfmO5tsSoDf6me4OEwljTT?= =?us-ascii?Q?Bt4nOxV4NMhdpwhPlVHCb2yvPlLh98a5p7i0uzSy/GWFLAgVr5leuLNsS4j1?= =?us-ascii?Q?uF1zlQAlDtlJ6xocifbvv8Apl3N2?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(376005)(7416005)(82310400017)(1800799015)(36860700004);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 May 2024 06:05:36.5885 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a947e426-4d3d-48f0-5e20-08dc6f24e132 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=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000FCBF.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB8862 Content-Type: text/plain; charset="utf-8" From: Swapnil Sapkal 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 schedstat record` subcommand. 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: Swapnil Sapkal Signed-off-by: Ravi Bangoria --- tools/lib/perf/Documentation/libperf.txt | 2 + tools/lib/perf/Makefile | 2 +- tools/lib/perf/include/perf/event.h | 37 ++++ .../lib/perf/include/perf/schedstat-cpu-v15.h | 13 ++ .../perf/include/perf/schedstat-domain-v15.h | 40 +++++ tools/perf/builtin-inject.c | 2 + tools/perf/builtin-sched.c | 157 +++++++++++++++- tools/perf/util/event.c | 54 ++++++ tools/perf/util/event.h | 2 + tools/perf/util/session.c | 44 +++++ tools/perf/util/synthetic-events.c | 170 ++++++++++++++++++ tools/perf/util/synthetic-events.h | 4 + tools/perf/util/tool.h | 4 +- 13 files changed, 525 insertions(+), 6 deletions(-) create mode 100644 tools/lib/perf/include/perf/schedstat-cpu-v15.h create mode 100644 tools/lib/perf/include/perf/schedstat-domain-v15.h diff --git a/tools/lib/perf/Documentation/libperf.txt b/tools/lib/perf/Docu= mentation/libperf.txt index fcfb9499ef9c..39c78682ad2e 100644 --- a/tools/lib/perf/Documentation/libperf.txt +++ b/tools/lib/perf/Documentation/libperf.txt @@ -211,6 +211,8 @@ SYNOPSIS struct perf_record_time_conv; struct perf_record_header_feature; struct perf_record_compressed; + 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 3a9b2140aa04..ebbfea891a6a 100644 --- a/tools/lib/perf/Makefile +++ b/tools/lib/perf/Makefile @@ -187,7 +187,7 @@ install_lib: libs $(call do_install_mkdir,$(libdir_SQ)); \ 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 bpf_perf.h core.h cpumap.h threadmap.h evlist.h evsel.h event.h = mmap.h schedstat-cpu-v15.h schedstat-domain-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 ae64090184d3..835bb3e2dcbf 100644 --- a/tools/lib/perf/include/perf/event.h +++ b/tools/lib/perf/include/perf/event.h @@ -451,6 +451,39 @@ struct perf_record_compressed { char data[]; }; =20 +struct perf_record_schedstat_cpu_v15 { +#define CPU_FIELD(type, name) type name; +#include "schedstat-cpu-v15.h" +#undef CPU_FIELD +}; + +struct perf_record_schedstat_cpu { + struct perf_event_header header; + __u16 version; + __u64 timestamp; + __u32 cpu; + union { + struct perf_record_schedstat_cpu_v15 v15; + }; +}; + +struct perf_record_schedstat_domain_v15 { +#define DOMAIN_FIELD(type, name) type name; +#include "schedstat-domain-v15.h" +#undef DOMAIN_FIELD +}; + +struct perf_record_schedstat_domain { + struct perf_event_header header; + __u16 version; + __u64 timestamp; + __u32 cpu; + __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, @@ -472,6 +505,8 @@ enum perf_user_event_type { /* above any possible kerne= l type */ PERF_RECORD_HEADER_FEATURE =3D 80, PERF_RECORD_COMPRESSED =3D 81, PERF_RECORD_FINISHED_INIT =3D 82, + PERF_RECORD_SCHEDSTAT_CPU =3D 83, + PERF_RECORD_SCHEDSTAT_DOMAIN =3D 84, PERF_RECORD_HEADER_MAX }; =20 @@ -512,6 +547,8 @@ union perf_event { struct perf_record_time_conv time_conv; struct perf_record_header_feature feat; struct perf_record_compressed pack; + 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-cpu-v15.h b/tools/lib/pe= rf/include/perf/schedstat-cpu-v15.h new file mode 100644 index 000000000000..8dca84b11902 --- /dev/null +++ b/tools/lib/perf/include/perf/schedstat-cpu-v15.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifdef CPU_FIELD +CPU_FIELD(__u32, yld_count) +CPU_FIELD(__u32, array_exp) +CPU_FIELD(__u32, sched_count) +CPU_FIELD(__u32, sched_goidle) +CPU_FIELD(__u32, ttwu_count) +CPU_FIELD(__u32, ttwu_local) +CPU_FIELD(__u64, rq_cpu_time) +CPU_FIELD(__u64, run_delay) +CPU_FIELD(__u64, pcount) +#endif diff --git a/tools/lib/perf/include/perf/schedstat-domain-v15.h b/tools/lib= /perf/include/perf/schedstat-domain-v15.h new file mode 100644 index 000000000000..181b1c10395c --- /dev/null +++ b/tools/lib/perf/include/perf/schedstat-domain-v15.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifdef DOMAIN_FIELD +DOMAIN_FIELD(__u32, idle_lb_count) +DOMAIN_FIELD(__u32, idle_lb_balanced) +DOMAIN_FIELD(__u32, idle_lb_failed) +DOMAIN_FIELD(__u32, idle_lb_imbalance) +DOMAIN_FIELD(__u32, idle_lb_gained) +DOMAIN_FIELD(__u32, idle_lb_hot_gained) +DOMAIN_FIELD(__u32, idle_lb_nobusyq) +DOMAIN_FIELD(__u32, idle_lb_nobusyg) +DOMAIN_FIELD(__u32, busy_lb_count) +DOMAIN_FIELD(__u32, busy_lb_balanced) +DOMAIN_FIELD(__u32, busy_lb_failed) +DOMAIN_FIELD(__u32, busy_lb_imbalance) +DOMAIN_FIELD(__u32, busy_lb_gained) +DOMAIN_FIELD(__u32, busy_lb_hot_gained) +DOMAIN_FIELD(__u32, busy_lb_nobusyq) +DOMAIN_FIELD(__u32, busy_lb_nobusyg) +DOMAIN_FIELD(__u32, newidle_lb_count) +DOMAIN_FIELD(__u32, newidle_lb_balanced) +DOMAIN_FIELD(__u32, newidle_lb_failed) +DOMAIN_FIELD(__u32, newidle_lb_imbalance) +DOMAIN_FIELD(__u32, newidle_lb_gained) +DOMAIN_FIELD(__u32, newidle_lb_hot_gained) +DOMAIN_FIELD(__u32, newidle_lb_nobusyq) +DOMAIN_FIELD(__u32, newidle_lb_nobusyg) +DOMAIN_FIELD(__u32, alb_count) +DOMAIN_FIELD(__u32, alb_failed) +DOMAIN_FIELD(__u32, alb_pushed) +DOMAIN_FIELD(__u32, sbe_count) +DOMAIN_FIELD(__u32, sbe_balanced) +DOMAIN_FIELD(__u32, sbe_pushed) +DOMAIN_FIELD(__u32, sbf_count) +DOMAIN_FIELD(__u32, sbf_balanced) +DOMAIN_FIELD(__u32, sbf_pushed) +DOMAIN_FIELD(__u32, ttwu_wake_remote) +DOMAIN_FIELD(__u32, ttwu_move_affine) +DOMAIN_FIELD(__u32, ttwu_move_balance) +#endif diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index a212678d47be..28b8c1366446 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -2204,6 +2204,8 @@ int cmd_inject(int argc, const char **argv) .finished_init =3D perf_event__repipe_op2_synth, .compressed =3D perf_event__repipe_op4_synth, .auxtrace =3D perf_event__repipe_auxtrace, + .schedstat_cpu =3D perf_event__repipe_op2_synth, + .schedstat_domain =3D perf_event__repipe_op2_synth, }, .input_name =3D "-", .samples =3D LIST_HEAD_INIT(inject.samples), diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 717bdf113241..70bcd36fe1d3 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -19,6 +19,8 @@ #include "util/string2.h" #include "util/callchain.h" #include "util/time-utils.h" +#include "util/synthetic-events.h" +#include "util/target.h" =20 #include #include @@ -229,8 +231,13 @@ struct perf_sched { struct perf_time_interval ptime; struct perf_time_interval hist_time; volatile bool thread_funcs_exit; + + struct perf_session *session; + struct perf_data *data; }; =20 +static struct perf_sched perf_sched; + /* per thread run time data */ struct thread_runtime { u64 last_time; /* time of previous sched in/out event */ @@ -3504,14 +3511,156 @@ static int __cmd_record(int argc, const char **arg= v) return ret; } =20 +static int process_synthesized_event(struct perf_tool *tool __maybe_unused, + union perf_event *event, + struct perf_sample *sample __maybe_unused, + struct machine *machine __maybe_unused) +{ + if (perf_data__write(perf_sched.data, event, event->header.size) <=3D 0) { + pr_err("failed to write perf data, error: %m\n"); + return -1; + } + + perf_sched.session->header.data_size +=3D event->header.size; + return 0; +} + +static void sighandler(int sig __maybe_unused) +{ +} + /* perf.data or any other output file name used by schedstat subcommand (o= nly). */ const char *output_name; +static struct target target; =20 -static int perf_sched__schedstat_record(struct perf_sched *sched __maybe_u= nused, - int argc __maybe_unused, - const char **argv __maybe_unused) +static int perf_sched__schedstat_record(struct perf_sched *sched, + int argc, const char **argv) { - return 0; + struct perf_session *session; + struct evlist *evlist; + int err =3D 0; + FILE *fp; + int flag; + char ch; + 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"); + return PTR_ERR(session); + } + + session->evlist =3D evlist; + + perf_sched.session =3D session; + perf_sched.data =3D &data; + + fd =3D perf_data__fd(&data); + + /* + * Capture all important metadata about the system. Although they + * are not used by schedstat 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_CPU_PMU_CAPS); + perf_header__set_feat(&session->header, HEADER_HYBRID_TOPOLOGY); + perf_header__set_feat(&session->header, HEADER_PMU_CAPS); + + err =3D perf_session__write_header(session, evlist, fd, false); + if (err < 0) + goto out; + + /* FIXME. Quirk for evlist__prepare_workload() */ + target.system_wide =3D true; + + /* FIXME: -p support */ + if (argc) { + err =3D evlist__prepare_workload(evlist, &target, argv, false, NULL); + if (err) + goto out; + } + + err =3D perf_event__synthesize_schedstat(&(sched->tool), session, + &session->machines.host /* machine */, + process_synthesized_event); + if (err < 0) + goto out; + + fp =3D fopen("/proc/sys/kernel/sched_schedstats", "w+"); + if (!fp) { + printf("Failed to open /proc/sys/kernel/sched_schedstats"); + goto out; + } + + ch =3D getc(fp); + if (ch =3D=3D '0') { + flag =3D 1; + rewind(fp); + putc('1', fp); + fclose(fp); + } + + if (argc) + evlist__start_workload(evlist); + + /* wait for signal */ + pause(); + + err =3D perf_event__synthesize_schedstat(&(sched->tool), session, + &session->machines.host /* machine */, + process_synthesized_event); + + if (flag =3D=3D 1) { + fp =3D fopen("/proc/sys/kernel/sched_schedstats", "w"); + if (!fp) { + printf("Failed to open /proc/sys/kernel/sched_schedstats"); + goto out; + } + + putc('0', fp); + fclose(fp); + } + + if (err < 0) + goto out; + + err =3D perf_session__write_header(session, evlist, fd, true); + + if (!err) + fprintf(stderr, "[ perf sched schedstat: Wrote samples to %s ]\n", data.= path); + else + fprintf(stderr, "[ perf sched schedstat: Failed !! ]\n"); + +out: + close(fd); + perf_session__delete(session); + + return err; } =20 static int perf_sched__schedstat_report(struct perf_sched *sched __maybe_u= nused) diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index f32f9abf6344..f2b10bc44a9e 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -77,6 +77,8 @@ static const char *perf_event__names[] =3D { [PERF_RECORD_HEADER_FEATURE] =3D "FEATURE", [PERF_RECORD_COMPRESSED] =3D "COMPRESSED", [PERF_RECORD_FINISHED_INIT] =3D "FINISHED_INIT", + [PERF_RECORD_SCHEDSTAT_CPU] =3D "SCHEDSTAT_CPU", + [PERF_RECORD_SCHEDSTAT_DOMAIN] =3D "SCHEDSTAT_DOMAIN", }; =20 const char *perf_event__name(unsigned int id) @@ -587,6 +589,58 @@ size_t perf_event__fprintf(union perf_event *event, st= ruct machine *machine, FIL return ret; } =20 +static size_t __fprintf_schedstat_cpu_v15(union perf_event *event, FILE *f= p) +{ + struct perf_record_schedstat_cpu_v15 *csv15; + size_t size =3D 0; + + size =3D fprintf(fp, "\ncpu%u ", event->schedstat_cpu.cpu); + csv15 =3D &event->schedstat_cpu.v15; + +#define CPU_FIELD(type, name) \ + size +=3D fprintf(fp, "%" PRIu64 " ", (unsigned long)csv15->name); + +#include +#undef CPU_FIELD + + return size; +} + +size_t perf_event__fprintf_schedstat_cpu(union perf_event *event, FILE *fp) +{ + if (event->schedstat_cpu.version =3D=3D 15) + return __fprintf_schedstat_cpu_v15(event, fp); + + return fprintf(fp, "Unsupported /proc/schedstat version %d.\n", + event->schedstat_cpu.version); +} + +static size_t __fprintf_schedstat_domain_v15(union perf_event *event, FILE= *fp) +{ + struct perf_record_schedstat_domain_v15 *dsv15; + size_t size =3D 0; + + size =3D fprintf(fp, "\ndomain%u ", event->schedstat_domain.domain); + dsv15 =3D &event->schedstat_domain.v15; + +#define DOMAIN_FIELD(type, name) \ + size +=3D fprintf(fp, "%" PRIu64 " ", (unsigned long)dsv15->name); + +#include +#undef DOMAIN_FIELD + + return size; +} + +size_t perf_event__fprintf_schedstat_domain(union perf_event *event, FILE = *fp) +{ + if (event->schedstat_domain.version =3D=3D 15) + return __fprintf_schedstat_domain_v15(event, fp); + + return fprintf(fp, "Unsupported /proc/schedstat version %d.\n", + event->schedstat_domain.version); +} + int perf_event__process(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample, diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index d8bcee2e9b93..c6ac391ce09c 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h @@ -356,6 +356,8 @@ size_t perf_event__fprintf_cgroup(union perf_event *eve= nt, FILE *fp); size_t perf_event__fprintf_ksymbol(union perf_event *event, FILE *fp); size_t perf_event__fprintf_bpf(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 a10343b9dcd4..676bfe022afd 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -480,6 +480,26 @@ static int perf_session__process_compressed_event_stub= (struct perf_session *sess return 0; } =20 +static int +process_schedstat_cpu_stub(struct perf_session *perf_session __maybe_unuse= d, + union perf_event *event) +{ + if (dump_trace) + perf_event__fprintf_schedstat_cpu(event, stdout); + dump_printf(": unhandled!\n"); + return 0; +} + +static int +process_schedstat_domain_stub(struct perf_session *perf_session __maybe_un= used, + union perf_event *event) +{ + if (dump_trace) + perf_event__fprintf_schedstat_domain(event, stdout); + dump_printf(": unhandled!\n"); + return 0; +} + void perf_tool__fill_defaults(struct perf_tool *tool) { if (tool->sample =3D=3D NULL) @@ -562,6 +582,10 @@ void perf_tool__fill_defaults(struct perf_tool *tool) tool->compressed =3D perf_session__process_compressed_event; if (tool->finished_init =3D=3D NULL) tool->finished_init =3D process_event_op2_stub; + if (tool->schedstat_cpu =3D=3D NULL) + tool->schedstat_cpu =3D process_schedstat_cpu_stub; + if (tool->schedstat_domain =3D=3D NULL) + tool->schedstat_domain =3D process_schedstat_domain_stub; } =20 static void swap_sample_id_all(union perf_event *event, void *data) @@ -996,6 +1020,20 @@ static void perf_event__time_conv_swap(union perf_eve= nt *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 @@ -1034,6 +1072,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 @@ -1744,6 +1784,10 @@ static s64 perf_session__process_user_event(struct p= erf_session *session, return err; case PERF_RECORD_FINISHED_INIT: return tool->finished_init(session, event); + case PERF_RECORD_SCHEDSTAT_CPU: + return tool->schedstat_cpu(session, event); + case PERF_RECORD_SCHEDSTAT_DOMAIN: + return tool->schedstat_domain(session, event); default: return -EINVAL; } diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index 5498048f56ea..b5cfd4797495 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -2430,3 +2430,173 @@ int parse_synth_opt(char *synth) =20 return ret; } + +static bool read_schedstat_cpu_v15(struct io *io, + struct perf_record_schedstat_cpu *cs) +{ + char ch; + + if (io__get_char(io) !=3D 'p' || io__get_char(io) !=3D 'u') + return false; + + if (io__get_dec(io, (__u64 *) &cs->cpu) !=3D ' ') + return false; + +#define CPU_FIELD(type, name) \ + do { \ + ch =3D io__get_dec(io, (__u64 *) &cs->v15.name); \ + if (ch !=3D ' ' && ch !=3D '\n') \ + return false; \ + } while (0); + +#include +#undef CPU_FIELD + + return true; +} + +static bool read_schedstat_domain_v15(struct io *io, + struct perf_record_schedstat_domain *ds) +{ + 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 false; + + if (io__get_dec(io, (__u64 *) &ds->domain) !=3D ' ') + return false; + + while (io__get_char(io) !=3D ' '); + +#define DOMAIN_FIELD(type, name) \ + do { \ + ch =3D io__get_dec(io, (__u64 *) &ds->v15.name); \ + if (ch !=3D ' ' && ch !=3D '\n') \ + return false; \ + } while (0); + +#include +#undef DOMAIN_FIELD + + return true; +} + +static union perf_event *__synthesize_schedstat_cpu_v15(struct io *io, __u= 16 *cpu, + __u64 timestamp, + struct machine *machine) +{ + union perf_event *event; + size_t size; + + size =3D sizeof(struct perf_record_schedstat_cpu); + event =3D zalloc(size + machine->id_hdr_size); + + if (!event) + return NULL; + + event->schedstat_cpu.header.type =3D PERF_RECORD_SCHEDSTAT_CPU; + event->schedstat_cpu.version =3D 15; + event->schedstat_cpu.timestamp =3D timestamp; + event->schedstat_cpu.header.size =3D size + machine->id_hdr_size; + + if (read_schedstat_cpu_v15(io, &event->schedstat_cpu)) { + *cpu =3D event->schedstat_cpu.cpu; + } else { + free(event); + return NULL; + } + + return event; +} + +static union perf_event *__synthesize_schedstat_domain_v15(struct io *io, = __u16 cpu, + __u64 timestamp, + struct machine *machine) +{ + union perf_event *event; + size_t size; + + size =3D sizeof(struct perf_record_schedstat_domain); + event =3D zalloc(size + machine->id_hdr_size); + + if (!event) + return NULL; + + event->schedstat_domain.header.type =3D PERF_RECORD_SCHEDSTAT_DOMAIN; + event->schedstat_domain.version =3D 15; + event->schedstat_domain.timestamp =3D timestamp; + event->schedstat_domain.header.size =3D size + machine->id_hdr_size; + + if (read_schedstat_domain_v15(io, &event->schedstat_domain)) { + event->schedstat_domain.cpu =3D cpu; + } else { + free(event); + return NULL; + } + + return event; +} + +int perf_event__synthesize_schedstat(struct perf_tool *tool, + struct perf_session *session __maybe_unused, + struct machine *machine, + perf_event__handler_t process) +{ + union perf_event *event =3D NULL; + size_t line_len =3D 0; + char *line =3D NULL; + char bf[BUFSIZ]; + __u64 timestamp; + __u16 cpu =3D -1; + struct io io; + int ret =3D -1; + char ch; + + io.fd =3D open("/proc/schedstat", O_RDONLY, 0); + if (io.fd < 0) { + pr_debug("Failed to open /proc/schedstat\n"); + 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")) { + pr_debug("Unsupported /proc/schedstat version\n"); + goto out_free_line; + } + + if (io__getline(&io, &line, &line_len) < 0 || !line_len) + goto out_free_ev; + timestamp =3D atol(line + 10); + + ch =3D io__get_char(&io); + + while (!io.eof) { + if (ch =3D=3D 'c') { + event =3D __synthesize_schedstat_cpu_v15(&io, &cpu, timestamp, + machine); + } else if (ch =3D=3D 'd') { + event =3D __synthesize_schedstat_domain_v15(&io, cpu, timestamp, + machine); + } + if (!event) + goto out_free_line; + + if (process(tool, event, NULL, NULL) < 0) + goto out_free_ev; + + ch =3D io__get_char(&io); + } + + ret =3D 0; + +out_free_ev: + free(event); +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 53737d1619a4..31498b8426fc 100644 --- a/tools/perf/util/synthetic-events.h +++ b/tools/perf/util/synthetic-events.h @@ -122,4 +122,8 @@ int perf_event__synthesize_for_pipe(struct perf_tool *t= ool, struct perf_data *data, perf_event__handler_t process); =20 +int perf_event__synthesize_schedstat(struct perf_tool *tool, + struct perf_session *session, + struct machine *machine, + perf_event__handler_t process); #endif // __PERF_SYNTHETIC_EVENTS_H diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h index c957fb849ac6..fe763db8a7ad 100644 --- a/tools/perf/util/tool.h +++ b/tools/perf/util/tool.h @@ -77,7 +77,9 @@ struct perf_tool { stat, stat_round, feature, - finished_init; + finished_init, + schedstat_cpu, + schedstat_domain; event_op4 compressed; event_op3 auxtrace; bool ordered_events; --=20 2.44.0 From nobody Wed Dec 17 05:50:42 2025 Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2045.outbound.protection.outlook.com [40.107.220.45]) (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 EC80B23778; Wed, 8 May 2024 06:05:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.220.45 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715148353; cv=fail; b=NoqysczsNPKSGJ3QniGsqo44sDH6rF0XAe3zbx9BPw9BWQGPPhtDfkrMn3niH50WUKO7ogreISkGlKZm0gLXk86Qoo4/EVA4BwrlI4K9bicykqpFkFPdattqyhGqanZdj788kzJRYvypRfFtAupHsyKc+jQZKTy7XwVtkB0c2sw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715148353; c=relaxed/simple; bh=h1jCIxOzJoa0YwMCYeSZ6vZTGJXSjWp5ZrZGn/hcwbM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qcAk2xrI/3J9pM18/dDJ+9Hn+a0YKMKDVPjQrv/6wsIAqrdRCYHVKwQwcMv6pE9kfNwrN2oQqrk8CSpn2wLkN7JnWoWY+zZde5rLvrxsIZj1HgT7UIb55JOsSAidnbIJ6Pz0PzOIqY51Cnw+uRye1eqfTQSmGQKix00e+a6H5fE= 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=xRNPfzUF; arc=fail smtp.client-ip=40.107.220.45 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="xRNPfzUF" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=aSGrz+Ml7QbbHOn+OoeArOJ86+MDKTOf2dF7TjUP5mMMOKdqKWil5biC9VLdmjOou2ndzH0/xbA1SPdRytmQMCaYhbK473LMw8nUPAa7I1WS0bourwVQ4AKbo6etIcb/FViSY5U0Sertrz6s7ITnjzGN06UujHsXCf+pH4XMpmpg/KgJvJGqYEY92nMv3vM9zNA/tezMOAGCV/ndH51xUP9xWlvlIufFZ691xp1LSt2oZw1o0uyNwWlAS4KSMvnlZ7qzU223mlvOgwchXrxQRRzByRV3Xak0WHo9+e9ReVBWmq93q/z7WcQHrWTAcz6RYGbvZroOeDg3gBxqp3sF0Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=6JykRg42pkYFH1NPnpO37Y76iVqFWpjez1BPDlx5YHE=; b=UbRLyYnMT3LrLGOREjz+Qv+CEoqqCb2qsy/k+Ecj/0GiPjWAVWU6wOCRcnjAxskqBaGkje6jS68oVMc4+gjmkyvZzaecWtN5ALmqZgbldAOoVQSilrxpxGactXKViqsVDS55vQ6qw6nrOpqVPZCHCJgWPhnAAvIjK40sk0JqRDdFOB2mE2+rZVGs7VRAUt/rvIjqHYT2uGrE8WQ/AB/DL2MTxAEoEMBUkzoshlfWjohwbeVV2oFeHii1qhdVH8oaf76vyATf+IpNUaFHLl6pDJfV9eG9KmBVFudk3q205VYlU1+udvMU5R9aK38IRjA0g+cxsPo7tdTZVv05GoOK2Q== 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=6JykRg42pkYFH1NPnpO37Y76iVqFWpjez1BPDlx5YHE=; b=xRNPfzUFCFJjcEaTWwIEm+cmqkq7uKehuwrjQafaPFp7bxdNB19rHzYXBCnL/tiNfhjgQ+tvGNwCUiitKwKiTBdTyP5mI7lEHTujDGliHBj7HFNCYnZfLO9dkXLatAz+OOUHVmCuJbDLbk65vbLSk8cMn90cuo1bzKPIBZXyCDU= Received: from PH0PR07CA0006.namprd07.prod.outlook.com (2603:10b6:510:5::11) by DS7PR12MB8372.namprd12.prod.outlook.com (2603:10b6:8:eb::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.42; Wed, 8 May 2024 06:05:47 +0000 Received: from CY4PEPF0000FCC2.namprd03.prod.outlook.com (2603:10b6:510:5:cafe::26) by PH0PR07CA0006.outlook.office365.com (2603:10b6:510:5::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.42 via Frontend Transport; Wed, 8 May 2024 06:05:47 +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=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CY4PEPF0000FCC2.mail.protection.outlook.com (10.167.242.104) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7544.18 via Frontend Transport; Wed, 8 May 2024 06:05:46 +0000 Received: from BLR-5CG113396H.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Wed, 8 May 2024 01:05:36 -0500 From: Ravi Bangoria To: , , , , CC: , , , , , , , , , , , , , , , , , , , Subject: [RFC 4/4] perf sched schedstat: Add support for report subcommand Date: Wed, 8 May 2024 11:34:27 +0530 Message-ID: <20240508060427.417-5-ravi.bangoria@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240508060427.417-1-ravi.bangoria@amd.com> References: <20240508060427.417-1-ravi.bangoria@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: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000FCC2:EE_|DS7PR12MB8372:EE_ X-MS-Office365-Filtering-Correlation-Id: 390e00a7-746a-4b95-719d-08dc6f24e72b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230031|82310400017|7416005|376005|1800799015|36860700004; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?rxV5KiSFM0FEy+iitqbn+uBUt+C6SaKUNGPfrgE0gd2Mpxs/v3tgrSNlPFgI?= =?us-ascii?Q?H5PJJ+Eu+ZSmWvDfIH5pORWvSANl26ASBet2Y2jPVjleCClPR+pYN9xRM4R9?= =?us-ascii?Q?nExrXzPQWQX4m8Jt8cbSW7MspsHpslD36iQK3shV6bamu9LcYjHopdjP4d5z?= =?us-ascii?Q?2hvzdZ6rRSlE47/AMjfRi2A8pydBgdqUyY8w4JuTP+h0Iu/JLbM9uTUZM/qz?= =?us-ascii?Q?XNq1I/RP0rIwxsnTgtYc86YNXffZ9Ju/J1GxZPptXoy0b36se9NV7m/IIg3y?= =?us-ascii?Q?UmGONlk+dd3ENA1f4Z1YW//9Zd0b7L42XWwKQ7qodrDhRnOz04cBPYddL/cr?= =?us-ascii?Q?+raTg0R+mnAIs0BUhg6PG0qQNED37Q/5B7wrRQt4rFvENSOP00ZWrfHA0aNx?= =?us-ascii?Q?jA8h047OkohkNj+zwwUaPhaUAMOJvEeOW2nObuAsJctgbat3uOCVlzNNfbV2?= =?us-ascii?Q?SJlAzfQhK6xYEC9p2jkv4Drp6DlGn7Zs/y+f7KjznGaNZv8Uo5URCf9Yv6CK?= =?us-ascii?Q?7TenL6HxHwsr2YCsW0AOZno3wgwBMt4ZpRybhH9+vL4HUgTpIW1FV97f4aXN?= =?us-ascii?Q?2VLtDvL6Vj7AUYK8VZLmu2JELIaLxXbXzxWbmOmNT1HBtbVjGEt6n16Xthzc?= =?us-ascii?Q?hFICsGC8CONJr8Bz/sLViMrQ0QsvE0WFEXnf7wUVj2NXGCeGjI2GhLVLhilu?= =?us-ascii?Q?dpkdBc/EXINVLNM/sCxX1xAQUv1cwCxuXJfWAKJhafyaPJe1dqB6TFdDqCbA?= =?us-ascii?Q?LIjDqtFIC+qLl5ZA2AP/dRd0cZV7XbjesM4rOdA17GAEjwr3vrhK1oBgsPCL?= =?us-ascii?Q?3V7rQVDKGqaqdIfhGTrvtrMKbwcNJTU2hO+4GhF/53tabpp79HDqUskz8Gg9?= =?us-ascii?Q?xgd1e2qtjt3pppm/6DH7k7fthPT+UNKP9ZrYeP34t4AlEkGXMBup20v14z2D?= =?us-ascii?Q?SwkNbYLi5Iz8JwOBxbs9HgwdpQSiGYpUqkXEQnCVCHFYMd150RxYad62pNqy?= =?us-ascii?Q?2Fjb5zwP6H7wXZs6D8aJRv2TPyvByKuJVvYljyB6tKutkMOh3bryclfqp8Ez?= =?us-ascii?Q?EwlPly/Q9blLeZkcAoyQHILlIKYx1kDo5gGeGvaRQGEiC4ctUWnot/u+12VB?= =?us-ascii?Q?Qz/8Ub4Uy3nYWF5rN7Ox24nL0boXCv93rUo3iP76TQbt3FJ9k5NzcHoen1iJ?= =?us-ascii?Q?w9fqCX9jfOdtOSsAg7EkOSRvZ68KWYIGPBNDyygCzDUQlVH3J+q0kOSRqps0?= =?us-ascii?Q?K/Y4c1qnU1qnteCCC+/WbDq8gD/TZ/Tx0YX4VB7EM22Szo9uAT/OFVFrZBOi?= =?us-ascii?Q?qclCfmESE58ue8Ef0r+3rmRqmcVWO3a00oqV6QnCiLfSzwDBkatAjdITXByj?= =?us-ascii?Q?SOEowU+iFp+HsNdbXbAHTSs1PiWg?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(82310400017)(7416005)(376005)(1800799015)(36860700004);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 May 2024 06:05:46.6563 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 390e00a7-746a-4b95-719d-08dc6f24e72b 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=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000FCC2.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB8372 Content-Type: text/plain; charset="utf-8" From: Swapnil Sapkal `perf sched schedstat 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 schedstat 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. Usage example: # perf sched schedstat record # perf sched schedstat report Co-developed-by: Ravi Bangoria Signed-off-by: Swapnil Sapkal Signed-off-by: Ravi Bangoria --- tools/lib/perf/include/perf/event.h | 4 +- .../lib/perf/include/perf/schedstat-cpu-v15.h | 29 +- .../perf/include/perf/schedstat-domain-v15.h | 153 ++++++++--- tools/perf/builtin-sched.c | 254 +++++++++++++++++- tools/perf/util/event.c | 4 +- tools/perf/util/synthetic-events.c | 4 +- 6 files changed, 395 insertions(+), 53 deletions(-) diff --git a/tools/lib/perf/include/perf/event.h b/tools/lib/perf/include/p= erf/event.h index 835bb3e2dcbf..53a58d4ebd17 100644 --- a/tools/lib/perf/include/perf/event.h +++ b/tools/lib/perf/include/perf/event.h @@ -452,7 +452,7 @@ struct perf_record_compressed { }; =20 struct perf_record_schedstat_cpu_v15 { -#define CPU_FIELD(type, name) type name; +#define CPU_FIELD(type, name, desc, format, is_pct, pct_of) type name; #include "schedstat-cpu-v15.h" #undef CPU_FIELD }; @@ -468,7 +468,7 @@ struct perf_record_schedstat_cpu { }; =20 struct perf_record_schedstat_domain_v15 { -#define DOMAIN_FIELD(type, name) type name; +#define DOMAIN_FIELD(type, name, desc, format, is_jiffies) type name; #include "schedstat-domain-v15.h" #undef DOMAIN_FIELD }; diff --git a/tools/lib/perf/include/perf/schedstat-cpu-v15.h b/tools/lib/pe= rf/include/perf/schedstat-cpu-v15.h index 8dca84b11902..96a9aba3d2cf 100644 --- a/tools/lib/perf/include/perf/schedstat-cpu-v15.h +++ b/tools/lib/perf/include/perf/schedstat-cpu-v15.h @@ -1,13 +1,22 @@ /* SPDX-License-Identifier: GPL-2.0 */ =20 #ifdef CPU_FIELD -CPU_FIELD(__u32, yld_count) -CPU_FIELD(__u32, array_exp) -CPU_FIELD(__u32, sched_count) -CPU_FIELD(__u32, sched_goidle) -CPU_FIELD(__u32, ttwu_count) -CPU_FIELD(__u32, ttwu_local) -CPU_FIELD(__u64, rq_cpu_time) -CPU_FIELD(__u64, run_delay) -CPU_FIELD(__u64, pcount) -#endif +CPU_FIELD(__u32, yld_count, "sched_yield() count", + "%11u", false, yld_count) +CPU_FIELD(__u32, array_exp, "Legacy counter can be ignored", + "%11u", false, array_exp) +CPU_FIELD(__u32, sched_count, "schedule() called", + "%11u", false, sched_count) +CPU_FIELD(__u32, sched_goidle, "schedule() left the processor idle", + "%11u", true, sched_count) +CPU_FIELD(__u32, ttwu_count, "try_to_wake_up() was called", + "%11u", false, ttwu_count) +CPU_FIELD(__u32, ttwu_local, "try_to_wake_up() was called to wake up the l= ocal cpu", + "%11u", true, ttwu_count) +CPU_FIELD(__u64, rq_cpu_time, "total runtime by tasks on this processor (i= n jiffies)", + "%11llu", false, rq_cpu_time) +CPU_FIELD(__u64, run_delay, "total waittime by tasks on this processor (in= jiffies)", + "%11llu", true, rq_cpu_time) +CPU_FIELD(__u64, pcount, "total timeslices run on this cpu", + "%11llu", false, pcount) +#endif /* CPU_FIELD */ diff --git a/tools/lib/perf/include/perf/schedstat-domain-v15.h b/tools/lib= /perf/include/perf/schedstat-domain-v15.h index 181b1c10395c..5d8d65f79674 100644 --- a/tools/lib/perf/include/perf/schedstat-domain-v15.h +++ b/tools/lib/perf/include/perf/schedstat-domain-v15.h @@ -1,40 +1,121 @@ /* SPDX-License-Identifier: GPL-2.0 */ =20 #ifdef DOMAIN_FIELD -DOMAIN_FIELD(__u32, idle_lb_count) -DOMAIN_FIELD(__u32, idle_lb_balanced) -DOMAIN_FIELD(__u32, idle_lb_failed) -DOMAIN_FIELD(__u32, idle_lb_imbalance) -DOMAIN_FIELD(__u32, idle_lb_gained) -DOMAIN_FIELD(__u32, idle_lb_hot_gained) -DOMAIN_FIELD(__u32, idle_lb_nobusyq) -DOMAIN_FIELD(__u32, idle_lb_nobusyg) -DOMAIN_FIELD(__u32, busy_lb_count) -DOMAIN_FIELD(__u32, busy_lb_balanced) -DOMAIN_FIELD(__u32, busy_lb_failed) -DOMAIN_FIELD(__u32, busy_lb_imbalance) -DOMAIN_FIELD(__u32, busy_lb_gained) -DOMAIN_FIELD(__u32, busy_lb_hot_gained) -DOMAIN_FIELD(__u32, busy_lb_nobusyq) -DOMAIN_FIELD(__u32, busy_lb_nobusyg) -DOMAIN_FIELD(__u32, newidle_lb_count) -DOMAIN_FIELD(__u32, newidle_lb_balanced) -DOMAIN_FIELD(__u32, newidle_lb_failed) -DOMAIN_FIELD(__u32, newidle_lb_imbalance) -DOMAIN_FIELD(__u32, newidle_lb_gained) -DOMAIN_FIELD(__u32, newidle_lb_hot_gained) -DOMAIN_FIELD(__u32, newidle_lb_nobusyq) -DOMAIN_FIELD(__u32, newidle_lb_nobusyg) -DOMAIN_FIELD(__u32, alb_count) -DOMAIN_FIELD(__u32, alb_failed) -DOMAIN_FIELD(__u32, alb_pushed) -DOMAIN_FIELD(__u32, sbe_count) -DOMAIN_FIELD(__u32, sbe_balanced) -DOMAIN_FIELD(__u32, sbe_pushed) -DOMAIN_FIELD(__u32, sbf_count) -DOMAIN_FIELD(__u32, sbf_balanced) -DOMAIN_FIELD(__u32, sbf_pushed) -DOMAIN_FIELD(__u32, ttwu_wake_remote) -DOMAIN_FIELD(__u32, ttwu_move_affine) -DOMAIN_FIELD(__u32, ttwu_move_balance) +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY("") #endif +DOMAIN_FIELD(__u32, idle_lb_count, + "load_balance() count on cpu idle", "%11u", true) +DOMAIN_FIELD(__u32, idle_lb_balanced, + "load_balance() found balanced on cpu idle", "%11u", true) +DOMAIN_FIELD(__u32, idle_lb_failed, + "load_balance() move task failed on cpu idle", "%11u", true) +DOMAIN_FIELD(__u32, idle_lb_imbalance, + "imbalance sum on cpu idle", "%11u", false) +DOMAIN_FIELD(__u32, idle_lb_gained, + "pull_task() count on cpu idle", "%11u", false) +DOMAIN_FIELD(__u32, idle_lb_hot_gained, + "pull_task() when target task was cache-hot on cpu idle", "%11u", fa= lse) +DOMAIN_FIELD(__u32, idle_lb_nobusyq, + "load_balance() failed to find busier queue on cpu idle", "%11u", tr= ue) +DOMAIN_FIELD(__u32, idle_lb_nobusyg, + "load_balance() failed to find busier group on cpu idle", "%11u", tr= ue) +#ifdef DERIVED_CNT_FIELD +DERIVED_CNT_FIELD("load_balance() success count on cpu idle", "%11u", + idle_lb_count, idle_lb_balanced, idle_lb_failed) +#endif +#ifdef DERIVED_AVG_FIELD +DERIVED_AVG_FIELD("avg task pulled per successful lb attempt (cpu idle)", = "%11.2Lf", + idle_lb_count, idle_lb_balanced, idle_lb_failed, idle_lb_gained) +#endif +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY("") +#endif +DOMAIN_FIELD(__u32, busy_lb_count, + "load_balance() count on cpu busy", "%11u", true) +DOMAIN_FIELD(__u32, busy_lb_balanced, + "load_balance() found balanced on cpu busy", "%11u", true) +DOMAIN_FIELD(__u32, busy_lb_failed, + "load_balance() move task failed on cpu busy", "%11u", true) +DOMAIN_FIELD(__u32, busy_lb_imbalance, + "imbalance sum on cpu busy", "%11u", false) +DOMAIN_FIELD(__u32, busy_lb_gained, + "pull_task() count on cpu busy", "%11u", false) +DOMAIN_FIELD(__u32, busy_lb_hot_gained, + "pull_task() when target task was cache-hot on cpu busy", "%11u", fa= lse) +DOMAIN_FIELD(__u32, busy_lb_nobusyq, + "load_balance() failed to find busier queue on cpu busy", "%11u", tr= ue) +DOMAIN_FIELD(__u32, busy_lb_nobusyg, + "load_balance() failed to find busier group on cpu busy", "%11u", tr= ue) +#ifdef DERIVED_CNT_FIELD +DERIVED_CNT_FIELD("load_balance() success count on cpu busy", "%11u", + busy_lb_count, busy_lb_balanced, busy_lb_failed) +#endif +#ifdef DERIVED_AVG_FIELD +DERIVED_AVG_FIELD("avg task pulled per successful lb attempt (cpu busy)", = "%11.2Lf", + busy_lb_count, busy_lb_balanced, busy_lb_failed, busy_lb_gained) +#endif +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY("") +#endif +DOMAIN_FIELD(__u32, newidle_lb_count, + "load_balance() count on cpu newly idle", "%11u", true) +DOMAIN_FIELD(__u32, newidle_lb_balanced, + "load_balance() found balanced on cpu newly idle", "%11u", true) +DOMAIN_FIELD(__u32, newidle_lb_failed, + "load_balance() move task failed on cpu newly idle", "%11u", true) +DOMAIN_FIELD(__u32, newidle_lb_imbalance, + "imbalance sum on cpu newly idle", "%11u", false) +DOMAIN_FIELD(__u32, newidle_lb_gained, + "pull_task() count on cpu newly idle", "%11u", false) +DOMAIN_FIELD(__u32, newidle_lb_hot_gained, + "pull_task() when target task was cache-hot on cpu newly idle", "%11= u", false) +DOMAIN_FIELD(__u32, newidle_lb_nobusyq, + "load_balance() failed to find busier queue on cpu newly idle", "%11= u", true) +DOMAIN_FIELD(__u32, newidle_lb_nobusyg, + "load_balance() failed to find busier group on cpu newly idle", "%11= u", true) +#ifdef DERIVED_CNT_FIELD +DERIVED_CNT_FIELD("load_balance() success count on cpu newly idle", "%11u", + newidle_lb_count, newidle_lb_balanced, newidle_lb_failed) +#endif +#ifdef DERIVED_AVG_FIELD +DERIVED_AVG_FIELD("avg task pulled per successful lb attempt (cpu newly id= le)", "%11.2Lf", + newidle_lb_count, newidle_lb_balanced, newidle_lb_failed, newidle_lb_g= ained) +#endif +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY("") +#endif +DOMAIN_FIELD(__u32, alb_count, + "active_load_balance() count", "%11u", false) +DOMAIN_FIELD(__u32, alb_failed, + "active_load_balance() move task failed", "%11u", false) +DOMAIN_FIELD(__u32, alb_pushed, + "active_load_balance() successfully moved a task", "%11u", false) +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY("") +#endif +DOMAIN_FIELD(__u32, sbe_count, + "sbe_count is not used", "%11u", false) +DOMAIN_FIELD(__u32, sbe_balanced, + "sbe_balanced is not used", "%11u", false) +DOMAIN_FIELD(__u32, sbe_pushed, + "sbe_pushed is not used", "%11u", false) +#ifdef DOMAIN_CATEGORY +DOMAIN_CATEGORY("") +#endif +DOMAIN_FIELD(__u32, sbf_count, + "sbf_count is not used", "%11u", false) +DOMAIN_FIELD(__u32, sbf_balanced, + "sbf_balanced is not used", "%11u", false) +DOMAIN_FIELD(__u32, sbf_pushed, + "sbf_pushed is not used", "%11u", false) +#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) +DOMAIN_FIELD(__u32, ttwu_move_affine, + "try_to_wake_up() moved task because cache-cold on own cpu", "%11u",= false) +DOMAIN_FIELD(__u32, ttwu_move_balance, + "try_to_wake_up() started passive balancing", "%11u", false) +#endif /* DOMAIN_FIELD */ diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 70bcd36fe1d3..26f7b2ee12e1 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -3663,11 +3663,263 @@ static int perf_sched__schedstat_record(struct per= f_sched *sched, return err; } =20 -static int perf_sched__schedstat_report(struct perf_sched *sched __maybe_u= nused) +struct schedstat_domain { + struct perf_record_schedstat_domain domain_data; + struct schedstat_domain *next; +}; + +struct schedstat_cpu { + struct perf_record_schedstat_cpu cpu_data; + struct schedstat_domain *domain_head; + struct schedstat_cpu *next; +}; + +struct schedstat_cpu *cpu_head =3D NULL, *cpu_tail =3D NULL, *cpu_second_p= ass =3D NULL; +struct schedstat_domain *domain_tail =3D NULL, *domain_second_pass =3D NUL= L; + +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; + +#define CPU_FIELD(type, name, desc, format, is_pct, pct_of) \ + (before->v15.name =3D after->v15.name - before->v15.name); + +#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->doma= in_data; + struct perf_record_schedstat_domain *after =3D &after_workload->domain_da= ta; + +#define DOMAIN_FIELD(type, name, desc, format, is_jiffies) \ + (before->v15.name =3D after->v15.name - before->v15.name); + +#include +#undef DOMAIN_FIELD +} + +static void print_separator(int pre_dash_cnt, const char *s, int post_dash= _cnt) { + int i; + + for (i =3D 0; i < pre_dash_cnt; ++i) + printf("-"); + + printf("%s", s); + + for (i =3D 0; i < post_dash_cnt; ++i) + printf("-"); + + printf("\n"); +} + +static inline void print_cpu_stats(struct perf_record_schedstat_cpu *cs) +{ +#define CALC_PCT(x, y) ((y) ? ((double)(x) / (y)) * 100 : 0.0) + +#define CPU_FIELD(type, name, desc, format, is_pct, pct_of) \ + do { \ + if (is_pct) { \ + printf("%-60s: " format " ( %3.2lf%% )\n", desc, \ + cs->v15.name, \ + CALC_PCT(cs->v15.name, cs->v15.pct_of)); \ + } else { \ + printf("%-60s: " format "\n", desc, cs->v15.name); \ + } \ + } while (0); + +#include + +#undef CPU_FIELD +#undef CALC_PCT +} + +static inline void print_domain_stats(struct perf_record_schedstat_domain = *ds, + __u64 jiffies) +{ +#define DOMAIN_CATEGORY(desc) \ + do { \ + int len =3D strlen(desc); \ + int pre_dash_cnt =3D (100 - len) / 2; \ + int post_dash_cnt =3D 100 - len - pre_dash_cnt; \ + print_separator(pre_dash_cnt, desc, 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) \ + do { \ + if (is_jiffies) { \ + printf("%-65s: " format " $ %11.2Lf $\n", desc, \ + ds->v15.name, \ + CALC_AVG(jiffies, ds->v15.name)); \ + } else { \ + printf("%-65s: " format "\n", desc, ds->v15.name); \ + } \ + } while (0); + +#define DERIVED_CNT_FIELD(desc, format, x, y, z) \ + do { \ + printf("*%-64s: " format "\n", desc, \ + (ds->v15.x) - (ds->v15.y) - (ds->v15.z)); \ + } while (0); + +#define DERIVED_AVG_FIELD(desc, format, x, y, z, w) \ + do { \ + printf("*%-64s: " format "\n", desc, CALC_AVG(ds->v15.w, \ + ((ds->v15.x) - (ds->v15.y) - (ds->v15.z)))); \ + } while (0); + +#include + +#undef DERIVED_AVG_FIELD +#undef DERIVED_CNT_FIELD +#undef DOMAIN_FIELD +#undef CALC_AVG +#undef DOMAIN_CATEGORY +} + +static void show_schedstat_data(void) +{ + struct perf_record_schedstat_domain *ds =3D NULL; + struct perf_record_schedstat_cpu *cs =3D NULL; + struct schedstat_cpu *cptr =3D cpu_head; + struct schedstat_domain *dptr =3D NULL; + __u64 jiffies =3D cptr->cpu_data.timestamp; + + print_separator(100, "", 0); + printf("Time elapsed (in jiffies) : %11l= lu\n", jiffies); + + while (cptr) { + cs =3D &cptr->cpu_data; + + print_separator(100, "", 0); + printf("CPU %u\n", cs->cpu); + print_separator(100, "", 0); + + print_cpu_stats(cs); + print_separator(100, "", 0); + + dptr =3D cptr->domain_head; + ds =3D &dptr->domain_data; + + while (dptr) { + printf("CPU %u DOMAIN %u\n", cs->cpu, ds->domain); + print_separator(100, "", 0); + print_domain_stats(ds, jiffies); + + dptr =3D dptr->next; + ds =3D &dptr->domain_data; + print_separator(100, "", 0); + } + cptr =3D cptr->next; + } +} + +static int perf_sched__process_schedstat(struct perf_session *session __ma= ybe_unused, + union perf_event *event) +{ + static bool after_workload_flag; + + if (event->header.type =3D=3D PERF_RECORD_SCHEDSTAT_CPU) { + struct schedstat_cpu *temp =3D + (struct schedstat_cpu *)malloc(sizeof(struct schedstat_cpu)); + temp->cpu_data =3D event->schedstat_cpu; + temp->next =3D NULL; + temp->domain_head =3D NULL; + + if (cpu_head && temp->cpu_data.cpu =3D=3D 0) + after_workload_flag =3D true; + + if (!after_workload_flag) { + if (temp->cpu_data.cpu =3D=3D 0) + cpu_head =3D temp; + else + cpu_tail->next =3D temp; + + cpu_tail =3D temp; + } else { + if (temp->cpu_data.cpu =3D=3D 0) { + cpu_second_pass =3D cpu_head; + cpu_head->cpu_data.timestamp =3D + temp->cpu_data.timestamp - cpu_second_pass->cpu_data.timestamp; + } else { + cpu_second_pass =3D cpu_second_pass->next; + } + domain_second_pass =3D cpu_second_pass->domain_head; + store_schedtstat_cpu_diff(temp); + } + } else if (event->header.type =3D=3D PERF_RECORD_SCHEDSTAT_DOMAIN) { + struct schedstat_domain *temp =3D + (struct schedstat_domain *)malloc(sizeof(struct schedstat_domain)); + temp->domain_data =3D event->schedstat_domain; + temp->next =3D NULL; + + if (!after_workload_flag) { + if (cpu_tail->domain_head =3D=3D NULL) { + cpu_tail->domain_head =3D temp; + domain_tail =3D temp; + } else { + domain_tail->next =3D temp; + domain_tail =3D temp; + } + } else { + store_schedstat_domain_diff(temp); + domain_second_pass =3D domain_second_pass->next; + } + } + return 0; } =20 +static void free_schedstat(void) +{ + struct schedstat_cpu *cptr =3D cpu_head, *tmp_cptr; + struct schedstat_domain *dptr =3D NULL, *tmp_dptr; + + while (cptr) { + tmp_cptr =3D cptr; + dptr =3D cptr->domain_head; + + while (dptr) { + tmp_dptr =3D dptr; + dptr =3D dptr->next; + free(tmp_dptr); + } + cptr =3D cptr->next; + free(tmp_cptr); + } +} + +static int perf_sched__schedstat_report(struct perf_sched *sched) +{ + struct perf_session *session; + struct perf_data data =3D { + .path =3D input_name, + .mode =3D PERF_DATA_MODE_READ, + }; + int err; + + 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); + } + + err =3D perf_session__process_events(session); + + perf_session__delete(session); + show_schedstat_data(); + free_schedstat(); + return err; +} + static const char default_sort_order[] =3D "avg, max, switch, runtime"; static struct perf_sched perf_sched =3D { .tool =3D { diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index f2b10bc44a9e..ad2f5392f145 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -597,7 +597,7 @@ static size_t __fprintf_schedstat_cpu_v15(union perf_ev= ent *event, FILE *fp) size =3D fprintf(fp, "\ncpu%u ", event->schedstat_cpu.cpu); csv15 =3D &event->schedstat_cpu.v15; =20 -#define CPU_FIELD(type, name) \ +#define CPU_FIELD(type, name, desc, format, is_pct, pct_of) \ size +=3D fprintf(fp, "%" PRIu64 " ", (unsigned long)csv15->name); =20 #include @@ -623,7 +623,7 @@ static size_t __fprintf_schedstat_domain_v15(union perf= _event *event, FILE *fp) size =3D fprintf(fp, "\ndomain%u ", event->schedstat_domain.domain); dsv15 =3D &event->schedstat_domain.v15; =20 -#define DOMAIN_FIELD(type, name) \ +#define DOMAIN_FIELD(type, name, desc, format, is_jiffies) \ size +=3D fprintf(fp, "%" PRIu64 " ", (unsigned long)dsv15->name); =20 #include diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index b5cfd4797495..1da0cc02e801 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -2442,7 +2442,7 @@ static bool read_schedstat_cpu_v15(struct io *io, if (io__get_dec(io, (__u64 *) &cs->cpu) !=3D ' ') return false; =20 -#define CPU_FIELD(type, name) \ +#define CPU_FIELD(type, name, desc, format, is_pct, pct_of) \ do { \ ch =3D io__get_dec(io, (__u64 *) &cs->v15.name); \ if (ch !=3D ' ' && ch !=3D '\n') \ @@ -2469,7 +2469,7 @@ static bool read_schedstat_domain_v15(struct io *io, =20 while (io__get_char(io) !=3D ' '); =20 -#define DOMAIN_FIELD(type, name) \ +#define DOMAIN_FIELD(type, name, desc, format, is_jiffies) \ do { \ ch =3D io__get_dec(io, (__u64 *) &ds->v15.name); \ if (ch !=3D ' ' && ch !=3D '\n') \ --=20 2.44.0