mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-03 17:51:23 +00:00
KVM: Simplify coalesced mmio initialization
- add destructor function - move related allocation into constructor - add stubs for !CONFIG_KVM_MMIO Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
099a52923e
commit
0953ca73f4
@ -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,9 +112,22 @@ 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;
|
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,
|
int kvm_vm_ioctl_register_coalesced_mmio(struct kvm *kvm,
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user