diff options
author | Will Deacon <will.deacon@arm.com> | 2014-09-02 05:27:36 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2014-09-17 07:10:10 -0400 |
commit | 80ce1639727e9d38729c34f162378508c307ca25 (patch) | |
tree | c7ffcba90bd9af321c66285174aab7775b7941d9 | |
parent | 84877d93336de21a6251db00b841468a83c65906 (diff) |
KVM: VFIO: register kvm_device_ops dynamically
Now that we have a dynamic means to register kvm_device_ops, use that
for the VFIO kvm device, instead of relying on the static table.
This is achieved by a module_init call to register the ops with KVM.
Cc: Gleb Natapov <gleb@kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Acked-by: Alex Williamson <Alex.Williamson@redhat.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r-- | include/linux/kvm_host.h | 1 | ||||
-rw-r--r-- | virt/kvm/kvm_main.c | 4 | ||||
-rw-r--r-- | virt/kvm/vfio.c | 22 |
3 files changed, 15 insertions, 12 deletions
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 7ef088bec715..d44a2d640551 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -1068,7 +1068,6 @@ int kvm_register_device_ops(struct kvm_device_ops *ops, u32 type); | |||
1068 | 1068 | ||
1069 | extern struct kvm_device_ops kvm_mpic_ops; | 1069 | extern struct kvm_device_ops kvm_mpic_ops; |
1070 | extern struct kvm_device_ops kvm_xics_ops; | 1070 | extern struct kvm_device_ops kvm_xics_ops; |
1071 | extern struct kvm_device_ops kvm_vfio_ops; | ||
1072 | 1071 | ||
1073 | #ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT | 1072 | #ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT |
1074 | 1073 | ||
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index f4e792fedb4f..db57363cc287 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -2281,10 +2281,6 @@ static struct kvm_device_ops *kvm_device_ops_table[KVM_DEV_TYPE_MAX] = { | |||
2281 | #ifdef CONFIG_KVM_XICS | 2281 | #ifdef CONFIG_KVM_XICS |
2282 | [KVM_DEV_TYPE_XICS] = &kvm_xics_ops, | 2282 | [KVM_DEV_TYPE_XICS] = &kvm_xics_ops, |
2283 | #endif | 2283 | #endif |
2284 | |||
2285 | #ifdef CONFIG_KVM_VFIO | ||
2286 | [KVM_DEV_TYPE_VFIO] = &kvm_vfio_ops, | ||
2287 | #endif | ||
2288 | }; | 2284 | }; |
2289 | 2285 | ||
2290 | int kvm_register_device_ops(struct kvm_device_ops *ops, u32 type) | 2286 | int kvm_register_device_ops(struct kvm_device_ops *ops, u32 type) |
diff --git a/virt/kvm/vfio.c b/virt/kvm/vfio.c index ba1a93f935c7..bb11b36ee8a2 100644 --- a/virt/kvm/vfio.c +++ b/virt/kvm/vfio.c | |||
@@ -246,6 +246,16 @@ static void kvm_vfio_destroy(struct kvm_device *dev) | |||
246 | kfree(dev); /* alloc by kvm_ioctl_create_device, free by .destroy */ | 246 | kfree(dev); /* alloc by kvm_ioctl_create_device, free by .destroy */ |
247 | } | 247 | } |
248 | 248 | ||
249 | static int kvm_vfio_create(struct kvm_device *dev, u32 type); | ||
250 | |||
251 | static struct kvm_device_ops kvm_vfio_ops = { | ||
252 | .name = "kvm-vfio", | ||
253 | .create = kvm_vfio_create, | ||
254 | .destroy = kvm_vfio_destroy, | ||
255 | .set_attr = kvm_vfio_set_attr, | ||
256 | .has_attr = kvm_vfio_has_attr, | ||
257 | }; | ||
258 | |||
249 | static int kvm_vfio_create(struct kvm_device *dev, u32 type) | 259 | static int kvm_vfio_create(struct kvm_device *dev, u32 type) |
250 | { | 260 | { |
251 | struct kvm_device *tmp; | 261 | struct kvm_device *tmp; |
@@ -268,10 +278,8 @@ static int kvm_vfio_create(struct kvm_device *dev, u32 type) | |||
268 | return 0; | 278 | return 0; |
269 | } | 279 | } |
270 | 280 | ||
271 | struct kvm_device_ops kvm_vfio_ops = { | 281 | static int __init kvm_vfio_ops_init(void) |
272 | .name = "kvm-vfio", | 282 | { |
273 | .create = kvm_vfio_create, | 283 | return kvm_register_device_ops(&kvm_vfio_ops, KVM_DEV_TYPE_VFIO); |
274 | .destroy = kvm_vfio_destroy, | 284 | } |
275 | .set_attr = kvm_vfio_set_attr, | 285 | module_init(kvm_vfio_ops_init); |
276 | .has_attr = kvm_vfio_has_attr, | ||
277 | }; | ||