Commit ad7b8b33108a6bf610b9492b1f204e660e488e99
1 parent
4a794a62
Introduce kvm_check_extension to check if KVM extensions are supported
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
2 changed files
with
24 additions
and
17 deletions
kvm-all.c
@@ -320,6 +320,18 @@ int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size) | @@ -320,6 +320,18 @@ int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size) | ||
320 | return ret; | 320 | return ret; |
321 | } | 321 | } |
322 | 322 | ||
323 | +int kvm_check_extension(KVMState *s, unsigned int extension) | ||
324 | +{ | ||
325 | + int ret; | ||
326 | + | ||
327 | + ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, extension); | ||
328 | + if (ret < 0) { | ||
329 | + ret = 0; | ||
330 | + } | ||
331 | + | ||
332 | + return ret; | ||
333 | +} | ||
334 | + | ||
323 | int kvm_init(int smp_cpus) | 335 | int kvm_init(int smp_cpus) |
324 | { | 336 | { |
325 | KVMState *s; | 337 | KVMState *s; |
@@ -368,10 +380,8 @@ int kvm_init(int smp_cpus) | @@ -368,10 +380,8 @@ int kvm_init(int smp_cpus) | ||
368 | * just use a user allocated buffer so we can use regular pages | 380 | * just use a user allocated buffer so we can use regular pages |
369 | * unmodified. Make sure we have a sufficiently modern version of KVM. | 381 | * unmodified. Make sure we have a sufficiently modern version of KVM. |
370 | */ | 382 | */ |
371 | - ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_USER_MEMORY); | ||
372 | - if (ret <= 0) { | ||
373 | - if (ret == 0) | ||
374 | - ret = -EINVAL; | 383 | + if (!kvm_check_extension(s, KVM_CAP_USER_MEMORY)) { |
384 | + ret = -EINVAL; | ||
375 | fprintf(stderr, "kvm does not support KVM_CAP_USER_MEMORY\n"); | 385 | fprintf(stderr, "kvm does not support KVM_CAP_USER_MEMORY\n"); |
376 | goto err; | 386 | goto err; |
377 | } | 387 | } |
@@ -379,11 +389,8 @@ int kvm_init(int smp_cpus) | @@ -379,11 +389,8 @@ int kvm_init(int smp_cpus) | ||
379 | /* There was a nasty bug in < kvm-80 that prevents memory slots from being | 389 | /* There was a nasty bug in < kvm-80 that prevents memory slots from being |
380 | * destroyed properly. Since we rely on this capability, refuse to work | 390 | * destroyed properly. Since we rely on this capability, refuse to work |
381 | * with any kernel without this capability. */ | 391 | * with any kernel without this capability. */ |
382 | - ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, | ||
383 | - KVM_CAP_DESTROY_MEMORY_REGION_WORKS); | ||
384 | - if (ret <= 0) { | ||
385 | - if (ret == 0) | ||
386 | - ret = -EINVAL; | 392 | + if (!kvm_check_extension(s, KVM_CAP_DESTROY_MEMORY_REGION_WORKS)) { |
393 | + ret = -EINVAL; | ||
387 | 394 | ||
388 | fprintf(stderr, | 395 | fprintf(stderr, |
389 | "KVM kernel module broken (DESTROY_MEMORY_REGION)\n" | 396 | "KVM kernel module broken (DESTROY_MEMORY_REGION)\n" |
@@ -391,11 +398,10 @@ int kvm_init(int smp_cpus) | @@ -391,11 +398,10 @@ int kvm_init(int smp_cpus) | ||
391 | goto err; | 398 | goto err; |
392 | } | 399 | } |
393 | 400 | ||
394 | - s->coalesced_mmio = 0; | ||
395 | #ifdef KVM_CAP_COALESCED_MMIO | 401 | #ifdef KVM_CAP_COALESCED_MMIO |
396 | - ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_COALESCED_MMIO); | ||
397 | - if (ret > 0) | ||
398 | - s->coalesced_mmio = ret; | 402 | + s->coalesced_mmio = kvm_check_extension(s, KVM_CAP_COALESCED_MMIO); |
403 | +#else | ||
404 | + s->coalesced_mmio = 0; | ||
399 | #endif | 405 | #endif |
400 | 406 | ||
401 | ret = kvm_arch_init(s, smp_cpus); | 407 | ret = kvm_arch_init(s, smp_cpus); |
@@ -766,11 +772,10 @@ int kvm_has_sync_mmu(void) | @@ -766,11 +772,10 @@ int kvm_has_sync_mmu(void) | ||
766 | #ifdef KVM_CAP_SYNC_MMU | 772 | #ifdef KVM_CAP_SYNC_MMU |
767 | KVMState *s = kvm_state; | 773 | KVMState *s = kvm_state; |
768 | 774 | ||
769 | - if (kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_SYNC_MMU) > 0) | ||
770 | - return 1; | ||
771 | -#endif | ||
772 | - | 775 | + return kvm_check_extension(s, KVM_CAP_SYNC_MMU); |
776 | +#else | ||
773 | return 0; | 777 | return 0; |
778 | +#endif | ||
774 | } | 779 | } |
775 | 780 | ||
776 | void kvm_setup_guest_memory(void *start, size_t size) | 781 | void kvm_setup_guest_memory(void *start, size_t size) |
kvm.h
@@ -118,6 +118,8 @@ void kvm_arch_remove_all_hw_breakpoints(void); | @@ -118,6 +118,8 @@ void kvm_arch_remove_all_hw_breakpoints(void); | ||
118 | 118 | ||
119 | void kvm_arch_update_guest_debug(CPUState *env, struct kvm_guest_debug *dbg); | 119 | void kvm_arch_update_guest_debug(CPUState *env, struct kvm_guest_debug *dbg); |
120 | 120 | ||
121 | +int kvm_check_extension(KVMState *s, unsigned int extension); | ||
122 | + | ||
121 | /* generic hooks - to be moved/refactored once there are more users */ | 123 | /* generic hooks - to be moved/refactored once there are more users */ |
122 | 124 | ||
123 | static inline void cpu_synchronize_state(CPUState *env, int modified) | 125 | static inline void cpu_synchronize_state(CPUState *env, int modified) |