aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2008-12-09 19:59:09 +0000
committeraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2008-12-09 19:59:09 +0000
commitd85dc283fa87353be10b11b463196d10eb49ca41 (patch)
tree080330bfa46e1d5e9ac05d2dcf0e0f6b28f03177
parentf19412a2a6346ff4976d57c2692464f7cd8fa7eb (diff)
Disable KVM support if the kernel modules have broken memory slot handling
Prior to kvm-80, memory slot deletion was broken in the KVM kernel modules. In kvm-81, a new capability is introduced to signify that this problem has been fixed. Since we rely on being able to delete memory slots, refuse to work with any kernel module that does not have this capability present. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5960 c046a42c-6fe2-441c-8c8c-71466251a162
-rwxr-xr-xconfigure3
-rw-r--r--kvm-all.c15
2 files changed, 17 insertions, 1 deletions
diff --git a/configure b/configure
index b90c47f0cf..13f6358d4c 100755
--- a/configure
+++ b/configure
@@ -933,7 +933,8 @@ if test "$kvm" = "yes" ; then
KVM_API_VERSION < 12 || \
KVM_API_VERSION > 12 || \
!defined(KVM_CAP_USER_MEMORY) || \
- !defined(KVM_CAP_SET_TSS_ADDR)
+ !defined(KVM_CAP_SET_TSS_ADDR) || \
+ !defined(KVM_CAP_DESTROY_MEMORY_REGION_WORKS)
#error Invalid KVM version
#endif
int main(void) { return 0; }
diff --git a/kvm-all.c b/kvm-all.c
index 69ca46b1af..8615bf6b27 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -283,6 +283,21 @@ int kvm_init(int smp_cpus)
goto err;
}
+ /* 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;
+
+ fprintf(stderr,
+ "KVM kernel module broken (DESTROY_MEMORY_REGION)\n"
+ "Please upgrade to at least kvm-81.\n");
+ goto err;
+ }
+
ret = kvm_arch_init(s, smp_cpus);
if (ret < 0)
goto err;