From nobody Sat Apr 27 17:34:33 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516434948598523.2804282096248; Fri, 19 Jan 2018 23:55:48 -0800 (PST) Received: from localhost ([::1]:50203 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eco0B-0004F9-G1 for importer@patchew.org; Sat, 20 Jan 2018 02:55:47 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54483) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecnzE-0003pa-0i for qemu-devel@nongnu.org; Sat, 20 Jan 2018 02:54:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ecnzA-0001Zt-5R for qemu-devel@nongnu.org; Sat, 20 Jan 2018 02:54:48 -0500 Received: from mail.zju.edu.cn ([61.164.42.155]:8604 helo=zju.edu.cn) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecnz9-0001Xj-Gw for qemu-devel@nongnu.org; Sat, 20 Jan 2018 02:54:44 -0500 Received: from jdu4e00u53f7.localdomain (unknown [116.196.87.83]) by mail-app4 (Coremail) with SMTP id cS_KCgBXKRq19WJav6huAQ--.21985S2; Sat, 20 Jan 2018 15:54:36 +0800 (CST) From: linzhecheng To: qemu-devel@nongnu.org Date: Sat, 20 Jan 2018 15:54:28 +0800 Message-Id: <1516434868-24776-1-git-send-email-linzc@zju.edu.cn> X-Mailer: git-send-email 1.8.3.1 X-CM-TRANSID: cS_KCgBXKRq19WJav6huAQ--.21985S2 X-Coremail-Antispam: 1UD129KBjvJXoW7AF1rGrW5Kry7GrWUZw1xAFb_yoW8AFWfpr Z8JryqqFWrJrWjvay5Ja4q9ryDJF4UWa17X3yxuw1rAF17Wr18WrWvka4UGrs3CF95Z3Wa yFW5Gr47C3y7taDanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUyG14x267AKxVWUJVW8JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26w1j6s0DM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4U JVWxJr1l84ACjcxK6I8E87Iv67AKxVW0oVCq3wA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gc CE3s1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E 2Ix0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJV W8JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1l42xK82IYc2Ij64vI r41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8Gjc xK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r126r1DMIIYrxkI7VAKI48JMIIF0xvE2Ix0 cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r1j6r4UMIIF0xvE42xK8V AvwI8IcIk0rVWrZr1j6s0DMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7Cj xVAFwI0_Jr0_GrUvcSsGvfC2KfnxnUUI43ZEXa7VUbrMaUUUUUU== X-CM-SenderInfo: isruiiarqyq6lmxovvfxof0/ X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 61.164.42.155 Subject: [Qemu-devel] [PATCH] vcpu: create vcpu thread with QEMU_THREAD_DETACHED mode X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, rth@twiddle.net, linzhecheng , crosthwaite.peter@gmail.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 1. If we create vcpu thread with QEMU_THREAD_JOINABLE mode, we will get memory leak when vcpu thread exits, which will happen when hot-unplug vcpus. 2. We should use QLIST_FOREACH_SAFE instead of QLIST_FOREACH if we need to remove the entry in QLIST. Signed-off-by: linzhecheng diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 071f4f5..fd95b18 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -282,9 +282,9 @@ err: =20 static int kvm_get_vcpu(KVMState *s, unsigned long vcpu_id) { - struct KVMParkedVcpu *cpu; + struct KVMParkedVcpu *cpu, *next_cpu; =20 - QLIST_FOREACH(cpu, &s->kvm_parked_vcpus, node) { + QLIST_FOREACH_SAFE(cpu, &s->kvm_parked_vcpus, node, next_cpu) { if (cpu->vcpu_id =3D=3D vcpu_id) { int kvm_fd; =20 diff --git a/cpus.c b/cpus.c index 2cb0af9..de3a96b 100644 --- a/cpus.c +++ b/cpus.c @@ -1113,6 +1113,9 @@ static void qemu_kvm_destroy_vcpu(CPUState *cpu) error_report("kvm_destroy_vcpu failed"); exit(EXIT_FAILURE); } + g_free(cpu->thread); + g_free(cpu->halt_cond); + g_free(cpu->cpu_ases); } =20 static void qemu_tcg_destroy_vcpu(CPUState *cpu) @@ -1205,6 +1208,7 @@ static void *qemu_kvm_cpu_thread_fn(void *arg) cpu->created =3D false; qemu_cond_signal(&qemu_cpu_cond); qemu_mutex_unlock_iothread(); + rcu_unregister_thread(); return NULL; } =20 @@ -1850,7 +1854,7 @@ static void qemu_kvm_start_vcpu(CPUState *cpu) snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM", cpu->cpu_index); qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + cpu, QEMU_THREAD_DETACHED); while (!cpu->created) { qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex); } --=20 1.8.3.1