From nobody Wed Oct 8 03:52:24 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 --- 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