Skip to content

Commit 2fc1bec

Browse files
l1viathanawilliam
authored andcommitted
kvm: set/clear kvm to/from vfio_group when group add/delete
Sometimes users need to be aware when a vfio_group attaches to a KVM or detaches from it. KVM already calls get/put method from vfio to manipulate the vfio_group reference, it can notify vfio_group in a similar way. Cc: Kirti Wankhede <[email protected]> Cc: Xiao Guangrong <[email protected]> Signed-off-by: Jike Song <[email protected]> Acked-by: Paolo Bonzini <[email protected]> Signed-off-by: Alex Williamson <[email protected]>
1 parent ccd46db commit 2fc1bec

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

virt/kvm/vfio.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,19 @@ static void kvm_vfio_group_put_external_user(struct vfio_group *vfio_group)
6060
symbol_put(vfio_group_put_external_user);
6161
}
6262

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+
6376
static bool kvm_vfio_group_is_coherent(struct vfio_group *vfio_group)
6477
{
6578
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)
159172

160173
mutex_unlock(&kv->lock);
161174

175+
kvm_vfio_group_set_kvm(vfio_group, dev->kvm);
176+
162177
kvm_vfio_update_coherency(dev);
163178

164179
return 0;
@@ -196,6 +211,8 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg)
196211

197212
mutex_unlock(&kv->lock);
198213

214+
kvm_vfio_group_set_kvm(vfio_group, NULL);
215+
199216
kvm_vfio_group_put_external_user(vfio_group);
200217

201218
kvm_vfio_update_coherency(dev);
@@ -240,6 +257,7 @@ static void kvm_vfio_destroy(struct kvm_device *dev)
240257
struct kvm_vfio_group *kvg, *tmp;
241258

242259
list_for_each_entry_safe(kvg, tmp, &kv->group_list, node) {
260+
kvm_vfio_group_set_kvm(kvg->vfio_group, NULL);
243261
kvm_vfio_group_put_external_user(kvg->vfio_group);
244262
list_del(&kvg->node);
245263
kfree(kvg);

0 commit comments

Comments
 (0)