diff options
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/vfio.c | 18 |
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 | ||
63 | static 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 | |||
63 | static bool kvm_vfio_group_is_coherent(struct vfio_group *vfio_group) | 76 | static 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); |