From patchwork Thu Jan 10 15:29:04 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jason J. Herne" X-Patchwork-Id: 211107 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 13E1B2C0348 for ; Fri, 11 Jan 2013 04:50:59 +1100 (EST) Received: from localhost ([::1]:60078 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TtMHJ-00025f-9x for incoming@patchwork.ozlabs.org; Thu, 10 Jan 2013 12:50:57 -0500 Received: from eggs.gnu.org ([208.118.235.92]:34775) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TtK4g-0006jv-VD for qemu-devel@nongnu.org; Thu, 10 Jan 2013 10:29:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TtK4d-0008E9-Hh for qemu-devel@nongnu.org; Thu, 10 Jan 2013 10:29:46 -0500 Received: from e7.ny.us.ibm.com ([32.97.182.137]:47623) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TtK4d-0008Dz-Da for qemu-devel@nongnu.org; Thu, 10 Jan 2013 10:29:43 -0500 Received: from /spool/local by e7.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 10 Jan 2013 10:29:42 -0500 Received: from d01dlp03.pok.ibm.com (9.56.250.168) by e7.ny.us.ibm.com (192.168.1.107) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 10 Jan 2013 10:29:17 -0500 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id EBFE5C9008B for ; Thu, 10 Jan 2013 10:29:15 -0500 (EST) Received: from d03av03.boulder.ibm.com (d03av03.boulder.ibm.com [9.17.195.169]) by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r0AFTEXM246486 for ; Thu, 10 Jan 2013 10:29:15 -0500 Received: from d03av03.boulder.ibm.com (loopback [127.0.0.1]) by d03av03.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r0AFTCaE011918 for ; Thu, 10 Jan 2013 08:29:13 -0700 Received: from w500-1204.endicott.ibm.com (w500-1204.endicott.ibm.com [9.60.75.168] (may be forged)) by d03av03.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r0AFT8lj011394; Thu, 10 Jan 2013 08:29:08 -0700 From: "Jason J. Herne" To: agraf@suse.de, borntraeger@de.ibm.com, aliguori@us.ibm.com, mtosatti@redhat.com, qemu-devel@nongnu.org, R65777@freescale.com, jan.kiszka@siemens.com Date: Thu, 10 Jan 2013 10:29:04 -0500 Message-Id: <1357831744-3950-1-git-send-email-jjherne@us.ibm.com> X-Mailer: git-send-email 1.7.9.5 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13011015-5806-0000-0000-00001E0EFCCA X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 32.97.182.137 Cc: "Jason J. Herne" Subject: [Qemu-devel] [PATCH 4/7 v2] KVM regsync: Add register bitmap parameter to do_kvm_cpu_synchronize_state X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: "Jason J. Herne" do_kvm_cpu_synchronize_state is called via run_on_cpu, so we can only pass a single argument. Create SyncStateArgs struct for this purpose and add register bitmap data member to it. Signed-off-by: Jason J. Herne Reviewed-by: Christian Borntraeger --- include/sysemu/kvm.h | 6 ++++++ kvm-all.c | 27 +++++++++++++++++---------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h index e0738ba..193d1f4 100644 --- a/include/sysemu/kvm.h +++ b/include/sysemu/kvm.h @@ -223,6 +223,12 @@ int kvm_check_extension(KVMState *s, unsigned int extension); uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function, uint32_t index, int reg); + +struct kvm_cpu_syncstate_args { + CPUState *cpu; + int regmap; +}; + void kvm_cpu_synchronize_state(CPUArchState *env); void kvm_cpu_synchronize_post_reset(CPUArchState *env); void kvm_cpu_synchronize_post_init(CPUArchState *env); diff --git a/kvm-all.c b/kvm-all.c index 1aa61bb..77ab72a 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -231,7 +231,7 @@ int kvm_init_vcpu(CPUArchState *env) cpu->kvm_fd = ret; cpu->kvm_state = s; - cpu->kvm_vcpu_dirty = true; + cpu->kvm_vcpu_dirty = KVM_REGSYNC_FULL_STATE; mmap_size = kvm_ioctl(s, KVM_GET_VCPU_MMAP_SIZE, 0); if (mmap_size < 0) { @@ -1491,20 +1491,27 @@ void kvm_flush_coalesced_mmio_buffer(void) static void do_kvm_cpu_synchronize_state(void *arg) { - CPUState *cpu = arg; + struct kvm_cpu_syncstate_args *args = arg; - if (!cpu->kvm_vcpu_dirty) { - kvm_arch_get_registers(cpu, KVM_REGSYNC_FULL_STATE); - cpu->kvm_vcpu_dirty = true; + /* Do not sync regs that are already dirty */ + int regs_to_get = args->regmap & ~args->cpu->kvm_vcpu_dirty; + + if (regs_to_get) { + kvm_arch_get_registers(args->cpu, regs_to_get); + args->cpu->kvm_vcpu_dirty |= regs_to_get; } } void kvm_cpu_synchronize_state(CPUArchState *env) { CPUState *cpu = ENV_GET_CPU(env); + struct kvm_cpu_syncstate_args args; + + args.cpu = cpu; + args.regmap = KVM_REGSYNC_FULL_STATE; - if (!cpu->kvm_vcpu_dirty) { - run_on_cpu(cpu, do_kvm_cpu_synchronize_state, cpu); + if (args.regmap & ~cpu->kvm_vcpu_dirty) { + run_on_cpu(cpu, do_kvm_cpu_synchronize_state, &args); } } @@ -1513,7 +1520,7 @@ void kvm_cpu_synchronize_post_reset(CPUArchState *env) CPUState *cpu = ENV_GET_CPU(env); kvm_arch_put_registers(cpu, KVM_REGSYNC_RESET_STATE); - cpu->kvm_vcpu_dirty = false; + cpu->kvm_vcpu_dirty &= ~KVM_REGSYNC_RESET_STATE; } void kvm_cpu_synchronize_post_init(CPUArchState *env) @@ -1521,7 +1528,7 @@ void kvm_cpu_synchronize_post_init(CPUArchState *env) CPUState *cpu = ENV_GET_CPU(env); kvm_arch_put_registers(cpu, KVM_REGSYNC_FULL_STATE); - cpu->kvm_vcpu_dirty = false; + cpu->kvm_vcpu_dirty &= ~KVM_REGSYNC_FULL_STATE; } int kvm_cpu_exec(CPUArchState *env) @@ -1540,7 +1547,7 @@ int kvm_cpu_exec(CPUArchState *env) do { if (cpu->kvm_vcpu_dirty) { kvm_arch_put_registers(cpu, KVM_REGSYNC_RUNTIME_STATE); - cpu->kvm_vcpu_dirty = false; + cpu->kvm_vcpu_dirty &= ~KVM_REGSYNC_RUNTIME_STATE; } kvm_arch_pre_run(cpu, run);