* [PATCH v3 0/4] Make kvm_device_ops registration dynamic
@ 2014-09-02 9:27 Will Deacon
2014-09-02 9:27 ` [PATCH v3 1/4] KVM: device: add simple registration mechanism for kvm_device_ops Will Deacon
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Will Deacon @ 2014-09-02 9:27 UTC (permalink / raw)
To: kvm, kvmarm
Cc: cornelia.huck, Alex.Williamson, agraf, gleb, pbonzini,
marc.zyngier, christoffer.dall, Will Deacon
Hi all,
This is version 3 of the patches originally posted here:
v1: http://www.spinics.net/lists/kvm-arm/msg10219.html
v2: http://www.spinics.net/lists/kvm/msg105197.html
Changes since v2 include:
- Rebased onto 3.17-rc* (the vgic code changed a lot!)
- Added relevant acks
The mpic, flic and xics are still not ported over, as I don't want to
risk breaking those devices (it's not clear at which point they need to
be registered).
Thanks,
Will
--->8
Cornelia Huck (1):
KVM: s390: register flic ops dynamically
Will Deacon (3):
KVM: device: add simple registration mechanism for kvm_device_ops
KVM: ARM: vgic: register kvm_device_ops dynamically
KVM: VFIO: register kvm_device_ops dynamically
arch/s390/kvm/kvm-s390.c | 3 +-
arch/s390/kvm/kvm-s390.h | 1 +
include/linux/kvm_host.h | 4 +-
include/uapi/linux/kvm.h | 22 +++++--
virt/kvm/arm/vgic.c | 157 ++++++++++++++++++++++++-----------------------
virt/kvm/kvm_main.c | 57 +++++++++--------
virt/kvm/vfio.c | 22 ++++---
7 files changed, 142 insertions(+), 124 deletions(-)
--
2.1.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 1/4] KVM: device: add simple registration mechanism for kvm_device_ops
2014-09-02 9:27 [PATCH v3 0/4] Make kvm_device_ops registration dynamic Will Deacon
@ 2014-09-02 9:27 ` Will Deacon
2014-09-02 9:27 ` [PATCH v3 2/4] KVM: ARM: vgic: register kvm_device_ops dynamically Will Deacon
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Will Deacon @ 2014-09-02 9:27 UTC (permalink / raw)
To: kvm, kvmarm
Cc: cornelia.huck, Alex.Williamson, agraf, gleb, pbonzini,
marc.zyngier, christoffer.dall, Will Deacon
kvm_ioctl_create_device currently has knowledge of all the device types
and their associated ops. This is fairly inflexible when adding support
for new in-kernel device emulations, so move what we currently have out
into a table, which can support dynamic registration of ops by new
drivers for virtual hardware.
Cc: Alex Williamson <Alex.Williamson@redhat.com>
Cc: Alex Graf <agraf@suse.de>
Cc: Gleb Natapov <gleb@kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
---
include/linux/kvm_host.h | 1 +
include/uapi/linux/kvm.h | 22 +++++++++++-----
virt/kvm/kvm_main.c | 65 ++++++++++++++++++++++++++++--------------------
3 files changed, 55 insertions(+), 33 deletions(-)
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index a4c33b34fe3f..ca105f919f0b 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1068,6 +1068,7 @@ struct kvm_device_ops {
void kvm_device_get(struct kvm_device *dev);
void kvm_device_put(struct kvm_device *dev);
struct kvm_device *kvm_device_from_filp(struct file *filp);
+int kvm_register_device_ops(struct kvm_device_ops *ops, u32 type);
extern struct kvm_device_ops kvm_mpic_ops;
extern struct kvm_device_ops kvm_xics_ops;
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
index cf3a2ff440e4..5541024dd5d0 100644
--- a/include/uapi/linux/kvm.h
+++ b/include/uapi/linux/kvm.h
@@ -947,15 +947,25 @@ struct kvm_device_attr {
__u64 addr; /* userspace address of attr data */
};
-#define KVM_DEV_TYPE_FSL_MPIC_20 1
-#define KVM_DEV_TYPE_FSL_MPIC_42 2
-#define KVM_DEV_TYPE_XICS 3
-#define KVM_DEV_TYPE_VFIO 4
#define KVM_DEV_VFIO_GROUP 1
#define KVM_DEV_VFIO_GROUP_ADD 1
#define KVM_DEV_VFIO_GROUP_DEL 2
-#define KVM_DEV_TYPE_ARM_VGIC_V2 5
-#define KVM_DEV_TYPE_FLIC 6
+
+enum kvm_device_type {
+ KVM_DEV_TYPE_FSL_MPIC_20 = 1,
+#define KVM_DEV_TYPE_FSL_MPIC_20 KVM_DEV_TYPE_FSL_MPIC_20
+ KVM_DEV_TYPE_FSL_MPIC_42,
+#define KVM_DEV_TYPE_FSL_MPIC_42 KVM_DEV_TYPE_FSL_MPIC_42
+ KVM_DEV_TYPE_XICS,
+#define KVM_DEV_TYPE_XICS KVM_DEV_TYPE_XICS
+ KVM_DEV_TYPE_VFIO,
+#define KVM_DEV_TYPE_VFIO KVM_DEV_TYPE_VFIO
+ KVM_DEV_TYPE_ARM_VGIC_V2,
+#define KVM_DEV_TYPE_ARM_VGIC_V2 KVM_DEV_TYPE_ARM_VGIC_V2
+ KVM_DEV_TYPE_FLIC,
+#define KVM_DEV_TYPE_FLIC KVM_DEV_TYPE_FLIC
+ KVM_DEV_TYPE_MAX,
+};
/*
* ioctls for VM fds
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 33712fb26eb1..81de6768d2c2 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2259,44 +2259,55 @@ struct kvm_device *kvm_device_from_filp(struct file *filp)
return filp->private_data;
}
-static int kvm_ioctl_create_device(struct kvm *kvm,
- struct kvm_create_device *cd)
-{
- struct kvm_device_ops *ops = NULL;
- struct kvm_device *dev;
- bool test = cd->flags & KVM_CREATE_DEVICE_TEST;
- int ret;
-
- switch (cd->type) {
+static struct kvm_device_ops *kvm_device_ops_table[KVM_DEV_TYPE_MAX] = {
#ifdef CONFIG_KVM_MPIC
- case KVM_DEV_TYPE_FSL_MPIC_20:
- case KVM_DEV_TYPE_FSL_MPIC_42:
- ops = &kvm_mpic_ops;
- break;
+ [KVM_DEV_TYPE_FSL_MPIC_20] = &kvm_mpic_ops,
+ [KVM_DEV_TYPE_FSL_MPIC_42] = &kvm_mpic_ops,
#endif
+
#ifdef CONFIG_KVM_XICS
- case KVM_DEV_TYPE_XICS:
- ops = &kvm_xics_ops;
- break;
+ [KVM_DEV_TYPE_XICS] = &kvm_xics_ops,
#endif
+
#ifdef CONFIG_KVM_VFIO
- case KVM_DEV_TYPE_VFIO:
- ops = &kvm_vfio_ops;
- break;
+ [KVM_DEV_TYPE_VFIO] = &kvm_vfio_ops,
#endif
+
#ifdef CONFIG_KVM_ARM_VGIC
- case KVM_DEV_TYPE_ARM_VGIC_V2:
- ops = &kvm_arm_vgic_v2_ops;
- break;
+ [KVM_DEV_TYPE_ARM_VGIC_V2] = &kvm_arm_vgic_v2_ops,
#endif
+
#ifdef CONFIG_S390
- case KVM_DEV_TYPE_FLIC:
- ops = &kvm_flic_ops;
- break;
+ [KVM_DEV_TYPE_FLIC] = &kvm_flic_ops,
#endif
- default:
+};
+
+int kvm_register_device_ops(struct kvm_device_ops *ops, u32 type)
+{
+ if (type >= ARRAY_SIZE(kvm_device_ops_table))
+ return -ENOSPC;
+
+ if (kvm_device_ops_table[type] != NULL)
+ return -EEXIST;
+
+ kvm_device_ops_table[type] = ops;
+ return 0;
+}
+
+static int kvm_ioctl_create_device(struct kvm *kvm,
+ struct kvm_create_device *cd)
+{
+ struct kvm_device_ops *ops = NULL;
+ struct kvm_device *dev;
+ bool test = cd->flags & KVM_CREATE_DEVICE_TEST;
+ int ret;
+
+ if (cd->type >= ARRAY_SIZE(kvm_device_ops_table))
+ return -ENODEV;
+
+ ops = kvm_device_ops_table[cd->type];
+ if (ops == NULL)
return -ENODEV;
- }
if (test)
return 0;
--
2.1.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 2/4] KVM: ARM: vgic: register kvm_device_ops dynamically
2014-09-02 9:27 [PATCH v3 0/4] Make kvm_device_ops registration dynamic Will Deacon
2014-09-02 9:27 ` [PATCH v3 1/4] KVM: device: add simple registration mechanism for kvm_device_ops Will Deacon
@ 2014-09-02 9:27 ` Will Deacon
2014-09-02 9:27 ` [PATCH v3 3/4] KVM: s390: register flic ops dynamically Will Deacon
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Will Deacon @ 2014-09-02 9:27 UTC (permalink / raw)
To: kvm, kvmarm
Cc: cornelia.huck, Alex.Williamson, agraf, gleb, pbonzini,
marc.zyngier, christoffer.dall, Will Deacon
Now that we have a dynamic means to register kvm_device_ops, use that
for the ARM VGIC, instead of relying on the static table.
Cc: Gleb Natapov <gleb@kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
---
include/linux/kvm_host.h | 1 -
virt/kvm/arm/vgic.c | 157 ++++++++++++++++++++++++-----------------------
virt/kvm/kvm_main.c | 4 --
3 files changed, 79 insertions(+), 83 deletions(-)
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index ca105f919f0b..e9a069ddcb2b 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1073,7 +1073,6 @@ int kvm_register_device_ops(struct kvm_device_ops *ops, u32 type);
extern struct kvm_device_ops kvm_mpic_ops;
extern struct kvm_device_ops kvm_xics_ops;
extern struct kvm_device_ops kvm_vfio_ops;
-extern struct kvm_device_ops kvm_arm_vgic_v2_ops;
extern struct kvm_device_ops kvm_flic_ops;
#ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT
diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c
index 73eba793b17f..3ee3ce06bbec 100644
--- a/virt/kvm/arm/vgic.c
+++ b/virt/kvm/arm/vgic.c
@@ -1522,83 +1522,6 @@ int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu)
return 0;
}
-static void vgic_init_maintenance_interrupt(void *info)
-{
- enable_percpu_irq(vgic->maint_irq, 0);
-}
-
-static int vgic_cpu_notify(struct notifier_block *self,
- unsigned long action, void *cpu)
-{
- switch (action) {
- case CPU_STARTING:
- case CPU_STARTING_FROZEN:
- vgic_init_maintenance_interrupt(NULL);
- break;
- case CPU_DYING:
- case CPU_DYING_FROZEN:
- disable_percpu_irq(vgic->maint_irq);
- break;
- }
-
- return NOTIFY_OK;
-}
-
-static struct notifier_block vgic_cpu_nb = {
- .notifier_call = vgic_cpu_notify,
-};
-
-static const struct of_device_id vgic_ids[] = {
- { .compatible = "arm,cortex-a15-gic", .data = vgic_v2_probe, },
- { .compatible = "arm,gic-v3", .data = vgic_v3_probe, },
- {},
-};
-
-int kvm_vgic_hyp_init(void)
-{
- const struct of_device_id *matched_id;
- int (*vgic_probe)(struct device_node *,const struct vgic_ops **,
- const struct vgic_params **);
- struct device_node *vgic_node;
- int ret;
-
- vgic_node = of_find_matching_node_and_match(NULL,
- vgic_ids, &matched_id);
- if (!vgic_node) {
- kvm_err("error: no compatible GIC node found\n");
- return -ENODEV;
- }
-
- vgic_probe = matched_id->data;
- ret = vgic_probe(vgic_node, &vgic_ops, &vgic);
- if (ret)
- return ret;
-
- ret = request_percpu_irq(vgic->maint_irq, vgic_maintenance_handler,
- "vgic", kvm_get_running_vcpus());
- if (ret) {
- kvm_err("Cannot register interrupt %d\n", vgic->maint_irq);
- return ret;
- }
-
- ret = __register_cpu_notifier(&vgic_cpu_nb);
- if (ret) {
- kvm_err("Cannot register vgic CPU notifier\n");
- goto out_free_irq;
- }
-
- /* Callback into for arch code for setup */
- vgic_arch_setup(vgic);
-
- on_each_cpu(vgic_init_maintenance_interrupt, NULL, 1);
-
- return 0;
-
-out_free_irq:
- free_percpu_irq(vgic->maint_irq, kvm_get_running_vcpus());
- return ret;
-}
-
/**
* kvm_vgic_init - Initialize global VGIC state before running any VCPUs
* @kvm: pointer to the kvm struct
@@ -2062,7 +1985,7 @@ static int vgic_create(struct kvm_device *dev, u32 type)
return kvm_vgic_create(dev->kvm);
}
-struct kvm_device_ops kvm_arm_vgic_v2_ops = {
+static struct kvm_device_ops kvm_arm_vgic_v2_ops = {
.name = "kvm-arm-vgic",
.create = vgic_create,
.destroy = vgic_destroy,
@@ -2070,3 +1993,81 @@ struct kvm_device_ops kvm_arm_vgic_v2_ops = {
.get_attr = vgic_get_attr,
.has_attr = vgic_has_attr,
};
+
+static void vgic_init_maintenance_interrupt(void *info)
+{
+ enable_percpu_irq(vgic->maint_irq, 0);
+}
+
+static int vgic_cpu_notify(struct notifier_block *self,
+ unsigned long action, void *cpu)
+{
+ switch (action) {
+ case CPU_STARTING:
+ case CPU_STARTING_FROZEN:
+ vgic_init_maintenance_interrupt(NULL);
+ break;
+ case CPU_DYING:
+ case CPU_DYING_FROZEN:
+ disable_percpu_irq(vgic->maint_irq);
+ break;
+ }
+
+ return NOTIFY_OK;
+}
+
+static struct notifier_block vgic_cpu_nb = {
+ .notifier_call = vgic_cpu_notify,
+};
+
+static const struct of_device_id vgic_ids[] = {
+ { .compatible = "arm,cortex-a15-gic", .data = vgic_v2_probe, },
+ { .compatible = "arm,gic-v3", .data = vgic_v3_probe, },
+ {},
+};
+
+int kvm_vgic_hyp_init(void)
+{
+ const struct of_device_id *matched_id;
+ int (*vgic_probe)(struct device_node *,const struct vgic_ops **,
+ const struct vgic_params **);
+ struct device_node *vgic_node;
+ int ret;
+
+ vgic_node = of_find_matching_node_and_match(NULL,
+ vgic_ids, &matched_id);
+ if (!vgic_node) {
+ kvm_err("error: no compatible GIC node found\n");
+ return -ENODEV;
+ }
+
+ vgic_probe = matched_id->data;
+ ret = vgic_probe(vgic_node, &vgic_ops, &vgic);
+ if (ret)
+ return ret;
+
+ ret = request_percpu_irq(vgic->maint_irq, vgic_maintenance_handler,
+ "vgic", kvm_get_running_vcpus());
+ if (ret) {
+ kvm_err("Cannot register interrupt %d\n", vgic->maint_irq);
+ return ret;
+ }
+
+ ret = __register_cpu_notifier(&vgic_cpu_nb);
+ if (ret) {
+ kvm_err("Cannot register vgic CPU notifier\n");
+ goto out_free_irq;
+ }
+
+ /* Callback into for arch code for setup */
+ vgic_arch_setup(vgic);
+
+ on_each_cpu(vgic_init_maintenance_interrupt, NULL, 1);
+
+ return kvm_register_device_ops(&kvm_arm_vgic_v2_ops,
+ KVM_DEV_TYPE_ARM_VGIC_V2);
+
+out_free_irq:
+ free_percpu_irq(vgic->maint_irq, kvm_get_running_vcpus());
+ return ret;
+}
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 81de6768d2c2..6aaa44c1506e 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2273,10 +2273,6 @@ static struct kvm_device_ops *kvm_device_ops_table[KVM_DEV_TYPE_MAX] = {
[KVM_DEV_TYPE_VFIO] = &kvm_vfio_ops,
#endif
-#ifdef CONFIG_KVM_ARM_VGIC
- [KVM_DEV_TYPE_ARM_VGIC_V2] = &kvm_arm_vgic_v2_ops,
-#endif
-
#ifdef CONFIG_S390
[KVM_DEV_TYPE_FLIC] = &kvm_flic_ops,
#endif
--
2.1.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 3/4] KVM: s390: register flic ops dynamically
2014-09-02 9:27 [PATCH v3 0/4] Make kvm_device_ops registration dynamic Will Deacon
2014-09-02 9:27 ` [PATCH v3 1/4] KVM: device: add simple registration mechanism for kvm_device_ops Will Deacon
2014-09-02 9:27 ` [PATCH v3 2/4] KVM: ARM: vgic: register kvm_device_ops dynamically Will Deacon
@ 2014-09-02 9:27 ` Will Deacon
2014-09-02 9:27 ` [PATCH v3 4/4] KVM: VFIO: register kvm_device_ops dynamically Will Deacon
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Will Deacon @ 2014-09-02 9:27 UTC (permalink / raw)
To: kvm, kvmarm
Cc: cornelia.huck, Alex.Williamson, agraf, gleb, pbonzini,
marc.zyngier, christoffer.dall, Will Deacon
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Using the new kvm_register_device_ops() interface makes us get rid of
an #ifdef in common code.
Cc: Gleb Natapov <gleb@kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
---
arch/s390/kvm/kvm-s390.c | 3 ++-
arch/s390/kvm/kvm-s390.h | 1 +
include/linux/kvm_host.h | 1 -
virt/kvm/kvm_main.c | 4 ----
4 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index ce81eb2ab76a..63793641393c 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -130,7 +130,8 @@ void kvm_arch_check_processor_compat(void *rtn)
int kvm_arch_init(void *opaque)
{
- return 0;
+ /* Register floating interrupt controller interface. */
+ return kvm_register_device_ops(&kvm_flic_ops, KVM_DEV_TYPE_FLIC);
}
void kvm_arch_exit(void)
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h
index 3862fa2cefe0..04e90538c37e 100644
--- a/arch/s390/kvm/kvm-s390.h
+++ b/arch/s390/kvm/kvm-s390.h
@@ -228,6 +228,7 @@ int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu);
int psw_extint_disabled(struct kvm_vcpu *vcpu);
void kvm_s390_destroy_adapters(struct kvm *kvm);
int kvm_s390_si_ext_call_pending(struct kvm_vcpu *vcpu);
+extern struct kvm_device_ops kvm_flic_ops;
/* implemented in guestdbg.c */
void kvm_s390_backup_guest_per_regs(struct kvm_vcpu *vcpu);
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index e9a069ddcb2b..73f796ad0d0b 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1073,7 +1073,6 @@ int kvm_register_device_ops(struct kvm_device_ops *ops, u32 type);
extern struct kvm_device_ops kvm_mpic_ops;
extern struct kvm_device_ops kvm_xics_ops;
extern struct kvm_device_ops kvm_vfio_ops;
-extern struct kvm_device_ops kvm_flic_ops;
#ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 6aaa44c1506e..78b25a44db53 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2272,10 +2272,6 @@ static struct kvm_device_ops *kvm_device_ops_table[KVM_DEV_TYPE_MAX] = {
#ifdef CONFIG_KVM_VFIO
[KVM_DEV_TYPE_VFIO] = &kvm_vfio_ops,
#endif
-
-#ifdef CONFIG_S390
- [KVM_DEV_TYPE_FLIC] = &kvm_flic_ops,
-#endif
};
int kvm_register_device_ops(struct kvm_device_ops *ops, u32 type)
--
2.1.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 4/4] KVM: VFIO: register kvm_device_ops dynamically
2014-09-02 9:27 [PATCH v3 0/4] Make kvm_device_ops registration dynamic Will Deacon
` (2 preceding siblings ...)
2014-09-02 9:27 ` [PATCH v3 3/4] KVM: s390: register flic ops dynamically Will Deacon
@ 2014-09-02 9:27 ` Will Deacon
2014-09-11 17:12 ` [PATCH v3 0/4] Make kvm_device_ops registration dynamic Will Deacon
2014-09-16 10:33 ` Paolo Bonzini
5 siblings, 0 replies; 7+ messages in thread
From: Will Deacon @ 2014-09-02 9:27 UTC (permalink / raw)
To: kvm, kvmarm
Cc: cornelia.huck, Alex.Williamson, agraf, gleb, pbonzini,
marc.zyngier, christoffer.dall, Will Deacon
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>
---
include/linux/kvm_host.h | 1 -
virt/kvm/kvm_main.c | 4 ----
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 73f796ad0d0b..55a1618a19dc 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1072,7 +1072,6 @@ int kvm_register_device_ops(struct kvm_device_ops *ops, u32 type);
extern struct kvm_device_ops kvm_mpic_ops;
extern struct kvm_device_ops kvm_xics_ops;
-extern struct kvm_device_ops kvm_vfio_ops;
#ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 78b25a44db53..e9a703eca8c1 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2268,10 +2268,6 @@ static struct kvm_device_ops *kvm_device_ops_table[KVM_DEV_TYPE_MAX] = {
#ifdef CONFIG_KVM_XICS
[KVM_DEV_TYPE_XICS] = &kvm_xics_ops,
#endif
-
-#ifdef CONFIG_KVM_VFIO
- [KVM_DEV_TYPE_VFIO] = &kvm_vfio_ops,
-#endif
};
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)
kfree(dev); /* alloc by kvm_ioctl_create_device, free by .destroy */
}
+static int kvm_vfio_create(struct kvm_device *dev, u32 type);
+
+static struct kvm_device_ops kvm_vfio_ops = {
+ .name = "kvm-vfio",
+ .create = kvm_vfio_create,
+ .destroy = kvm_vfio_destroy,
+ .set_attr = kvm_vfio_set_attr,
+ .has_attr = kvm_vfio_has_attr,
+};
+
static int kvm_vfio_create(struct kvm_device *dev, u32 type)
{
struct kvm_device *tmp;
@@ -268,10 +278,8 @@ static int kvm_vfio_create(struct kvm_device *dev, u32 type)
return 0;
}
-struct kvm_device_ops kvm_vfio_ops = {
- .name = "kvm-vfio",
- .create = kvm_vfio_create,
- .destroy = kvm_vfio_destroy,
- .set_attr = kvm_vfio_set_attr,
- .has_attr = kvm_vfio_has_attr,
-};
+static int __init kvm_vfio_ops_init(void)
+{
+ return kvm_register_device_ops(&kvm_vfio_ops, KVM_DEV_TYPE_VFIO);
+}
+module_init(kvm_vfio_ops_init);
--
2.1.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 0/4] Make kvm_device_ops registration dynamic
2014-09-02 9:27 [PATCH v3 0/4] Make kvm_device_ops registration dynamic Will Deacon
` (3 preceding siblings ...)
2014-09-02 9:27 ` [PATCH v3 4/4] KVM: VFIO: register kvm_device_ops dynamically Will Deacon
@ 2014-09-11 17:12 ` Will Deacon
2014-09-16 10:33 ` Paolo Bonzini
5 siblings, 0 replies; 7+ messages in thread
From: Will Deacon @ 2014-09-11 17:12 UTC (permalink / raw)
To: kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu
Cc: cornelia.huck@de.ibm.com, Alex.Williamson@redhat.com,
agraf@suse.de, gleb@kernel.org, pbonzini@redhat.com, Marc Zyngier,
christoffer.dall@linaro.org
Hi Paolo,
On Tue, Sep 02, 2014 at 10:27:32AM +0100, Will Deacon wrote:
> Hi all,
>
> This is version 3 of the patches originally posted here:
>
> v1: http://www.spinics.net/lists/kvm-arm/msg10219.html
> v2: http://www.spinics.net/lists/kvm/msg105197.html
>
> Changes since v2 include:
>
> - Rebased onto 3.17-rc* (the vgic code changed a lot!)
> - Added relevant acks
>
> The mpic, flic and xics are still not ported over, as I don't want to
> risk breaking those devices (it's not clear at which point they need to
> be registered).
Any further comments on this lot?
Will
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 0/4] Make kvm_device_ops registration dynamic
2014-09-02 9:27 [PATCH v3 0/4] Make kvm_device_ops registration dynamic Will Deacon
` (4 preceding siblings ...)
2014-09-11 17:12 ` [PATCH v3 0/4] Make kvm_device_ops registration dynamic Will Deacon
@ 2014-09-16 10:33 ` Paolo Bonzini
5 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2014-09-16 10:33 UTC (permalink / raw)
To: Will Deacon, kvm, kvmarm
Cc: cornelia.huck, Alex.Williamson, agraf, gleb, marc.zyngier,
christoffer.dall, Paul Mackerras
Il 02/09/2014 11:27, Will Deacon ha scritto:
> The mpic, flic and xics are still not ported over, as I don't want to
> risk breaking those devices
Actually FLIC is ported. :)
>
> arch/s390/kvm/kvm-s390.c | 3 +-
> arch/s390/kvm/kvm-s390.h | 1 +
> include/linux/kvm_host.h | 4 +-
> include/uapi/linux/kvm.h | 22 +++++--
> virt/kvm/arm/vgic.c | 157 ++++++++++++++++++++++++-----------------------
> virt/kvm/kvm_main.c | 57 +++++++++--------
> virt/kvm/vfio.c | 22 ++++---
> 7 files changed, 142 insertions(+), 124 deletions(-)
>
Thanks, applying to kvm/queue. Alex (Graf) and Paul, can you look at
MPIC and XICS?
Paolo
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-09-16 10:33 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-02 9:27 [PATCH v3 0/4] Make kvm_device_ops registration dynamic Will Deacon
2014-09-02 9:27 ` [PATCH v3 1/4] KVM: device: add simple registration mechanism for kvm_device_ops Will Deacon
2014-09-02 9:27 ` [PATCH v3 2/4] KVM: ARM: vgic: register kvm_device_ops dynamically Will Deacon
2014-09-02 9:27 ` [PATCH v3 3/4] KVM: s390: register flic ops dynamically Will Deacon
2014-09-02 9:27 ` [PATCH v3 4/4] KVM: VFIO: register kvm_device_ops dynamically Will Deacon
2014-09-11 17:12 ` [PATCH v3 0/4] Make kvm_device_ops registration dynamic Will Deacon
2014-09-16 10:33 ` Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox