KVM: Let vcpu structure alignment be determined at runtime
authorAvi Kivity <avi@redhat.com>
Wed, 28 Apr 2010 12:39:01 +0000 (15:39 +0300)
committerAvi Kivity <avi@redhat.com>
Wed, 19 May 2010 08:36:29 +0000 (11:36 +0300)
vmx and svm vcpus have different contents and therefore may have different
alignmment requirements.  Let each specify its required alignment.

Signed-off-by: Avi Kivity <avi@redhat.com>
arch/ia64/kvm/vmm.c
arch/powerpc/kvm/44x.c
arch/powerpc/kvm/book3s.c
arch/powerpc/kvm/e500.c
arch/s390/kvm/kvm-s390.c
arch/x86/kvm/svm.c
arch/x86/kvm/vmx.c
include/linux/kvm_host.h
virt/kvm/kvm_main.c

index 7a62f75778c535f7421fc16ec4525407e3686e9b..f0b9cac824145709c570a3994b2dceaf089b32e3 100644 (file)
@@ -51,7 +51,7 @@ static int __init  kvm_vmm_init(void)
        vmm_fpswa_interface = fpswa_interface;
 
        /*Register vmm data to kvm side*/
-       return kvm_init(&vmm_info, 1024, THIS_MODULE);
+       return kvm_init(&vmm_info, 1024, 0, THIS_MODULE);
 }
 
 static void __exit kvm_vmm_exit(void)
index 689a57c2ac8009f3d62a51cb9d94dc90a333d4e3..73c0a3f64ed1e9587b5776ae3c198af94edc9a97 100644 (file)
@@ -147,7 +147,7 @@ static int __init kvmppc_44x_init(void)
        if (r)
                return r;
 
-       return kvm_init(NULL, sizeof(struct kvmppc_vcpu_44x), THIS_MODULE);
+       return kvm_init(NULL, sizeof(struct kvmppc_vcpu_44x), 0, THIS_MODULE);
 }
 
 static void __exit kvmppc_44x_exit(void)
index 28e785fb2cabbdb423205c8c4b31f50b7d6b3723..11f226ff4468a780171ac727fcb966fcad25df29 100644 (file)
@@ -1385,7 +1385,8 @@ int __kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
 
 static int kvmppc_book3s_init(void)
 {
-       return kvm_init(NULL, sizeof(struct kvmppc_vcpu_book3s), THIS_MODULE);
+       return kvm_init(NULL, sizeof(struct kvmppc_vcpu_book3s), 0,
+                       THIS_MODULE);
 }
 
 static void kvmppc_book3s_exit(void)
index 669a5c5fc7d725db4f9d8ae6bddc47bce21eb475..bc2b4004eb265a70ea4b082693e0b9eb9cf49e3f 100644 (file)
@@ -161,7 +161,7 @@ static int __init kvmppc_e500_init(void)
        flush_icache_range(kvmppc_booke_handlers,
                        kvmppc_booke_handlers + max_ivor + kvmppc_handler_len);
 
-       return kvm_init(NULL, sizeof(struct kvmppc_vcpu_e500), THIS_MODULE);
+       return kvm_init(NULL, sizeof(struct kvmppc_vcpu_e500), 0, THIS_MODULE);
 }
 
 static void __init kvmppc_e500_exit(void)
index ee7c713686ce10663227ccdb38d3b9331c288ddd..8093e6f47f49735d978f19ff4ea40db7ab797313 100644 (file)
@@ -752,7 +752,7 @@ gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn)
 static int __init kvm_s390_init(void)
 {
        int ret;
-       ret = kvm_init(NULL, sizeof(struct kvm_vcpu), THIS_MODULE);
+       ret = kvm_init(NULL, sizeof(struct kvm_vcpu), 0, THIS_MODULE);
        if (ret)
                return ret;
 
index 889f66022e570d208d297d12a2ae934d0019d8ef..2511664ff6717ffe34027738b4e693b86df46dee 100644 (file)
@@ -3319,7 +3319,7 @@ static struct kvm_x86_ops svm_x86_ops = {
 static int __init svm_init(void)
 {
        return kvm_init(&svm_x86_ops, sizeof(struct vcpu_svm),
-                             THIS_MODULE);
+                       __alignof__(struct vcpu_svm), THIS_MODULE);
 }
 
 static void __exit svm_exit(void)
index 875b785228f6a78b95c7b7b1f32012494dc3249e..2e8729678600aa95a551a60a1f1661e1fa065520 100644 (file)
@@ -4245,7 +4245,8 @@ static int __init vmx_init(void)
 
        set_bit(0, vmx_vpid_bitmap); /* 0 is reserved for host */
 
-       r = kvm_init(&vmx_x86_ops, sizeof(struct vcpu_vmx), THIS_MODULE);
+       r = kvm_init(&vmx_x86_ops, sizeof(struct vcpu_vmx),
+                    __alignof__(struct vcpu_vmx), THIS_MODULE);
        if (r)
                goto out3;
 
index ce027d518096725da54606da3d4af1313efa442f..7cb116afa1cdbd9c48998b4d26bc1974c011636b 100644 (file)
@@ -243,7 +243,7 @@ void kvm_vcpu_uninit(struct kvm_vcpu *vcpu);
 void vcpu_load(struct kvm_vcpu *vcpu);
 void vcpu_put(struct kvm_vcpu *vcpu);
 
-int kvm_init(void *opaque, unsigned int vcpu_size,
+int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
                  struct module *module);
 void kvm_exit(void);
 
index 9ab1a77941efd0c9bbba46a866b40a60399d1477..f032806a212f9d8e02faa7823f65262813d82015 100644 (file)
@@ -2178,7 +2178,7 @@ static void kvm_sched_out(struct preempt_notifier *pn,
        kvm_arch_vcpu_put(vcpu);
 }
 
-int kvm_init(void *opaque, unsigned int vcpu_size,
+int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
                  struct module *module)
 {
        int r;
@@ -2228,8 +2228,9 @@ int kvm_init(void *opaque, unsigned int vcpu_size,
                goto out_free_4;
 
        /* A kmem cache lets us meet the alignment requirements of fx_save. */
-       kvm_vcpu_cache = kmem_cache_create("kvm_vcpu", vcpu_size,
-                                          __alignof__(struct kvm_vcpu),
+       if (!vcpu_align)
+               vcpu_align = __alignof__(struct kvm_vcpu);
+       kvm_vcpu_cache = kmem_cache_create("kvm_vcpu", vcpu_size, vcpu_align,
                                           0, NULL);
        if (!kvm_vcpu_cache) {
                r = -ENOMEM;