* [v2 1/5] vfio: Rearrange functions to get vfio_group from dev
2016-10-29 20:05 [v2 0/5] plumb kvm/vfio to allow getting kvm from vfio_group Jike Song
@ 2016-10-29 20:05 ` Jike Song
2016-10-29 20:05 ` [v2 2/5] vfio: export functions to get vfio_group from device and put it Jike Song
` (3 subsequent siblings)
4 siblings, 0 replies; 11+ messages in thread
From: Jike Song @ 2016-10-29 20:05 UTC (permalink / raw)
To: pbonzini, alex.williamson, guangrong.xiao
Cc: kwankhede, cjia, kevin.tian, jike.song, kvm
From: Kirti Wankhede <kwankhede@nvidia.com>
This patch rearranges functions to get vfio_group from device
Signed-off-by: Kirti Wankhede <kwankhede@nvidia.com>
Signed-off-by: Neo Jia <cjia@nvidia.com>
Change-Id: I1f93262bdbab75094bc24b087b29da35ba70c4c6
---
drivers/vfio/vfio.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
index d1d70e0..23bc86c 100644
--- a/drivers/vfio/vfio.c
+++ b/drivers/vfio/vfio.c
@@ -480,6 +480,21 @@ static struct vfio_group *vfio_group_get_from_minor(int minor)
return group;
}
+static struct vfio_group *vfio_group_get_from_dev(struct device *dev)
+{
+ struct iommu_group *iommu_group;
+ struct vfio_group *group;
+
+ iommu_group = iommu_group_get(dev);
+ if (!iommu_group)
+ return NULL;
+
+ group = vfio_group_get_from_iommu(iommu_group);
+ iommu_group_put(iommu_group);
+
+ return group;
+}
+
/**
* Device objects - create, release, get, put, search
*/
@@ -811,16 +826,10 @@ int vfio_add_group_dev(struct device *dev,
*/
struct vfio_device *vfio_device_get_from_dev(struct device *dev)
{
- struct iommu_group *iommu_group;
struct vfio_group *group;
struct vfio_device *device;
- iommu_group = iommu_group_get(dev);
- if (!iommu_group)
- return NULL;
-
- group = vfio_group_get_from_iommu(iommu_group);
- iommu_group_put(iommu_group);
+ group = vfio_group_get_from_dev(dev);
if (!group)
return NULL;
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread* [v2 2/5] vfio: export functions to get vfio_group from device and put it
2016-10-29 20:05 [v2 0/5] plumb kvm/vfio to allow getting kvm from vfio_group Jike Song
2016-10-29 20:05 ` [v2 1/5] vfio: Rearrange functions to get vfio_group from dev Jike Song
@ 2016-10-29 20:05 ` Jike Song
2016-10-29 20:05 ` [v2 3/5] KVM: move kvm_{get|put}_kvm to kvm_host.h Jike Song
` (2 subsequent siblings)
4 siblings, 0 replies; 11+ messages in thread
From: Jike Song @ 2016-10-29 20:05 UTC (permalink / raw)
To: pbonzini, alex.williamson, guangrong.xiao
Cc: kwankhede, cjia, kevin.tian, jike.song, kvm
External users might want to get the vfio_group from a given
device, and put it after the usage.
Signed-off-by: Jike Song <jike.song@intel.com>
---
drivers/vfio/vfio.c | 6 ++++--
include/linux/vfio.h | 3 +++
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
index 23bc86c..e3e58e3 100644
--- a/drivers/vfio/vfio.c
+++ b/drivers/vfio/vfio.c
@@ -414,10 +414,11 @@ static void vfio_group_release(struct kref *kref)
iommu_group_put(iommu_group);
}
-static void vfio_group_put(struct vfio_group *group)
+void vfio_group_put(struct vfio_group *group)
{
kref_put_mutex(&group->kref, vfio_group_release, &vfio.group_lock);
}
+EXPORT_SYMBOL_GPL(vfio_group_put);
/* Assume group_lock or group reference is held */
static void vfio_group_get(struct vfio_group *group)
@@ -480,7 +481,7 @@ static struct vfio_group *vfio_group_get_from_minor(int minor)
return group;
}
-static struct vfio_group *vfio_group_get_from_dev(struct device *dev)
+struct vfio_group *vfio_group_get_from_dev(struct device *dev)
{
struct iommu_group *iommu_group;
struct vfio_group *group;
@@ -494,6 +495,7 @@ static struct vfio_group *vfio_group_get_from_dev(struct device *dev)
return group;
}
+EXPORT_SYMBOL_GPL(vfio_group_get_from_dev);
/**
* Device objects - create, release, get, put, search
diff --git a/include/linux/vfio.h b/include/linux/vfio.h
index 0ecae0b..ad9b857 100644
--- a/include/linux/vfio.h
+++ b/include/linux/vfio.h
@@ -92,6 +92,9 @@ extern void vfio_unregister_iommu_driver(
extern long vfio_external_check_extension(struct vfio_group *group,
unsigned long arg);
+extern struct vfio_group *vfio_group_get_from_dev(struct device *dev);
+extern void vfio_group_put(struct vfio_group *group);
+
/*
* Sub-module helpers
*/
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread* [v2 3/5] KVM: move kvm_{get|put}_kvm to kvm_host.h
2016-10-29 20:05 [v2 0/5] plumb kvm/vfio to allow getting kvm from vfio_group Jike Song
2016-10-29 20:05 ` [v2 1/5] vfio: Rearrange functions to get vfio_group from dev Jike Song
2016-10-29 20:05 ` [v2 2/5] vfio: export functions to get vfio_group from device and put it Jike Song
@ 2016-10-29 20:05 ` Jike Song
2016-10-30 8:53 ` Paolo Bonzini
2016-10-29 20:05 ` [v2 4/5] vfio: implement APIs to set/put kvm to/from vfio group Jike Song
2016-10-29 20:05 ` [v2 5/5] KVM: set/clear kvm to/from vfio group during add/delete Jike Song
4 siblings, 1 reply; 11+ messages in thread
From: Jike Song @ 2016-10-29 20:05 UTC (permalink / raw)
To: pbonzini, alex.williamson, guangrong.xiao
Cc: kwankhede, cjia, kevin.tian, jike.song, kvm
So that external users like vfio can call them without introducing
symbol-level dependency. A destroy() method is introduced to the kvm
structure so that we don't have to also expose kvm_destroy_vm.
Signed-off-by: Jike Song <jike.song@intel.com>
---
include/linux/kvm_host.h | 13 +++++++++++--
virt/kvm/kvm_main.c | 16 ++--------------
2 files changed, 13 insertions(+), 16 deletions(-)
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 01c0b9c..583e9e2 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -405,6 +405,7 @@ struct kvm {
struct kvm_vm_stat stat;
struct kvm_arch arch;
atomic_t users_count;
+ void (*destroy)(struct kvm *kvm);
#ifdef KVM_COALESCED_MMIO_PAGE_OFFSET
struct kvm_coalesced_mmio_ring *coalesced_mmio_ring;
spinlock_t ring_lock;
@@ -526,8 +527,16 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
struct module *module);
void kvm_exit(void);
-void kvm_get_kvm(struct kvm *kvm);
-void kvm_put_kvm(struct kvm *kvm);
+static inline void kvm_get_kvm(struct kvm *kvm)
+{
+ atomic_inc(&kvm->users_count);
+}
+
+static inline void kvm_put_kvm(struct kvm *kvm)
+{
+ if (atomic_dec_and_test(&kvm->users_count))
+ kvm->destroy(kvm);
+}
static inline struct kvm_memslots *__kvm_memslots(struct kvm *kvm, int as_id)
{
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 81dfc73..996a88d 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -106,6 +106,7 @@
static int kvm_debugfs_num_entries;
static const struct file_operations *stat_fops_per_vm[];
+static void kvm_destroy_vm(struct kvm *kvm);
static long kvm_vcpu_ioctl(struct file *file, unsigned int ioctl,
unsigned long arg);
#ifdef CONFIG_KVM_COMPAT
@@ -620,6 +621,7 @@ static struct kvm *kvm_create_vm(unsigned long type)
mutex_init(&kvm->irq_lock);
mutex_init(&kvm->slots_lock);
atomic_set(&kvm->users_count, 1);
+ kvm->destroy = kvm_destroy_vm;
INIT_LIST_HEAD(&kvm->devices);
r = kvm_arch_init_vm(kvm, type);
@@ -740,20 +742,6 @@ static void kvm_destroy_vm(struct kvm *kvm)
mmdrop(mm);
}
-void kvm_get_kvm(struct kvm *kvm)
-{
- atomic_inc(&kvm->users_count);
-}
-EXPORT_SYMBOL_GPL(kvm_get_kvm);
-
-void kvm_put_kvm(struct kvm *kvm)
-{
- if (atomic_dec_and_test(&kvm->users_count))
- kvm_destroy_vm(kvm);
-}
-EXPORT_SYMBOL_GPL(kvm_put_kvm);
-
-
static int kvm_vm_release(struct inode *inode, struct file *filp)
{
struct kvm *kvm = filp->private_data;
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [v2 3/5] KVM: move kvm_{get|put}_kvm to kvm_host.h
2016-10-29 20:05 ` [v2 3/5] KVM: move kvm_{get|put}_kvm to kvm_host.h Jike Song
@ 2016-10-30 8:53 ` Paolo Bonzini
2016-10-31 1:40 ` Jike Song
0 siblings, 1 reply; 11+ messages in thread
From: Paolo Bonzini @ 2016-10-30 8:53 UTC (permalink / raw)
To: Jike Song, alex.williamson, guangrong.xiao
Cc: kwankhede, cjia, kevin.tian, kvm
On 29/10/2016 22:05, Jike Song wrote:
> So that external users like vfio can call them without introducing
> symbol-level dependency. A destroy() method is introduced to the kvm
> structure so that we don't have to also expose kvm_destroy_vm.
VFIO does not need kvm_put_kvm, so kvm_destroy_vm need not be exported
(or kvm_put_kvm can remain non-inline).
Paolo
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [v2 3/5] KVM: move kvm_{get|put}_kvm to kvm_host.h
2016-10-30 8:53 ` Paolo Bonzini
@ 2016-10-31 1:40 ` Jike Song
0 siblings, 0 replies; 11+ messages in thread
From: Jike Song @ 2016-10-31 1:40 UTC (permalink / raw)
To: Paolo Bonzini
Cc: alex.williamson, guangrong.xiao, kwankhede, cjia, kevin.tian, kvm
On 10/30/2016 04:53 PM, Paolo Bonzini wrote:
> On 29/10/2016 22:05, Jike Song wrote:
>> So that external users like vfio can call them without introducing
>> symbol-level dependency. A destroy() method is introduced to the kvm
>> structure so that we don't have to also expose kvm_destroy_vm.
>
> VFIO does not need kvm_put_kvm, so kvm_destroy_vm need not be exported
> (or kvm_put_kvm can remain non-inline).
Yes, good point. Will keep kvm_put_kvm.
--
Thanks,
Jike
^ permalink raw reply [flat|nested] 11+ messages in thread
* [v2 4/5] vfio: implement APIs to set/put kvm to/from vfio group
2016-10-29 20:05 [v2 0/5] plumb kvm/vfio to allow getting kvm from vfio_group Jike Song
` (2 preceding siblings ...)
2016-10-29 20:05 ` [v2 3/5] KVM: move kvm_{get|put}_kvm to kvm_host.h Jike Song
@ 2016-10-29 20:05 ` Jike Song
2016-10-29 22:15 ` kbuild test robot
2016-10-30 8:52 ` Paolo Bonzini
2016-10-29 20:05 ` [v2 5/5] KVM: set/clear kvm to/from vfio group during add/delete Jike Song
4 siblings, 2 replies; 11+ messages in thread
From: Jike Song @ 2016-10-29 20:05 UTC (permalink / raw)
To: pbonzini, alex.williamson, guangrong.xiao
Cc: kwankhede, cjia, kevin.tian, jike.song, kvm
A vfio_group may be or may not be attached to a KVM instance,
but if it is, the user of vfio_group might also want to know
which KVM instance it is attached to, to perform some operations
exclusively provided by KVM. In VFIO there are already external
APIs for KVM to get/put the vfio_group, by extending these APIs
KVM can set or clear itself to/from the vfio_group, for external
users to get/put.
Signed-off-by: Jike Song <jike.song@intel.com>
---
drivers/vfio/vfio.c | 30 ++++++++++++++++++++++++++++++
include/linux/vfio.h | 4 ++++
2 files changed, 34 insertions(+)
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
index e3e58e3..a5c90d2 100644
--- a/drivers/vfio/vfio.c
+++ b/drivers/vfio/vfio.c
@@ -34,6 +34,7 @@
#include <linux/uaccess.h>
#include <linux/vfio.h>
#include <linux/wait.h>
+#include <linux/kvm_host.h>
#define DRIVER_VERSION "0.3"
#define DRIVER_AUTHOR "Alex Williamson <alex.williamson@redhat.com>"
@@ -86,6 +87,10 @@ struct vfio_group {
struct mutex unbound_lock;
atomic_t opened;
bool noiommu;
+ struct {
+ struct kvm *kvm;
+ struct mutex lock;
+ } udata;
};
struct vfio_device {
@@ -333,6 +338,7 @@ static struct vfio_group *vfio_create_group(struct iommu_group *iommu_group)
mutex_init(&group->device_lock);
INIT_LIST_HEAD(&group->unbound_list);
mutex_init(&group->unbound_lock);
+ mutex_init(&group->udata.lock);
atomic_set(&group->container_users, 0);
atomic_set(&group->opened, 0);
group->iommu_group = iommu_group;
@@ -1739,6 +1745,30 @@ long vfio_external_check_extension(struct vfio_group *group, unsigned long arg)
}
EXPORT_SYMBOL_GPL(vfio_external_check_extension);
+void vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm)
+{
+ mutex_lock(&group->udata.lock);
+ group->udata.kvm = kvm;
+ mutex_unlock(&group->udata.lock);
+}
+EXPORT_SYMBOL_GPL(vfio_group_set_kvm);
+
+struct kvm *vfio_group_get_kvm(struct vfio_group *group)
+{
+ mutex_lock(&group->udata.lock);
+
+ if (!group->udata.kvm)
+ goto out;
+
+ kvm_get_kvm(group->udata.kvm);
+ mutex_unlock(&group->udata.lock);
+ return group->udata.kvm;
+out:
+ mutex_unlock(&group->udata.lock);
+ return NULL;
+}
+EXPORT_SYMBOL_GPL(vfio_group_get_kvm);
+
/**
* Sub-module support
*/
diff --git a/include/linux/vfio.h b/include/linux/vfio.h
index ad9b857..3abd690 100644
--- a/include/linux/vfio.h
+++ b/include/linux/vfio.h
@@ -95,6 +95,10 @@ extern long vfio_external_check_extension(struct vfio_group *group,
extern struct vfio_group *vfio_group_get_from_dev(struct device *dev);
extern void vfio_group_put(struct vfio_group *group);
+struct kvm;
+extern void vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm);
+extern struct kvm *vfio_group_get_kvm(struct vfio_group *group);
+
/*
* Sub-module helpers
*/
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [v2 4/5] vfio: implement APIs to set/put kvm to/from vfio group
2016-10-29 20:05 ` [v2 4/5] vfio: implement APIs to set/put kvm to/from vfio group Jike Song
@ 2016-10-29 22:15 ` kbuild test robot
2016-10-30 8:52 ` Paolo Bonzini
1 sibling, 0 replies; 11+ messages in thread
From: kbuild test robot @ 2016-10-29 22:15 UTC (permalink / raw)
To: Jike Song
Cc: kbuild-all, pbonzini, alex.williamson, guangrong.xiao, kwankhede,
cjia, kevin.tian, jike.song, kvm
[-- Attachment #1: Type: text/plain, Size: 3564 bytes --]
Hi Jike,
[auto build test ERROR on vfio/next]
[also build test ERROR on v4.9-rc3]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
[Suggest to use git(>=2.9.0) format-patch --base=<commit> (or --base=auto for convenience) to record what (public, well-known) commit your patch series was built on]
[Check https://git-scm.com/docs/git-format-patch for more information]
url: https://github.com/0day-ci/linux/commits/Jike-Song/plumb-kvm-vfio-to-allow-getting-kvm-from-vfio_group/20161030-041353
base: https://github.com/awilliam/linux-vfio.git next
config: ia64-allmodconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 6.2.0
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=ia64
All errors (new ones prefixed by >>):
In file included from include/linux/kvm_host.h:31:0,
from drivers/vfio/vfio.c:37:
>> include/uapi/linux/kvm.h:13:21: fatal error: asm/kvm.h: No such file or directory
#include <asm/kvm.h>
^
compilation terminated.
vim +13 include/uapi/linux/kvm.h
6aa8b732 include/linux/kvm.h Avi Kivity 2006-12-10 1 #ifndef __LINUX_KVM_H
6aa8b732 include/linux/kvm.h Avi Kivity 2006-12-10 2 #define __LINUX_KVM_H
6aa8b732 include/linux/kvm.h Avi Kivity 2006-12-10 3
6aa8b732 include/linux/kvm.h Avi Kivity 2006-12-10 4 /*
6aa8b732 include/linux/kvm.h Avi Kivity 2006-12-10 5 * Userspace interface for /dev/kvm - kernel based virtual machine
6aa8b732 include/linux/kvm.h Avi Kivity 2006-12-10 6 *
dea8caee include/linux/kvm.h Rusty Russell 2007-07-17 7 * Note: you must update KVM_API_VERSION if you change this interface.
6aa8b732 include/linux/kvm.h Avi Kivity 2006-12-10 8 */
6aa8b732 include/linux/kvm.h Avi Kivity 2006-12-10 9
00bfddaf include/linux/kvm.h Jaswinder Singh Rajput 2009-01-15 10 #include <linux/types.h>
97646202 include/linux/kvm.h Christian Borntraeger 2008-03-12 11 #include <linux/compiler.h>
6aa8b732 include/linux/kvm.h Avi Kivity 2006-12-10 12 #include <linux/ioctl.h>
f6a40e3b include/linux/kvm.h Jerone Young 2007-11-19 @13 #include <asm/kvm.h>
6aa8b732 include/linux/kvm.h Avi Kivity 2006-12-10 14
2ff81f70 include/linux/kvm.h Avi Kivity 2007-04-29 15 #define KVM_API_VERSION 12
0b76e20b include/linux/kvm.h Avi Kivity 2006-12-22 16
c54d2aba include/linux/kvm.h Jan Kiszka 2009-11-02 17 /* *** Deprecated interfaces *** */
c54d2aba include/linux/kvm.h Jan Kiszka 2009-11-02 18
c54d2aba include/linux/kvm.h Jan Kiszka 2009-11-02 19 #define KVM_TRC_SHIFT 16
c54d2aba include/linux/kvm.h Jan Kiszka 2009-11-02 20
c54d2aba include/linux/kvm.h Jan Kiszka 2009-11-02 21 #define KVM_TRC_ENTRYEXIT (1 << KVM_TRC_SHIFT)
:::::: The code at line 13 was first introduced by commit
:::::: f6a40e3bdf5fe0a7d7d7f2dbc5b10158fbdad968 KVM: Portability: Move kvm_memory_alias to asm/kvm.h
:::::: TO: Jerone Young <jyoung5@us.ibm.com>
:::::: CC: Avi Kivity <avi@qumranet.com>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 44284 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [v2 4/5] vfio: implement APIs to set/put kvm to/from vfio group
2016-10-29 20:05 ` [v2 4/5] vfio: implement APIs to set/put kvm to/from vfio group Jike Song
2016-10-29 22:15 ` kbuild test robot
@ 2016-10-30 8:52 ` Paolo Bonzini
2016-10-31 2:12 ` Jike Song
1 sibling, 1 reply; 11+ messages in thread
From: Paolo Bonzini @ 2016-10-30 8:52 UTC (permalink / raw)
To: Jike Song, alex.williamson, guangrong.xiao
Cc: kwankhede, cjia, kevin.tian, kvm
On 29/10/2016 22:05, Jike Song wrote:
> + mutex_lock(&group->udata.lock);
> +
> + if (!group->udata.kvm)
> + goto out;
> +
> + kvm_get_kvm(group->udata.kvm);
> + mutex_unlock(&group->udata.lock);
> + return group->udata.kvm;
There is still a very small race window, so you need to assign
group->udata.kvm to a local variable inside the mutex, and then return.
Paolo
> +out:
> + mutex_unlock(&group->udata.lock);
> + return NULL;
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [v2 4/5] vfio: implement APIs to set/put kvm to/from vfio group
2016-10-30 8:52 ` Paolo Bonzini
@ 2016-10-31 2:12 ` Jike Song
0 siblings, 0 replies; 11+ messages in thread
From: Jike Song @ 2016-10-31 2:12 UTC (permalink / raw)
To: Paolo Bonzini
Cc: alex.williamson, guangrong.xiao, kwankhede, cjia, kevin.tian, kvm
On 10/30/2016 04:52 PM, Paolo Bonzini wrote:
> On 29/10/2016 22:05, Jike Song wrote:
>> + mutex_lock(&group->udata.lock);
>> +
>> + if (!group->udata.kvm)
>> + goto out;
>> +
>> + kvm_get_kvm(group->udata.kvm);
>> + mutex_unlock(&group->udata.lock);
>> + return group->udata.kvm;
>
> There is still a very small race window, so you need to assign
> group->udata.kvm to a local variable inside the mutex, and then return.
Ok, will do that, thanks :)
--
Thanks,
Jike
^ permalink raw reply [flat|nested] 11+ messages in thread
* [v2 5/5] KVM: set/clear kvm to/from vfio group during add/delete
2016-10-29 20:05 [v2 0/5] plumb kvm/vfio to allow getting kvm from vfio_group Jike Song
` (3 preceding siblings ...)
2016-10-29 20:05 ` [v2 4/5] vfio: implement APIs to set/put kvm to/from vfio group Jike Song
@ 2016-10-29 20:05 ` Jike Song
4 siblings, 0 replies; 11+ messages in thread
From: Jike Song @ 2016-10-29 20:05 UTC (permalink / raw)
To: pbonzini, alex.williamson, guangrong.xiao
Cc: kwankhede, cjia, kevin.tian, jike.song, kvm
With VFIO being capable of carrying usrdata, we can extend the
existing interfaces between KVM and VFIO, whenever a group is
added to or deleted from KVM, set/clear KVM instance to/from
this group. That enables 3rd-party users of vfio_group to know
which KVM it attached to, if there is one.
Signed-off-by: Jike Song <jike.song@intel.com>
---
virt/kvm/vfio.c | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/virt/kvm/vfio.c b/virt/kvm/vfio.c
index 1dd087d..62da226 100644
--- a/virt/kvm/vfio.c
+++ b/virt/kvm/vfio.c
@@ -60,6 +60,34 @@ static void kvm_vfio_group_put_external_user(struct vfio_group *vfio_group)
symbol_put(vfio_group_put_external_user);
}
+static void kvm_vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm)
+{
+ void (*fn)(struct vfio_group *, struct kvm *);
+
+ fn = symbol_get(vfio_group_set_kvm);
+ if (!fn)
+ return;
+
+ fn(group, kvm);
+ kvm_get_kvm(kvm);
+
+ symbol_put(vfio_group_set_kvm);
+}
+
+static void kvm_vfio_group_clear_kvm(struct vfio_group *group, struct kvm *kvm)
+{
+ void (*fn)(struct vfio_group *, struct kvm *);
+
+ fn = symbol_get(vfio_group_set_kvm);
+ if (!fn)
+ return;
+
+ fn(group, NULL);
+ kvm_put_kvm(kvm);
+
+ symbol_put(vfio_group_set_kvm);
+}
+
static bool kvm_vfio_group_is_coherent(struct vfio_group *vfio_group)
{
long (*fn)(struct vfio_group *, unsigned long);
@@ -155,6 +183,8 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg)
list_add_tail(&kvg->node, &kv->group_list);
kvg->vfio_group = vfio_group;
+ kvm_vfio_group_set_kvm(vfio_group, dev->kvm);
+
kvm_arch_start_assignment(dev->kvm);
mutex_unlock(&kv->lock);
@@ -196,6 +226,8 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg)
mutex_unlock(&kv->lock);
+ kvm_vfio_group_clear_kvm(vfio_group, dev->kvm);
+
kvm_vfio_group_put_external_user(vfio_group);
kvm_vfio_update_coherency(dev);
@@ -240,6 +272,7 @@ static void kvm_vfio_destroy(struct kvm_device *dev)
struct kvm_vfio_group *kvg, *tmp;
list_for_each_entry_safe(kvg, tmp, &kv->group_list, node) {
+ kvm_vfio_group_clear_kvm(kvg->vfio_group, dev->kvm);
kvm_vfio_group_put_external_user(kvg->vfio_group);
list_del(&kvg->node);
kfree(kvg);
--
1.9.1
^ permalink raw reply related [flat|nested] 11+ messages in thread