Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+23 −2
Original line number Original line Diff line number Diff line
@@ -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)


	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 −0
Original line number Original line Diff line number Diff line
@@ -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 {
};
};


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
+1 −6
Original line number Original line Diff line number Diff line
@@ -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)
	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