Loading virt/kvm/coalesced_mmio.c +23 −2 Original line number Diff line number Diff line Loading @@ -92,11 +92,19 @@ static const struct kvm_io_device_ops coalesced_mmio_ops = { int kvm_coalesced_mmio_init(struct kvm *kvm) { struct kvm_coalesced_mmio_dev *dev; struct page *page; 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); if (!dev) return -ENOMEM; goto out_free_page; spin_lock_init(&dev->lock); kvm_iodevice_init(&dev->dev, &coalesced_mmio_ops); dev->kvm = kvm; Loading @@ -104,11 +112,24 @@ int kvm_coalesced_mmio_init(struct kvm *kvm) ret = kvm_io_bus_register_dev(kvm, &kvm->mmio_bus, &dev->dev); 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; } 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, struct kvm_coalesced_mmio_zone *zone) { Loading virt/kvm/coalesced_mmio.h +10 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,8 @@ * */ #ifdef CONFIG_KVM_MMIO #define KVM_COALESCED_MMIO_ZONE_MAX 100 struct kvm_coalesced_mmio_dev { Loading @@ -21,9 +23,17 @@ struct kvm_coalesced_mmio_dev { }; 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, struct kvm_coalesced_mmio_zone *zone); int kvm_vm_ioctl_unregister_coalesced_mmio(struct kvm *kvm, 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 virt/kvm/kvm_main.c +1 −6 Original line number Diff line number Diff line Loading @@ -51,9 +51,7 @@ #include <asm/pgtable.h> #include <asm-generic/bitops/le.h> #ifdef KVM_COALESCED_MMIO_PAGE_OFFSET #include "coalesced_mmio.h" #endif #define CREATE_TRACE_POINTS #include <trace/events/kvm.h> Loading Loading @@ -468,10 +466,7 @@ static void kvm_destroy_vm(struct kvm *kvm) kvm_free_irq_routing(kvm); kvm_io_bus_destroy(&kvm->pio_bus); kvm_io_bus_destroy(&kvm->mmio_bus); #ifdef KVM_COALESCED_MMIO_PAGE_OFFSET if (kvm->coalesced_mmio_ring != NULL) free_page((unsigned long)kvm->coalesced_mmio_ring); #endif kvm_coalesced_mmio_free(kvm); #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm); #else Loading Loading
virt/kvm/coalesced_mmio.c +23 −2 Original line number Diff line number Diff line Loading @@ -92,11 +92,19 @@ static const struct kvm_io_device_ops coalesced_mmio_ops = { int kvm_coalesced_mmio_init(struct kvm *kvm) { struct kvm_coalesced_mmio_dev *dev; struct page *page; 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); if (!dev) return -ENOMEM; goto out_free_page; spin_lock_init(&dev->lock); kvm_iodevice_init(&dev->dev, &coalesced_mmio_ops); dev->kvm = kvm; Loading @@ -104,11 +112,24 @@ int kvm_coalesced_mmio_init(struct kvm *kvm) ret = kvm_io_bus_register_dev(kvm, &kvm->mmio_bus, &dev->dev); 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; } 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, struct kvm_coalesced_mmio_zone *zone) { Loading
virt/kvm/coalesced_mmio.h +10 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,8 @@ * */ #ifdef CONFIG_KVM_MMIO #define KVM_COALESCED_MMIO_ZONE_MAX 100 struct kvm_coalesced_mmio_dev { Loading @@ -21,9 +23,17 @@ struct kvm_coalesced_mmio_dev { }; 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, struct kvm_coalesced_mmio_zone *zone); int kvm_vm_ioctl_unregister_coalesced_mmio(struct kvm *kvm, 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
virt/kvm/kvm_main.c +1 −6 Original line number Diff line number Diff line Loading @@ -51,9 +51,7 @@ #include <asm/pgtable.h> #include <asm-generic/bitops/le.h> #ifdef KVM_COALESCED_MMIO_PAGE_OFFSET #include "coalesced_mmio.h" #endif #define CREATE_TRACE_POINTS #include <trace/events/kvm.h> Loading Loading @@ -468,10 +466,7 @@ static void kvm_destroy_vm(struct kvm *kvm) kvm_free_irq_routing(kvm); kvm_io_bus_destroy(&kvm->pio_bus); kvm_io_bus_destroy(&kvm->mmio_bus); #ifdef KVM_COALESCED_MMIO_PAGE_OFFSET if (kvm->coalesced_mmio_ring != NULL) free_page((unsigned long)kvm->coalesced_mmio_ring); #endif kvm_coalesced_mmio_free(kvm); #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm); #else Loading