From nobody Wed Oct 8 02:01:45 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 0EE4718C01D; Thu, 3 Jul 2025 01:49:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507384; cv=none; b=YJboBieum7uxHvO8IR4ActaOYXN7zDfiWXI+0aVt7PTq463W37ZhdH6Gigj6yolWFNvmdGbtgIoRvCK8Cvh7/G6wkS35AjLhm9n0bJhl1J+0pt/o53//snu24d+UkzNAZl2PFhxuVaONThvyzCf2UtXuWfVggql7c8TVViLEvMY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507384; c=relaxed/simple; bh=2Ecqkg2lROeWhWTABKLBvt4hqMUUv7D6JgnQACCprWE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BvovkGcivxad+ESZBCzI4KkS6uWwTBXzFwJk3RiY8QTHRgKeg0GAW9v2ifRqgu0YYPJA0+sMU6hjbV5z4uyNba4rLhY9MLur20/p14jS2R9zrD8rxsf05n9gtFPGZKReMpW6wHLm1vLeN+P2wlX59BmI3u169Oy2P05DCX79QNk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=R5M249xL; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="R5M249xL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4130DC4CEF2; Thu, 3 Jul 2025 01:49:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751507383; bh=2Ecqkg2lROeWhWTABKLBvt4hqMUUv7D6JgnQACCprWE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=R5M249xLo/ROR3pgtJpOFATfsQeKehj8tID2jPeyNq/izfhmM+xd0KpCRDKP9AKgz 5YK+W55jwSMGQnKhof+jsj6jKt6ApLZx/LPufyWuPTntsAMDLsZ7gQjyrHsHl31JoH 3ezSbCXSgfg8x+2EsiHPAlWMaBxbLJm2XnlU1b+Rp0K/m9yYOsL2zGQ0pZUAmbgvyi XAjPKbkVdXGqXTiVvOeGu6XCoGsKmEMU9tDYRlNA1kcIrjmPRxzIc528A5ilNTpmzC tkOXc4FHNXnG+Xo7mwBZVv2WxfyL0gtu3YX09Ns1fDwXlEB5i1pW94fpmIFxeaX2we vfcG2D9K4Or4w== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org Subject: [PATCH 1/8] perf sched: Make sure it frees the usage string Date: Wed, 2 Jul 2025 18:49:35 -0700 Message-ID: <20250703014942.1369397-2-namhyung@kernel.org> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog In-Reply-To: <20250703014942.1369397-1-namhyung@kernel.org> References: <20250703014942.1369397-1-namhyung@kernel.org> 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 Content-Type: text/plain; charset="utf-8" The parse_options_subcommand() allocates the usage string based on the given subcommands. So it should reach the end of the function to free the string to prevent memory leaks. Signed-off-by: Namhyung Kim Reviewed-by: Ian Rogers Tested-by: Ian Rogers --- tools/perf/builtin-sched.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 26ece6e9bfd167b3..b7bbfad0ed600eee 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -3902,9 +3902,9 @@ int cmd_sched(int argc, const char **argv) * Aliased to 'perf script' for now: */ if (!strcmp(argv[0], "script")) { - return cmd_script(argc, argv); + ret =3D cmd_script(argc, argv); } else if (strlen(argv[0]) > 2 && strstarts("record", argv[0])) { - return __cmd_record(argc, argv); + ret =3D __cmd_record(argc, argv); } else if (strlen(argv[0]) > 2 && strstarts("latency", argv[0])) { sched.tp_handler =3D &lat_ops; if (argc > 1) { @@ -3913,7 +3913,7 @@ int cmd_sched(int argc, const char **argv) usage_with_options(latency_usage, latency_options); } setup_sorting(&sched, latency_options, latency_usage); - return perf_sched__lat(&sched); + ret =3D perf_sched__lat(&sched); } else if (!strcmp(argv[0], "map")) { if (argc) { argc =3D parse_options(argc, argv, map_options, map_usage, 0); @@ -3924,13 +3924,14 @@ int cmd_sched(int argc, const char **argv) sched.map.task_names =3D strlist__new(sched.map.task_name, NULL); if (sched.map.task_names =3D=3D NULL) { fprintf(stderr, "Failed to parse task names\n"); - return -1; + ret =3D -1; + goto out; } } } sched.tp_handler =3D &map_ops; setup_sorting(&sched, latency_options, latency_usage); - return perf_sched__map(&sched); + ret =3D perf_sched__map(&sched); } else if (strlen(argv[0]) > 2 && strstarts("replay", argv[0])) { sched.tp_handler =3D &replay_ops; if (argc) { @@ -3938,7 +3939,7 @@ int cmd_sched(int argc, const char **argv) if (argc) usage_with_options(replay_usage, replay_options); } - return perf_sched__replay(&sched); + ret =3D perf_sched__replay(&sched); } else if (!strcmp(argv[0], "timehist")) { if (argc) { argc =3D parse_options(argc, argv, timehist_options, @@ -3954,19 +3955,19 @@ int cmd_sched(int argc, const char **argv) parse_options_usage(NULL, timehist_options, "w", true); if (sched.show_next) parse_options_usage(NULL, timehist_options, "n", true); - return -EINVAL; + ret =3D -EINVAL; + goto out; } ret =3D symbol__validate_sym_arguments(); - if (ret) - return ret; - - return perf_sched__timehist(&sched); + if (!ret) + ret =3D perf_sched__timehist(&sched); } else { usage_with_options(sched_usage, sched_options); } =20 +out: /* free usage string allocated by parse_options_subcommand */ free((void *)sched_usage[0]); =20 - return 0; + return ret; } --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 02:01:45 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 E538D1A255C; Thu, 3 Jul 2025 01:49:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507385; cv=none; b=XCiFOJy/o0r2xTuaQYfkjY9ifa80f3JXrnRjKlqYnjWrFC2Y/qNXQVH5CA9XEIyTIBJiyC4rS8iv04dZl47VHwSXwMyu+QbN2+RnhV1RhIZhh+uxy/KI1UzfpNSvodxdY4AVgXVnlM/uIRvO57vPdKv+39ccQkDkZchYD1zz2KM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507385; c=relaxed/simple; bh=tF5hq04ITDCTuA5/QUZgiNjxB2wr7fs/oP92CaOXSEI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dvWUAIcz8DNsFWnVxZA0JyNGQpIw5fBHmpygzLtEBgWlJpeSjr9dQNFsrmHfn6QQqSQEH+88k5nrX3+/qcAsK9YdvcRgDUm7OJZSpsQ7d+KWBevIlE19WZG264C2+GMeW+a4h/hRNFQI1yzUQRXBdVx9SCQBszBar8JPfJFtuJo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WKXOnDRO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="WKXOnDRO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B7A55C4CEF0; Thu, 3 Jul 2025 01:49:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751507384; bh=tF5hq04ITDCTuA5/QUZgiNjxB2wr7fs/oP92CaOXSEI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WKXOnDROfbEjWtUEfguclljF1Ll1Ud59MujWqY0kGvMdnFueJFoWvOKc6CLkLmC2+ +2L00ca7fzYrgXrpbN8HYJeI/BYMGoWJjd/JDit8CMKK2dGv97O5lfiz297MxwwB19 pwc85eWHB9YeVihCopWyhfydrvpRe2DNRYA9DYey+taA9Qo8fNxLDdu0m44RyKYmdP eGXy5qDyrO4On9IaAdqLmz5TfplyhOhwxFUYCY1Kkf1sFW3C/v5CPN1cuHnKn8yAC8 4FYTMteVf2iv/nLW+eupuYVlLp1nC5qJM2uKSo7MRHk5y4vnbWXpwokTQ16gQZacoX UtEy8kceWXP2w== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org Subject: [PATCH 2/8] perf sched: Free thread->priv using priv_destructor Date: Wed, 2 Jul 2025 18:49:36 -0700 Message-ID: <20250703014942.1369397-3-namhyung@kernel.org> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog In-Reply-To: <20250703014942.1369397-1-namhyung@kernel.org> References: <20250703014942.1369397-1-namhyung@kernel.org> 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 Content-Type: text/plain; charset="utf-8" In many perf sched subcommand saves priv data structure in the thread but it forgot to free them. As it's an opaque type with 'void *', it needs to register that knows how to free the data. In this case, just regular 'free()' is fine. Signed-off-by: Namhyung Kim Reviewed-by: Ian Rogers Tested-by: Ian Rogers --- tools/perf/builtin-sched.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index b7bbfad0ed600eee..fa4052e040201105 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -3898,6 +3898,8 @@ int cmd_sched(int argc, const char **argv) if (!argc) usage_with_options(sched_usage, sched_options); =20 + thread__set_priv_destructor(free); + /* * Aliased to 'perf script' for now: */ --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 02:01:45 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 E53401A2545; Thu, 3 Jul 2025 01:49:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507385; cv=none; b=adkwWLatEpV4S33hprPEHAIknFuGk9d7qn93hCxbq3i1KD4oZmZ6fYOB/euX/+FZ1YYDlbzqMjWCvEFjn9s2WvkfTZqNPB5bzm/OVdUj1IisQHH4kgm6sVD0SXeshy5zO1SRhECeQ0TikCR15PJmlxN5PfqC2UfA2WjExok+PFY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507385; c=relaxed/simple; bh=dWEA9ZdTPWOFgxHfGqwXTpZdPwdHlpg76bVqV0LyIzc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GXQC3srU4qasgNlXMJ+EepCIs2UQ1t7XyXPBl/Brp8CE9B0c0q4uxieFA6UeFW0zz8aO+YRB9+clJpoNVAX2Z6x5iNl/tBSZtmk35+dxuYTbXCQuOvHIYWFuzO3z8Nd2s2YwyIce9RqvfonA96I5zrdR2NaDecyk3UPM9lRSIaE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bEckU2sv; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bEckU2sv" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4050CC4CEED; Thu, 3 Jul 2025 01:49:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751507384; bh=dWEA9ZdTPWOFgxHfGqwXTpZdPwdHlpg76bVqV0LyIzc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bEckU2svP7L2afnRVqMefL+Jxr9gIvZAOKNFdaIIMXSCnumr0yJW9h9lO/6NqEwFx TZe1dy9a8bOrnNdAs1X+rZNRpzofwnk2iZrevV63r0qjqhq3cDr+6hLfEn8n1UmaHV jjJK5wFbS/DfO3w6fFX79ATrvxMLL+nw9zPyzx9ytdcSpQRkTW3Ei5dAzn5QQt9iH0 8jOtyQWO1wG/dsz0GguAjg6TAuVnxz6WznTXqJHymLbpi1y6UUWXeGIlkOECD4Rpk8 KujEeU41r+pMuVowPd3k7u3QcWXSs8Yba6vzhBLeiMZPi6zFY9ZXcHRoTfs80vffA+ wDT04wg2352GA== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org Subject: [PATCH 3/8] perf sched: Fix memory leaks in 'perf sched map' Date: Wed, 2 Jul 2025 18:49:37 -0700 Message-ID: <20250703014942.1369397-4-namhyung@kernel.org> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog In-Reply-To: <20250703014942.1369397-1-namhyung@kernel.org> References: <20250703014942.1369397-1-namhyung@kernel.org> 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 Content-Type: text/plain; charset="utf-8" It maintains per-cpu pointers for the current thread but it doesn't release the refcounts. Signed-off-by: Namhyung Kim Reviewed-by: Ian Rogers Tested-by: Ian Rogers --- tools/perf/builtin-sched.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index fa4052e040201105..b73989fb6acef8d6 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -1634,6 +1634,7 @@ static int map_switch_event(struct perf_sched *sched,= struct evsel *evsel, const char *color =3D PERF_COLOR_NORMAL; char stimestamp[32]; const char *str; + int ret =3D -1; =20 BUG_ON(this_cpu.cpu >=3D MAX_CPUS || this_cpu.cpu < 0); =20 @@ -1664,17 +1665,20 @@ static int map_switch_event(struct perf_sched *sche= d, struct evsel *evsel, sched_in =3D map__findnew_thread(sched, machine, -1, next_pid); sched_out =3D map__findnew_thread(sched, machine, -1, prev_pid); if (sched_in =3D=3D NULL || sched_out =3D=3D NULL) - return -1; + goto out; =20 tr =3D thread__get_runtime(sched_in); - if (tr =3D=3D NULL) { - thread__put(sched_in); - return -1; - } + if (tr =3D=3D NULL) + goto out; + + thread__put(sched->curr_thread[this_cpu.cpu]); + thread__put(sched->curr_out_thread[this_cpu.cpu]); =20 sched->curr_thread[this_cpu.cpu] =3D thread__get(sched_in); sched->curr_out_thread[this_cpu.cpu] =3D thread__get(sched_out); =20 + ret =3D 0; + str =3D thread__comm_str(sched_in); new_shortname =3D 0; if (!tr->shortname[0]) { @@ -1769,12 +1773,10 @@ static int map_switch_event(struct perf_sched *sche= d, struct evsel *evsel, color_fprintf(stdout, color, "\n"); =20 out: - if (sched->map.task_name) - thread__put(sched_out); - + thread__put(sched_out); thread__put(sched_in); =20 - return 0; + return ret; } =20 static int process_sched_switch_event(const struct perf_tool *tool, @@ -3556,10 +3558,10 @@ static int perf_sched__map(struct perf_sched *sched) =20 sched->curr_out_thread =3D calloc(MAX_CPUS, sizeof(*(sched->curr_out_thre= ad))); if (!sched->curr_out_thread) - return rc; + goto out_free_curr_thread; =20 if (setup_cpus_switch_event(sched)) - goto out_free_curr_thread; + goto out_free_curr_out_thread; =20 if (setup_map_cpus(sched)) goto out_free_cpus_switch_event; @@ -3590,7 +3592,14 @@ static int perf_sched__map(struct perf_sched *sched) out_free_cpus_switch_event: free_cpus_switch_event(sched); =20 +out_free_curr_out_thread: + for (int i =3D 0; i < MAX_CPUS; i++) + thread__put(sched->curr_out_thread[i]); + zfree(&sched->curr_out_thread); + out_free_curr_thread: + for (int i =3D 0; i < MAX_CPUS; i++) + thread__put(sched->curr_thread[i]); zfree(&sched->curr_thread); return rc; } --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 02:01:45 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 041BE1DB346; Thu, 3 Jul 2025 01:49:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507386; cv=none; b=E8SraMek8z9lMiF7GmNYJzRCAKhcOcZO12HSI1JGRqfHbkUFbtZYKz57AVARO4EsoAbVrqAZpOW+9xwTXURspzFmnA41nmuv6H3mg7S9Xi0wRcnlkVdpau5+Am/DYETiNFm3EdcU/5GPNO090xq8h9m4Dk6z2brOf/PW2mAp0N4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507386; c=relaxed/simple; bh=X4NV6G18FdzyzBwiRrfRrm4NvowTBnkgrW9f4n3GILw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lUVnljDoxWsRcTd6hQd6ZfbqPWyKKqX3DH0Gnwq+mCxZTFH1YD8SL6kRfU4+wBBVjIUV0bCQOeXUhodtyYmKXhFFtIL6v/0wZbCpaylSBeBevlsXOPHjszXnPd/bx4Ke2VMjGTZtPB9ZJe5G8gfATGvFMNe530slq6MxYktE3fo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fg5/IrHz; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fg5/IrHz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B2964C4CEE7; Thu, 3 Jul 2025 01:49:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751507385; bh=X4NV6G18FdzyzBwiRrfRrm4NvowTBnkgrW9f4n3GILw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fg5/IrHzbk+tlq4J5jHHqQkvqiaHNVFXD4UJP10jArnzloZASWD8Vej0H2UNLq0JC OtK1qxzKhtCFNeg1wIJMyzc7mbqUgiTEZAIOKrad+an7T1+2EwcNpnIWDwOzQu/caj GRuZe0xtxutTPs0RUB5fLlQI5Y2GfzkXYlVABfkZ+HKx2b8D7UYGU54NSGDb1e+I6a tfLGS5ZN3y2WdOz53ZmO5DKPkq9RQVBdQZfJ8pmCa6hKQEk+G1v2sWZN//U1MgPYC4 f/szS9zB5McZA7OzjyVnfR4P8JbfU1JSDk+Qecyw8gx37eAOJQt8DCzKMlKFZKbfBJ Bkz/yqhA22MUg== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org Subject: [PATCH 4/8] perf sched: Fix thread leaks in 'perf sched timehist' Date: Wed, 2 Jul 2025 18:49:38 -0700 Message-ID: <20250703014942.1369397-5-namhyung@kernel.org> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog In-Reply-To: <20250703014942.1369397-1-namhyung@kernel.org> References: <20250703014942.1369397-1-namhyung@kernel.org> 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 Content-Type: text/plain; charset="utf-8" Add missing thread__put() after machine__findnew_thread() or timehist_get_thread(). Also idle threads' last_thread should be refcounted properly. Signed-off-by: Namhyung Kim Reviewed-by: Ian Rogers Tested-by: Ian Rogers --- tools/perf/builtin-sched.c | 48 +++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index b73989fb6acef8d6..83b5a85a91b7ffbd 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -2313,8 +2313,10 @@ static void save_task_callchain(struct perf_sched *s= ched, return; } =20 - if (!sched->show_callchain || sample->callchain =3D=3D NULL) + if (!sched->show_callchain || sample->callchain =3D=3D NULL) { + thread__put(thread); return; + } =20 cursor =3D get_tls_callchain_cursor(); =20 @@ -2323,10 +2325,12 @@ static void save_task_callchain(struct perf_sched *= sched, if (verbose > 0) pr_err("Failed to resolve callchain. Skipping\n"); =20 + thread__put(thread); return; } =20 callchain_cursor_commit(cursor); + thread__put(thread); =20 while (true) { struct callchain_cursor_node *node; @@ -2403,8 +2407,17 @@ static void free_idle_threads(void) return; =20 for (i =3D 0; i < idle_max_cpu; ++i) { - if ((idle_threads[i])) - thread__delete(idle_threads[i]); + struct thread *idle =3D idle_threads[i]; + + if (idle) { + struct idle_thread_runtime *itr; + + itr =3D thread__priv(idle); + if (itr) + thread__put(itr->last_thread); + + thread__delete(idle); + } } =20 free(idle_threads); @@ -2441,7 +2454,7 @@ static struct thread *get_idle_thread(int cpu) } } =20 - return idle_threads[cpu]; + return thread__get(idle_threads[cpu]); } =20 static void save_idle_callchain(struct perf_sched *sched, @@ -2496,7 +2509,8 @@ static struct thread *timehist_get_thread(struct perf= _sched *sched, if (itr =3D=3D NULL) return NULL; =20 - itr->last_thread =3D thread; + thread__put(itr->last_thread); + itr->last_thread =3D thread__get(thread); =20 /* copy task callchain when entering to idle */ if (evsel__intval(evsel, sample, "next_pid") =3D=3D 0) @@ -2567,6 +2581,7 @@ static void timehist_print_wakeup_event(struct perf_s= ched *sched, /* show wakeup unless both awakee and awaker are filtered */ if (timehist_skip_sample(sched, thread, evsel, sample) && timehist_skip_sample(sched, awakened, evsel, sample)) { + thread__put(thread); return; } =20 @@ -2583,6 +2598,8 @@ static void timehist_print_wakeup_event(struct perf_s= ched *sched, printf("awakened: %s", timehist_get_commstr(awakened)); =20 printf("\n"); + + thread__put(thread); } =20 static int timehist_sched_wakeup_ignore(const struct perf_tool *tool __may= be_unused, @@ -2611,8 +2628,10 @@ static int timehist_sched_wakeup_event(const struct = perf_tool *tool, return -1; =20 tr =3D thread__get_runtime(thread); - if (tr =3D=3D NULL) + if (tr =3D=3D NULL) { + thread__put(thread); return -1; + } =20 if (tr->ready_to_run =3D=3D 0) tr->ready_to_run =3D sample->time; @@ -2622,6 +2641,7 @@ static int timehist_sched_wakeup_event(const struct p= erf_tool *tool, !perf_time__skip_sample(&sched->ptime, sample->time)) timehist_print_wakeup_event(sched, evsel, sample, machine, thread); =20 + thread__put(thread); return 0; } =20 @@ -2649,6 +2669,7 @@ static void timehist_print_migration_event(struct per= f_sched *sched, =20 if (timehist_skip_sample(sched, thread, evsel, sample) && timehist_skip_sample(sched, migrated, evsel, sample)) { + thread__put(thread); return; } =20 @@ -2676,6 +2697,7 @@ static void timehist_print_migration_event(struct per= f_sched *sched, printf(" cpu %d =3D> %d", ocpu, dcpu); =20 printf("\n"); + thread__put(thread); } =20 static int timehist_migrate_task_event(const struct perf_tool *tool, @@ -2695,8 +2717,10 @@ static int timehist_migrate_task_event(const struct = perf_tool *tool, return -1; =20 tr =3D thread__get_runtime(thread); - if (tr =3D=3D NULL) + if (tr =3D=3D NULL) { + thread__put(thread); return -1; + } =20 tr->migrations++; tr->migrated =3D sample->time; @@ -2706,6 +2730,7 @@ static int timehist_migrate_task_event(const struct p= erf_tool *tool, timehist_print_migration_event(sched, evsel, sample, machine, thread); } + thread__put(thread); =20 return 0; } @@ -2728,10 +2753,10 @@ static void timehist_update_task_prio(struct evsel = *evsel, return; =20 tr =3D thread__get_runtime(thread); - if (tr =3D=3D NULL) - return; + if (tr !=3D NULL) + tr->prio =3D next_prio; =20 - tr->prio =3D next_prio; + thread__put(thread); } =20 static int timehist_sched_change_event(const struct perf_tool *tool, @@ -2743,7 +2768,7 @@ static int timehist_sched_change_event(const struct p= erf_tool *tool, struct perf_sched *sched =3D container_of(tool, struct perf_sched, tool); struct perf_time_interval *ptime =3D &sched->ptime; struct addr_location al; - struct thread *thread; + struct thread *thread =3D NULL; struct thread_runtime *tr =3D NULL; u64 tprev, t =3D sample->time; int rc =3D 0; @@ -2867,6 +2892,7 @@ static int timehist_sched_change_event(const struct p= erf_tool *tool, =20 evsel__save_time(evsel, sample->time, sample->cpu); =20 + thread__put(thread); addr_location__exit(&al); return rc; } --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 02:01:45 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 041691DB148; Thu, 3 Jul 2025 01:49:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507386; cv=none; b=DebzXCrtq8oZ35pQGv69R5xI83a6vN9Rte+3ft1YCVoINdYYP9XWDWPKys7npSxDAw2tTB/+gvwryRz3QxCDjxbNgJSwPZtarwdfeOzlHxvCo+oHerprAQ/f9LiDYRsWx7rQk3p0gzcsWIihQTCCnjdt8j07S4aPlMROq2vl7R4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507386; c=relaxed/simple; bh=brjZ66S2Sv5ZaBEezsenPWufMzSYuey2BvMpjs1HNps=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=omJea0FF5wdtNsqJ6jsKJyVFyh+JC1aS6TnBh24CFVpXpmVt9+ob3iGHrybExllwKFem7tulbQg6XX/h2BF3Q9gRh81moCZsGQ2qhFvy7+BqWrTYgXxvKvJvn7h4WDMx5MDdDH0nmpGwyHn7Ad0XFkdlDnUVnuFHZfRw+kivkmU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=pDxvh7WA; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="pDxvh7WA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 36BC2C4CEED; Thu, 3 Jul 2025 01:49:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751507385; bh=brjZ66S2Sv5ZaBEezsenPWufMzSYuey2BvMpjs1HNps=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pDxvh7WAxh2dVh/HvhUQuAui4ShsIpFsKiHoo8GgHGUYl1zSNZKGTvuhSTEclunXi rfwTe91yr0e9OryeGlMUtYFU2kbxGvzbOHnRKaOYbntW6mNgUHwNIipzi+T5QEhZEt Qrod+OmJ9SYMq7fV8S0BxiSaYcSvPYgsQRAqnZ+Rw3Eo3X6mcdeTRL656eeqOqw2+5 Vsb+Trrpa1xSqAlDjT4kr64FY0yxU0l8lhguMXyfZvtD6Xb4W9TYnezdIthmnMZW6c e+u1SBQnBqUxsNIH1s7M8W8Yg3sxjQB7vhpICHXsWjXzvH1m4u0dhJdFpURy4ToBYu owLslqbvF0FgQ== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org Subject: [PATCH 5/8] perf sched: Fix memory leaks for evsel->priv in timehist Date: Wed, 2 Jul 2025 18:49:39 -0700 Message-ID: <20250703014942.1369397-6-namhyung@kernel.org> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog In-Reply-To: <20250703014942.1369397-1-namhyung@kernel.org> References: <20250703014942.1369397-1-namhyung@kernel.org> 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 Content-Type: text/plain; charset="utf-8" It uses evsel->priv to save per-cpu timing information. It should be freed when the evsel is released. Add the priv destructor for evsel same as thread to handle that. Signed-off-by: Namhyung Kim Reviewed-by: Ian Rogers Tested-by: Ian Rogers --- tools/perf/builtin-sched.c | 12 ++++++++++++ tools/perf/util/evsel.c | 11 +++++++++++ tools/perf/util/evsel.h | 2 ++ 3 files changed, 25 insertions(+) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 83b5a85a91b7ffbd..a6eb0462dd5be20f 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -2020,6 +2020,16 @@ static u64 evsel__get_time(struct evsel *evsel, u32 = cpu) return r->last_time[cpu]; } =20 +static void timehist__evsel_priv_destructor(void *priv) +{ + struct evsel_runtime *r =3D priv; + + if (r) { + free(r->last_time); + free(r); + } +} + static int comm_width =3D 30; =20 static char *timehist_get_commstr(struct thread *thread) @@ -3314,6 +3324,8 @@ static int perf_sched__timehist(struct perf_sched *sc= hed) =20 setup_pager(); =20 + evsel__set_priv_destructor(timehist__evsel_priv_destructor); + /* prefer sched_waking if it is captured */ if (evlist__find_tracepoint_by_name(session->evlist, "sched:sched_waking"= )) handlers[1].handler =3D timehist_sched_wakeup_ignore; diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 9c50c3960487feee..3896a04d90af71f3 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1657,6 +1657,15 @@ static void evsel__free_config_terms(struct evsel *e= vsel) free_config_terms(&evsel->config_terms); } =20 +static void (*evsel__priv_destructor)(void *priv); + +void evsel__set_priv_destructor(void (*destructor)(void *priv)) +{ + assert(evsel__priv_destructor =3D=3D NULL); + + evsel__priv_destructor =3D destructor; +} + void evsel__exit(struct evsel *evsel) { assert(list_empty(&evsel->core.node)); @@ -1687,6 +1696,8 @@ void evsel__exit(struct evsel *evsel) hashmap__free(evsel->per_pkg_mask); evsel->per_pkg_mask =3D NULL; zfree(&evsel->metric_events); + if (evsel__priv_destructor) + evsel__priv_destructor(evsel->priv); perf_evsel__object.fini(evsel); if (evsel__tool_event(evsel) =3D=3D TOOL_PMU__EVENT_SYSTEM_TIME || evsel__tool_event(evsel) =3D=3D TOOL_PMU__EVENT_USER_TIME) diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 6dbc9690e0c9258c..b84ee274602d7d2b 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -280,6 +280,8 @@ void evsel__init(struct evsel *evsel, struct perf_event= _attr *attr, int idx); void evsel__exit(struct evsel *evsel); void evsel__delete(struct evsel *evsel); =20 +void evsel__set_priv_destructor(void (*destructor)(void *priv)); + struct callchain_param; =20 void evsel__config(struct evsel *evsel, struct record_opts *opts, --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 02:01:45 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 769DD214A7B; Thu, 3 Jul 2025 01:49:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507387; cv=none; b=apFMHeTJyaCwfl6reQMkUmMe0VMaw8wR1ydoRWg8X5+iFSYYyQ4Em7OyvVEu/QhAa58Ut4/lPP25JNimvryX/5a/1GO6wDkZ1JLeEdpnosLI5sznRTPGuo2x7oKL9VSwCTku/eEfGvhGz05W64FLbUQe9+huqhADJuYEpbbkeDo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507387; c=relaxed/simple; bh=qV50sNpmeQ+z4VHzK7ckgYbxgB6pDIXg/c1TlYYcuLw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Au6Pdr2aH8vHy/Ac/puVWGITVqXQoAgHyZz3mNL8iax7HVAkELuvb0d4Sw6KomxQJ9V3BlWsGSVNzdzwl0mXMyz3PgYA8X6n0YT0j8LdFWCwz2rTVerUz5Zxve2QUbaQRAdWUEvdNlKU1AoQpgz5+sEyzWyx5Qt8knFe1mVuldM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jcQv0sHT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jcQv0sHT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AE3EBC4CEF0; Thu, 3 Jul 2025 01:49:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751507386; bh=qV50sNpmeQ+z4VHzK7ckgYbxgB6pDIXg/c1TlYYcuLw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jcQv0sHTsdAz3whlyscoDezIa+gypvgDAxztngAUEdKWHhdk6kzq/Hqs2UNWlJC95 eGlEPBU6imwAhOW8/cs6KyK6Yd1EpM0BiU2FYfxD8/psRSLtun+cR9DG4sLzIzaaoO tiEnbds8Nmz2qU/Afp8p6vmFyghKhYYUjLLdUXWDJhfLjkT08/T7VPVIXaZ87KAMqI KhXEGS6khkAWSFbABw0PcQPR+tpRIrtsNYDFPU4MB67tbnBx1C6sZPuTgULR6pzjPQ f0On84tKwFe7accZ64iluR9JTli3RwnbZmfzjYepge7aW/Sos4bju6Zz7ZgoWvnA24 DFSNuLZ1SznDw== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org Subject: [PATCH 6/8] perf sched: Use RC_CHK_EQUAL() to compare pointers Date: Wed, 2 Jul 2025 18:49:40 -0700 Message-ID: <20250703014942.1369397-7-namhyung@kernel.org> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog In-Reply-To: <20250703014942.1369397-1-namhyung@kernel.org> References: <20250703014942.1369397-1-namhyung@kernel.org> 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 Content-Type: text/plain; charset="utf-8" So that it can check two pointers to the same object properly when REFCNT_CHECKING is on. Signed-off-by: Namhyung Kim Reviewed-by: Ian Rogers Tested-by: Ian Rogers --- tools/perf/builtin-sched.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index a6eb0462dd5be20f..087d4eaba5f7160d 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -994,7 +994,7 @@ thread_atoms_search(struct rb_root_cached *root, struct= thread *thread, else if (cmp < 0) node =3D node->rb_right; else { - BUG_ON(thread !=3D atoms->thread); + BUG_ON(!RC_CHK_EQUAL(thread, atoms->thread)); return atoms; } } --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 02:01:45 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 B1E611F3FF4; Thu, 3 Jul 2025 01:49:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507386; cv=none; b=Gjm762/iRXP4EPf519YQNeU7sbHTysq2S/qJTSRXzcZGBOqH18qi2Ms4gRFstTXKPw9PrH2fNTTFND/l+oFvR+dAyUKhmUlgLZX0d7wjLzD0SuGOIztWLsxFUJx7zMKYWhaKNQNXxqOltNeVp955yIcaTcDq1qp8j9fpo05LbAY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507386; c=relaxed/simple; bh=QCu94DjYUjiUtTZcW4yZqzI5SrvSiYnBT9kSKjn/EJ8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qLdwBJ8wv/R7ggl1LjbtiolUD2CePsO8kZlcUpSN+49xniJ71sXsp2KKb15DF1Tj8tPgWMcsaziz7d9XQ/p75i8YEBILaA5QucsjVoWwC+VUSNmz4Vf2WOQICDwd2EuMm9sU/8UPGoVDcH2GoIv3oqKfXn8sWcUMlu7WOZ/KQBE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mCSI/dhW; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mCSI/dhW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 390D2C4CEE7; Thu, 3 Jul 2025 01:49:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751507386; bh=QCu94DjYUjiUtTZcW4yZqzI5SrvSiYnBT9kSKjn/EJ8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mCSI/dhWVYf1M4Sve90pJAh6H2QgS+iMkDg8UvgTOK/zfdlRH85y57AGJNqOoOATw LYPXRIETYoWk7Gd4p6l9LGtLkDqmJk9HtEG7kIKP8vrWMrN1IzqbnODa6W3tfCwlCW NS5/6CZ26/kfImH7NpAz/WFxaIm7GwEmTArQngEZ2BT3vuEU4MgcVLGz2P52JRwFwA 92kMVPmbjErMcERsdAWq6/lbKQa5naT2x03vby6LZ0LUdXaYiEd5J+mgtYXjnL2J6m MizK0RxR2hLbavFToP9zRkgJFWDEzztffbPhUwpmHNZ1WDrnNSjKJZUd7973oDUMJd Ir6B8NEljN3xA== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org Subject: [PATCH 7/8] perf sched: Fix memory leaks in 'perf sched latency' Date: Wed, 2 Jul 2025 18:49:41 -0700 Message-ID: <20250703014942.1369397-8-namhyung@kernel.org> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog In-Reply-To: <20250703014942.1369397-1-namhyung@kernel.org> References: <20250703014942.1369397-1-namhyung@kernel.org> 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 Content-Type: text/plain; charset="utf-8" The work_atoms should be freed after use. Add free_work_atoms() to make sure to release all. It should use list_splice_init() when merging atoms to prevent accessing invalid pointers. Signed-off-by: Namhyung Kim Reviewed-by: Ian Rogers Tested-by: Ian Rogers --- tools/perf/builtin-sched.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 087d4eaba5f7160d..4bbebd6ef2e4a791 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -1111,6 +1111,21 @@ add_sched_in_event(struct work_atoms *atoms, u64 tim= estamp) atoms->nb_atoms++; } =20 +static void free_work_atoms(struct work_atoms *atoms) +{ + struct work_atom *atom, *tmp; + + if (atoms =3D=3D NULL) + return; + + list_for_each_entry_safe(atom, tmp, &atoms->work_list, list) { + list_del(&atom->list); + free(atom); + } + thread__zput(atoms->thread); + free(atoms); +} + static int latency_switch_event(struct perf_sched *sched, struct evsel *evsel, struct perf_sample *sample, @@ -3426,13 +3441,13 @@ static void __merge_work_atoms(struct rb_root_cache= d *root, struct work_atoms *d this->total_runtime +=3D data->total_runtime; this->nb_atoms +=3D data->nb_atoms; this->total_lat +=3D data->total_lat; - list_splice(&data->work_list, &this->work_list); + list_splice_init(&data->work_list, &this->work_list); if (this->max_lat < data->max_lat) { this->max_lat =3D data->max_lat; this->max_lat_start =3D data->max_lat_start; this->max_lat_end =3D data->max_lat_end; } - zfree(&data); + free_work_atoms(data); return; } } @@ -3511,7 +3526,6 @@ static int perf_sched__lat(struct perf_sched *sched) work_list =3D rb_entry(next, struct work_atoms, node); output_lat_thread(sched, work_list); next =3D rb_next(next); - thread__zput(work_list->thread); } =20 printf(" ----------------------------------------------------------------= -------------------------------------------------\n"); @@ -3525,6 +3539,13 @@ static int perf_sched__lat(struct perf_sched *sched) =20 rc =3D 0; =20 + while ((next =3D rb_first_cached(&sched->sorted_atom_root))) { + struct work_atoms *data; + + data =3D rb_entry(next, struct work_atoms, node); + rb_erase_cached(next, &sched->sorted_atom_root); + free_work_atoms(data); + } out_free_cpus_switch_event: free_cpus_switch_event(sched); return rc; --=20 2.50.0.727.gbf7dc18ff4-goog From nobody Wed Oct 8 02:01:45 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 314B01FFC45; Thu, 3 Jul 2025 01:49:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507387; cv=none; b=RjT/8hDV6xPbksmxstfcprWG9OKWRB2bv0RlA97M3ENH2RxCXtUnGxi08b8Gv874puE3iKk9GyEimyud6u0YzHfTchvnpSpJV6sg8+rC6n3UHwo+kg2D8270Rd8HWh7FL/MsVrY52cg//emu5nDpCsotM+DxsrCf9O256IMjgZM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751507387; c=relaxed/simple; bh=QKC9dVoT8uAMP6ybmq2ZbGaAcXGjdbm+RC6KFdw5CG0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ny2MNE9aWovWImZCn2r1Abp6OZ7TyTTtk4DAqsEiWodkN4G2/5zpYJwFI+3k0Y+rxyWOTWNBbqES7x7Gc3XiyfSbhVGY20TJHOarw+r90BX1uc/BDMnIfhkkFy+e62fUDZ3gBor2I2IGZuPV1E11vTnvH31IWHQ7ib4P0P2UvFM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FPtIEDsC; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="FPtIEDsC" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B65EAC4CEF2; Thu, 3 Jul 2025 01:49:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751507387; bh=QKC9dVoT8uAMP6ybmq2ZbGaAcXGjdbm+RC6KFdw5CG0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FPtIEDsCST3nRSV5dMnSmkrcEJpctsGxDwiiK3odAchbvjzJUbWJvaOTSw6iosOn2 j25ZwKCX9XYW2VG61Sn7ciPGCk8+Qhfgzoxz/fAem2IVRX3LGMh21psFFjpelVPIGr ItN584ldrRyKo5mw66PxtFDScUkYLMnVtvNtFwgTH3+tB9xnhMRArEF3Vb3IDInEkj AyHT0Dgp/bh+BQnsSXlnZLY8BJwahVMLXjgQ7I2y1sAt463OidsdSWbrzNkr9qQbsr l/4YU8HojLqCE0cAUlMDWJxkbxQ6m82f1GHa8gOR4TyD9PTUwFkpPtBXneHI1HLcKs xFYs3JpM2JhjA== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org Subject: [PATCH 8/8] perf test: Add more test cases to sched test Date: Wed, 2 Jul 2025 18:49:42 -0700 Message-ID: <20250703014942.1369397-9-namhyung@kernel.org> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog In-Reply-To: <20250703014942.1369397-1-namhyung@kernel.org> References: <20250703014942.1369397-1-namhyung@kernel.org> 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 Content-Type: text/plain; charset="utf-8" $ sudo ./perf test -vv 92 92: perf sched tests: --- start --- test child forked, pid 1360101 Sched record pid 1360105's current affinity list: 0-3 pid 1360105's new affinity list: 0 pid 1360107's current affinity list: 0-3 pid 1360107's new affinity list: 0 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 4.330 MB /tmp/__perf_test_sched.perf.da= ta.b3319 (12246 samples) ] Sched latency Sched script Sched map Sched timehist Samples of sched_switch event do not have callchains. ---- end(0) ---- 92: perf sched tests : Ok Signed-off-by: Namhyung Kim Reviewed-by: Ian Rogers Tested-by: Ian Rogers --- tools/perf/tests/shell/sched.sh | 39 ++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/tools/perf/tests/shell/sched.sh b/tools/perf/tests/shell/sched= .sh index c030126d1a0c918d..b9b81eaf856e6555 100755 --- a/tools/perf/tests/shell/sched.sh +++ b/tools/perf/tests/shell/sched.sh @@ -56,38 +56,61 @@ cleanup_noploops() { kill "$PID1" "$PID2" } =20 -test_sched_latency() { - echo "Sched latency" +test_sched_record() { + echo "Sched record" =20 start_noploops =20 perf sched record --no-inherit -o "${perfdata}" sleep 1 + + cleanup_noploops +} + +test_sched_latency() { + echo "Sched latency" + if ! perf sched latency -i "${perfdata}" | grep -q perf-noploop then echo "Sched latency [Failed missing output]" err=3D1 fi - - cleanup_noploops } =20 test_sched_script() { echo "Sched script" =20 - start_noploops - - perf sched record --no-inherit -o "${perfdata}" sleep 1 if ! perf sched script -i "${perfdata}" | grep -q perf-noploop then echo "Sched script [Failed missing output]" err=3D1 fi +} =20 - cleanup_noploops +test_sched_map() { + echo "Sched map" + + if ! perf sched map -i "${perfdata}" | grep -q perf-noploop + then + echo "Sched map [Failed missing output]" + err=3D1 + fi +} + +test_sched_timehist() { + echo "Sched timehist" + + if ! perf sched timehist -i "${perfdata}" | grep -q perf-noploop + then + echo "Sched timehist [Failed missing output]" + err=3D1 + fi } =20 +test_sched_record test_sched_latency test_sched_script +test_sched_map +test_sched_timehist =20 cleanup exit $err --=20 2.50.0.727.gbf7dc18ff4-goog