Skip to content

Commit

Permalink
kvm: set/clear kvm to/from vfio_group when group add/delete
Browse files Browse the repository at this point in the history
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]>
  • Loading branch information
l1viathan authored and awilliam committed Dec 1, 2016
1 parent ccd46db commit 2fc1bec
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions virt/kvm/vfio.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,19 @@ 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);

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);
Expand Down Expand Up @@ -159,6 +172,8 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg)

mutex_unlock(&kv->lock);

kvm_vfio_group_set_kvm(vfio_group, dev->kvm);

kvm_vfio_update_coherency(dev);

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

mutex_unlock(&kv->lock);

kvm_vfio_group_set_kvm(vfio_group, NULL);

kvm_vfio_group_put_external_user(vfio_group);

kvm_vfio_update_coherency(dev);
Expand Down Expand Up @@ -240,6 +257,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_set_kvm(kvg->vfio_group, NULL);
kvm_vfio_group_put_external_user(kvg->vfio_group);
list_del(&kvg->node);
kfree(kvg);
Expand Down

0 comments on commit 2fc1bec

Please sign in to comment.