From nobody Tue Feb 10 00:39:34 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1649083397449648.3284519794967; Mon, 4 Apr 2022 07:43:17 -0700 (PDT) Received: from localhost ([::1]:43932 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nbNvI-0005BC-60 for importer@patchew.org; Mon, 04 Apr 2022 10:43:16 -0400 Received: from eggs.gnu.org ([209.51.188.92]:56794) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nbNqb-0005n4-S5 for qemu-devel@nongnu.org; Mon, 04 Apr 2022 10:38:29 -0400 Received: from smtpout3.mo529.mail-out.ovh.net ([46.105.54.81]:44259) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nbNqX-0006cj-9Z for qemu-devel@nongnu.org; Mon, 04 Apr 2022 10:38:25 -0400 Received: from mxplan5.mail.ovh.net (unknown [10.109.146.241]) by mo529.mail-out.ovh.net (Postfix) with ESMTPS id 7B07CF31DA6B; Mon, 4 Apr 2022 16:38:18 +0200 (CEST) Received: from kaod.org (37.59.142.95) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.24; Mon, 4 Apr 2022 16:38:17 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-95G0010e4ae6bf-80aa-44c8-9fe6-440a7b07eb7a, 193BEDB8EED17CFBFC1316EE01F9191BF107EB6B) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: , Subject: [PULL 1/3] hw/ppc: free env->tb_env in spapr_unrealize_vcpu() Date: Mon, 4 Apr 2022 16:38:11 +0200 Message-ID: <20220404143813.673262-2-clg@kaod.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220404143813.673262-1-clg@kaod.org> References: <20220404143813.673262-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.59.142.95] X-ClientProxiedBy: DAG6EX1.mxp5.local (172.16.2.51) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: c68e4569-2a36-49d2-a73d-06d4fb8a06b1 X-Ovh-Tracer-Id: 205476736331057958 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvvddrudejvddgjeegucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojghfgggtgfhisehtkeertdertdejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepheehfeegjeeitdfffeetjeduveejueefuefgtdefueelueetveeliefhhffgtdelnecukfhppedtrddtrddtrddtpdefjedrheelrddugedvrdelheenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhhouggvpehsmhhtphhouhhtpdhhvghlohepmhigphhlrghnhedrmhgrihhlrdhovhhhrdhnvghtpdhinhgvtheptddrtddrtddrtddpmhgrihhlfhhrohhmpegtlhhgsehkrghougdrohhrghdpnhgspghrtghpthhtohepuddprhgtphhtthhopegtlhhgsehkrghougdrohhrgh Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=46.105.54.81; envelope-from=clg@kaod.org; helo=smtpout3.mo529.mail-out.ovh.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Daniel Henrique Barboza , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1649083399199100001 From: Daniel Henrique Barboza The timebase is allocated during spapr_realize_vcpu() and it's not freed. This results in memory leaks when doing vcpu unplugs: =3D=3D636935=3D=3D =3D=3D636935=3D=3D 144 (96 direct, 48 indirect) bytes in 1 blocks are defin= itely lost in loss record 6 ,461 of 8,135 =3D=3D636935=3D=3D at 0x4897468: calloc (vg_replace_malloc.c:760) =3D=3D636935=3D=3D by 0x5077213: g_malloc0 (in /usr/lib64/libglib-2.0.so= .0.6400.4) =3D=3D636935=3D=3D by 0x507757F: g_malloc0_n (in /usr/lib64/libglib-2.0.= so.0.6400.4) =3D=3D636935=3D=3D by 0x93C3FB: cpu_ppc_tb_init (ppc.c:1066) =3D=3D636935=3D=3D by 0x97BC2B: spapr_realize_vcpu (spapr_cpu_core.c:268) =3D=3D636935=3D=3D by 0x97C01F: spapr_cpu_core_realize (spapr_cpu_core.c= :337) =3D=3D636935=3D=3D by 0xD4626F: device_set_realized (qdev.c:531) =3D=3D636935=3D=3D by 0xD55273: property_set_bool (object.c:2273) =3D=3D636935=3D=3D by 0xD523DF: object_property_set (object.c:1408) =3D=3D636935=3D=3D by 0xD588B7: object_property_set_qobject (qom-qobject= .c:28) =3D=3D636935=3D=3D by 0xD52897: object_property_set_bool (object.c:1477) =3D=3D636935=3D=3D by 0xD4579B: qdev_realize (qdev.c:333) =3D=3D636935=3D=3D This patch adds a cpu_ppc_tb_free() helper in hw/ppc/ppc.c to allow us to free the timebase. This leak is then solved by calling cpu_ppc_tb_free() in spapr_unrealize_vcpu(). Fixes: 6f4b5c3ec590 ("spapr: CPU hot unplug support") Signed-off-by: Daniel Henrique Barboza Reviewed-by: C=C3=A9dric Le Goater Reviewed-by: David Gibson Message-Id: <20220329124545.529145-2-danielhb413@gmail.com> Signed-off-by: C=C3=A9dric Le Goater --- include/hw/ppc/ppc.h | 1 + hw/ppc/ppc.c | 7 +++++++ hw/ppc/spapr_cpu_core.c | 3 +++ 3 files changed, 11 insertions(+) diff --git a/include/hw/ppc/ppc.h b/include/hw/ppc/ppc.h index b0ba4bd6b978..364f165b4b56 100644 --- a/include/hw/ppc/ppc.h +++ b/include/hw/ppc/ppc.h @@ -54,6 +54,7 @@ struct ppc_tb_t { =20 uint64_t cpu_ppc_get_tb(ppc_tb_t *tb_env, uint64_t vmclk, int64_t tb_offse= t); clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, uint32_t freq); +void cpu_ppc_tb_free(CPUPPCState *env); void cpu_ppc_hdecr_init(CPUPPCState *env); void cpu_ppc_hdecr_exit(CPUPPCState *env); =20 diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c index faa02d6710c9..fea70df45e69 100644 --- a/hw/ppc/ppc.c +++ b/hw/ppc/ppc.c @@ -1083,6 +1083,13 @@ clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, uint= 32_t freq) return &cpu_ppc_set_tb_clk; } =20 +void cpu_ppc_tb_free(CPUPPCState *env) +{ + timer_free(env->tb_env->decr_timer); + timer_free(env->tb_env->hdecr_timer); + g_free(env->tb_env); +} + /* cpu_ppc_hdecr_init may be used if the timer is not used by HDEC emulati= on */ void cpu_ppc_hdecr_init(CPUPPCState *env) { diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index ed847139602f..8a4861f45a2a 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -189,10 +189,13 @@ static const VMStateDescription vmstate_spapr_cpu_sta= te =3D { =20 static void spapr_unrealize_vcpu(PowerPCCPU *cpu, SpaprCpuCore *sc) { + CPUPPCState *env =3D &cpu->env; + if (!sc->pre_3_0_migration) { vmstate_unregister(NULL, &vmstate_spapr_cpu_state, cpu->machine_da= ta); } spapr_irq_cpu_intc_destroy(SPAPR_MACHINE(qdev_get_machine()), cpu); + cpu_ppc_tb_free(env); qdev_unrealize(DEVICE(cpu)); } =20 --=20 2.34.1