From patchwork Tue Dec 1 12:51:31 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glauber Costa X-Patchwork-Id: 39902 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 4240BB6F16 for ; Wed, 2 Dec 2009 00:07:43 +1100 (EST) Received: from localhost ([127.0.0.1]:49944 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NFSSD-0001WN-0C for incoming@patchwork.ozlabs.org; Tue, 01 Dec 2009 08:07:41 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NFSD4-0005Ym-4k for qemu-devel@nongnu.org; Tue, 01 Dec 2009 07:52:02 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NFSCy-0005Vo-U0 for qemu-devel@nongnu.org; Tue, 01 Dec 2009 07:52:00 -0500 Received: from [199.232.76.173] (port=35008 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NFSCx-0005VV-Mb for qemu-devel@nongnu.org; Tue, 01 Dec 2009 07:51:55 -0500 Received: from mx1.redhat.com ([209.132.183.28]:8127) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NFSCx-0004rp-DR for qemu-devel@nongnu.org; Tue, 01 Dec 2009 07:51:55 -0500 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id nB1Cpsgb017341 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 1 Dec 2009 07:51:54 -0500 Received: from localhost.localdomain (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id nB1CphO1002534; Tue, 1 Dec 2009 07:51:52 -0500 From: Glauber Costa To: qemu-devel@nongnu.org Date: Tue, 1 Dec 2009 10:51:31 -0200 Message-Id: <1259671897-22232-6-git-send-email-glommer@redhat.com> In-Reply-To: <1259671897-22232-5-git-send-email-glommer@redhat.com> References: <1259671897-22232-1-git-send-email-glommer@redhat.com> <1259671897-22232-2-git-send-email-glommer@redhat.com> <1259671897-22232-3-git-send-email-glommer@redhat.com> <1259671897-22232-4-git-send-email-glommer@redhat.com> <1259671897-22232-5-git-send-email-glommer@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Cc: aliguori@us.ibm.com, avi@redhat.com, agraf@suse.de Subject: [Qemu-devel] [PATCH v2 05/11] tell kernel about all registers instead of just mp_state X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This fix a bug with -smp in kvm. Since we have updated apic_base, we also have to tell kernel about it. So instead of just updating mp_state, update every regs. It is mandatory that this happens synchronously, without waiting for the next vcpu run. Otherwise, if we are migrating, or initializing the cpu's APIC, other cpus can still see an invalid state. Since putting registers already happen in vcpu entry, we factor out the required code in cpu_flush_state() Signed-off-by: Glauber Costa --- hw/apic-kvm.c | 5 ++++- kvm-all.c | 14 +++++++++----- kvm.h | 8 ++++++++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/hw/apic-kvm.c b/hw/apic-kvm.c index e5a0bfc..9e9790f 100644 --- a/hw/apic-kvm.c +++ b/hw/apic-kvm.c @@ -126,7 +126,10 @@ static void kvm_apic_reset(void *opaque) s->cpu_env->mp_state = bsp ? KVM_MP_STATE_RUNNABLE : KVM_MP_STATE_UNINITIALIZED; - kvm_put_mp_state(s->cpu_env); + /* We have to tell the kernel about mp_state, but also save sregs, since + * apic base was just updated + */ + cpu_flush_state(s->cpu_env); if (bsp) { /* diff --git a/kvm-all.c b/kvm-all.c index 40203f0..318a4e6 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -622,7 +622,6 @@ static void kvm_run_coalesced_mmio(CPUState *env, struct kvm_run *run) } #endif } - void kvm_cpu_synchronize_state(CPUState *env) { if (!env->kvm_state->regs_modified) { @@ -631,6 +630,14 @@ void kvm_cpu_synchronize_state(CPUState *env) } } +void kvm_cpu_flush_state(CPUState *env) +{ + if (env->kvm_state->regs_modified) { + kvm_arch_put_registers(env); + env->kvm_state->regs_modified = 0; + } +} + int kvm_cpu_exec(CPUState *env) { struct kvm_run *run = env->kvm_run; @@ -645,10 +652,7 @@ int kvm_cpu_exec(CPUState *env) break; } - if (env->kvm_state->regs_modified) { - kvm_arch_put_registers(env); - env->kvm_state->regs_modified = 0; - } + kvm_cpu_flush_state(env); kvm_arch_pre_run(env, run); qemu_mutex_unlock_iothread(); diff --git a/kvm.h b/kvm.h index a474d95..d9af176 100644 --- a/kvm.h +++ b/kvm.h @@ -139,6 +139,7 @@ int kvm_check_extension(KVMState *s, unsigned int extension); uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg); void kvm_cpu_synchronize_state(CPUState *env); +void kvm_cpu_flush_state(CPUState *env); /* generic hooks - to be moved/refactored once there are more users */ @@ -149,4 +150,11 @@ static inline void cpu_synchronize_state(CPUState *env) } } +static inline void cpu_flush_state(CPUState *env) +{ + if (kvm_enabled()) { + kvm_cpu_flush_state(env); + } +} + #endif