Commit 980da6ce authored by Avi Kivity's avatar Avi Kivity Committed by Marcelo Tosatti

KVM: Simplify coalesced mmio initialization

- add destructor function
- move related allocation into constructor
- add stubs for !CONFIG_KVM_MMIO
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 50eb2a3c
...@@ -92,11 +92,19 @@ static const struct kvm_io_device_ops coalesced_mmio_ops = { ...@@ -92,11 +92,19 @@ static const struct kvm_io_device_ops coalesced_mmio_ops = {
int kvm_coalesced_mmio_init(struct kvm *kvm) int kvm_coalesced_mmio_init(struct kvm *kvm)
{ {
struct kvm_coalesced_mmio_dev *dev; struct kvm_coalesced_mmio_dev *dev;
struct page *page;
int ret; int ret;
ret = -ENOMEM;
page = alloc_page(GFP_KERNEL | __GFP_ZERO);
if (!page)
goto out_err;
kvm->coalesced_mmio_ring = page_address(page);
ret = -ENOMEM;
dev = kzalloc(sizeof(struct kvm_coalesced_mmio_dev), GFP_KERNEL); dev = kzalloc(sizeof(struct kvm_coalesced_mmio_dev), GFP_KERNEL);
if (!dev) if (!dev)
return -ENOMEM; goto out_free_page;
spin_lock_init(&dev->lock); spin_lock_init(&dev->lock);
kvm_iodevice_init(&dev->dev, &coalesced_mmio_ops); kvm_iodevice_init(&dev->dev, &coalesced_mmio_ops);
dev->kvm = kvm; dev->kvm = kvm;
...@@ -104,11 +112,24 @@ int kvm_coalesced_mmio_init(struct kvm *kvm) ...@@ -104,11 +112,24 @@ int kvm_coalesced_mmio_init(struct kvm *kvm)
ret = kvm_io_bus_register_dev(kvm, &kvm->mmio_bus, &dev->dev); ret = kvm_io_bus_register_dev(kvm, &kvm->mmio_bus, &dev->dev);
if (ret < 0) if (ret < 0)
kfree(dev); goto out_free_dev;
return ret;
out_free_dev:
kfree(dev);
out_free_page:
__free_page(page);
out_err:
return ret; return ret;
} }
void kvm_coalesced_mmio_free(struct kvm *kvm)
{
if (kvm->coalesced_mmio_ring)
free_page((unsigned long)kvm->coalesced_mmio_ring);
}
int kvm_vm_ioctl_register_coalesced_mmio(struct kvm *kvm, int kvm_vm_ioctl_register_coalesced_mmio(struct kvm *kvm,
struct kvm_coalesced_mmio_zone *zone) struct kvm_coalesced_mmio_zone *zone)
{ {
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
* *
*/ */
#ifdef CONFIG_KVM_MMIO
#define KVM_COALESCED_MMIO_ZONE_MAX 100 #define KVM_COALESCED_MMIO_ZONE_MAX 100
struct kvm_coalesced_mmio_dev { struct kvm_coalesced_mmio_dev {
...@@ -21,9 +23,17 @@ struct kvm_coalesced_mmio_dev { ...@@ -21,9 +23,17 @@ struct kvm_coalesced_mmio_dev {
}; };
int kvm_coalesced_mmio_init(struct kvm *kvm); int kvm_coalesced_mmio_init(struct kvm *kvm);
void kvm_coalesced_mmio_free(struct kvm *kvm);
int kvm_vm_ioctl_register_coalesced_mmio(struct kvm *kvm, int kvm_vm_ioctl_register_coalesced_mmio(struct kvm *kvm,
struct kvm_coalesced_mmio_zone *zone); struct kvm_coalesced_mmio_zone *zone);
int kvm_vm_ioctl_unregister_coalesced_mmio(struct kvm *kvm, int kvm_vm_ioctl_unregister_coalesced_mmio(struct kvm *kvm,
struct kvm_coalesced_mmio_zone *zone); struct kvm_coalesced_mmio_zone *zone);
#else
static inline int kvm_coalesced_mmio_init(struct kvm *kvm) { return 0; }
static inline void kvm_coalesced_mmio_free(struct kvm *kvm) { }
#endif
#endif #endif
...@@ -51,9 +51,7 @@ ...@@ -51,9 +51,7 @@
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm-generic/bitops/le.h> #include <asm-generic/bitops/le.h>
#ifdef KVM_COALESCED_MMIO_PAGE_OFFSET
#include "coalesced_mmio.h" #include "coalesced_mmio.h"
#endif
#define CREATE_TRACE_POINTS #define CREATE_TRACE_POINTS
#include <trace/events/kvm.h> #include <trace/events/kvm.h>
...@@ -468,10 +466,7 @@ static void kvm_destroy_vm(struct kvm *kvm) ...@@ -468,10 +466,7 @@ static void kvm_destroy_vm(struct kvm *kvm)
kvm_free_irq_routing(kvm); kvm_free_irq_routing(kvm);
kvm_io_bus_destroy(&kvm->pio_bus); kvm_io_bus_destroy(&kvm->pio_bus);
kvm_io_bus_destroy(&kvm->mmio_bus); kvm_io_bus_destroy(&kvm->mmio_bus);
#ifdef KVM_COALESCED_MMIO_PAGE_OFFSET kvm_coalesced_mmio_free(kvm);
if (kvm->coalesced_mmio_ring != NULL)
free_page((unsigned long)kvm->coalesced_mmio_ring);
#endif
#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm); mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm);
#else #else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment