From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1M6qeT-0003e3-Ou for qemu-devel@nongnu.org; Wed, 20 May 2009 14:36:29 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1M6qeO-0003ce-NL for qemu-devel@nongnu.org; Wed, 20 May 2009 14:36:28 -0400 Received: from [199.232.76.173] (port=45065 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1M6qeO-0003cX-EM for qemu-devel@nongnu.org; Wed, 20 May 2009 14:36:24 -0400 Received: from mx2.redhat.com ([66.187.237.31]:44639) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1M6qeN-0006PE-Sl for qemu-devel@nongnu.org; Wed, 20 May 2009 14:36:24 -0400 From: Glauber Costa Date: Wed, 20 May 2009 15:36:12 -0300 Message-Id: <1242844578-2647-2-git-send-email-glommer@redhat.com> In-Reply-To: <1242844578-2647-1-git-send-email-glommer@redhat.com> References: <1242844578-2647-1-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH STABLE 1/7] Introduce kvm_check_extension to check if KVM extensions are supported List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com From: Anthony Liguori Signed-off-by: Anthony Liguori Signed-off-by: Glauber Costa --- kvm-all.c | 39 ++++++++++++++++++++++----------------- kvm.h | 2 ++ 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index 2b7d535..8c1afb0 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -280,6 +280,18 @@ int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size) return ret; } +int kvm_check_extension(KVMState *s, unsigned int extension) +{ + int ret; + + ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, extension); + if (ret < 0) { + ret = 0; + } + + return ret; +} + int kvm_init(int smp_cpus) { KVMState *s; @@ -325,10 +337,8 @@ int kvm_init(int smp_cpus) * just use a user allocated buffer so we can use phys_ram_base * unmodified. Make sure we have a sufficiently modern version of KVM. */ - ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_USER_MEMORY); - if (ret <= 0) { - if (ret == 0) - ret = -EINVAL; + if (!kvm_check_extension(s, KVM_CAP_USER_MEMORY)) { + ret = -EINVAL; fprintf(stderr, "kvm does not support KVM_CAP_USER_MEMORY\n"); goto err; } @@ -336,11 +346,8 @@ int kvm_init(int smp_cpus) /* There was a nasty bug in < kvm-80 that prevents memory slots from being * destroyed properly. Since we rely on this capability, refuse to work * with any kernel without this capability. */ - ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, - KVM_CAP_DESTROY_MEMORY_REGION_WORKS); - if (ret <= 0) { - if (ret == 0) - ret = -EINVAL; + if (!kvm_check_extension(s, KVM_CAP_DESTROY_MEMORY_REGION_WORKS)) { + ret = -EINVAL; fprintf(stderr, "KVM kernel module broken (DESTROY_MEMORY_REGION)\n" @@ -348,11 +355,10 @@ int kvm_init(int smp_cpus) goto err; } - s->coalesced_mmio = 0; #ifdef KVM_CAP_COALESCED_MMIO - ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_COALESCED_MMIO); - if (ret > 0) - s->coalesced_mmio = ret; + s->coalesced_mmio = kvm_check_extension(s, KVM_CAP_COALESCED_MMIO); +#else + s->coalesced_mmio = 0; #endif ret = kvm_arch_init(s, smp_cpus); @@ -650,11 +656,10 @@ int kvm_has_sync_mmu(void) #ifdef KVM_CAP_SYNC_MMU KVMState *s = kvm_state; - if (kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_SYNC_MMU) > 0) - return 1; -#endif - + return kvm_check_extension(s, KVM_CAP_SYNC_MMU); +#else return 0; +#endif } void kvm_setup_guest_memory(void *start, size_t size) diff --git a/kvm.h b/kvm.h index 5a52f51..cf6c799 100644 --- a/kvm.h +++ b/kvm.h @@ -78,4 +78,6 @@ int kvm_arch_init(KVMState *s, int smp_cpus); int kvm_arch_init_vcpu(CPUState *env); +int kvm_check_extension(KVMState *s, unsigned int extension); + #endif -- 1.6.2.2