summaryrefslogtreecommitdiffstats
path: root/virt
diff options
context:
space:
mode:
Diffstat (limited to 'virt')
-rw-r--r--virt/kvm/vfio.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/virt/kvm/vfio.c b/virt/kvm/vfio.c
index 1dd087da6f31..d32f239eb471 100644
--- a/virt/kvm/vfio.c
+++ b/virt/kvm/vfio.c
@@ -60,6 +60,19 @@ static void kvm_vfio_group_put_external_user(struct vfio_group *vfio_group)
60 symbol_put(vfio_group_put_external_user); 60 symbol_put(vfio_group_put_external_user);
61} 61}
62 62
63static void kvm_vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm)
64{
65 void (*fn)(struct vfio_group *, struct kvm *);
66
67 fn = symbol_get(vfio_group_set_kvm);
68 if (!fn)
69 return;
70
71 fn(group, kvm);
72
73 symbol_put(vfio_group_set_kvm);
74}
75
63static bool kvm_vfio_group_is_coherent(struct vfio_group *vfio_group) 76static bool kvm_vfio_group_is_coherent(struct vfio_group *vfio_group)
64{ 77{
65 long (*fn)(struct vfio_group *, unsigned long); 78 long (*fn)(struct vfio_group *, unsigned long);
@@ -159,6 +172,8 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg)
159 172
160 mutex_unlock(&kv->lock); 173 mutex_unlock(&kv->lock);
161 174
175 kvm_vfio_group_set_kvm(vfio_group, dev->kvm);
176
162 kvm_vfio_update_coherency(dev); 177 kvm_vfio_update_coherency(dev);
163 178
164 return 0; 179 return 0;
@@ -196,6 +211,8 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg)
196 211
197 mutex_unlock(&kv->lock); 212 mutex_unlock(&kv->lock);
198 213
214 kvm_vfio_group_set_kvm(vfio_group, NULL);
215
199 kvm_vfio_group_put_external_user(vfio_group); 216 kvm_vfio_group_put_external_user(vfio_group);
200 217
201 kvm_vfio_update_coherency(dev); 218 kvm_vfio_update_coherency(dev);
@@ -240,6 +257,7 @@ static void kvm_vfio_destroy(struct kvm_device *dev)
240 struct kvm_vfio_group *kvg, *tmp; 257 struct kvm_vfio_group *kvg, *tmp;
241 258
242 list_for_each_entry_safe(kvg, tmp, &kv->group_list, node) { 259 list_for_each_entry_safe(kvg, tmp, &kv->group_list, node) {
260 kvm_vfio_group_set_kvm(kvg->vfio_group, NULL);
243 kvm_vfio_group_put_external_user(kvg->vfio_group); 261 kvm_vfio_group_put_external_user(kvg->vfio_group);
244 list_del(&kvg->node); 262 list_del(&kvg->node);
245 kfree(kvg); 263 kfree(kvg);