On Tue, 15 Nov 2016 19:35:45 +0800 Jike Song <jike.song@xxxxxxxxx> wrote: > A vfio_group may be or may not be attached to a KVM instance, > if it is, the user of vfio_group might also want to know which > KVM instance it is attached to, and when it will detach. In VFIO > there are already external APIs for KVM to get/put vfio_group, > by providing a similar vfio_group_notify, KVM can notify the > vfio_group about attaching events. > > Cc: Xiao Guangrong <guangrong.xiao@xxxxxxxxxxxxxxx> > Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> > Cc: Alex Williamson <alex.williamson@xxxxxxxxxx> > Signed-off-by: Jike Song <jike.song@xxxxxxxxx> > --- > 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 0afb58e..b149ced 100644 > --- a/drivers/vfio/vfio.c > +++ b/drivers/vfio/vfio.c > @@ -86,6 +86,8 @@ struct vfio_group { > struct mutex unbound_lock; > atomic_t opened; > bool noiommu; > + struct kvm *kvm; > + struct blocking_notifier_head notifier; > }; > > struct vfio_device { > @@ -1015,6 +1017,34 @@ static long vfio_ioctl_check_extension(struct vfio_container *container, > return ret; > } > > +void vfio_group_notify(struct vfio_group *group, struct kvm *kvm) > +{ > + group->kvm = kvm; > + blocking_notifier_call_chain(&group->notifier, > + VFIO_GROUP_NOTIFY_SET_KVM, kvm); > +} > +EXPORT_SYMBOL_GPL(vfio_group_notify); This shouldn't be called vfio_group_notify() if it's specific to kvm. vfio_group_set_kvm() perhaps. > + > +static void vfio_group_register_notifier(struct vfio_group *group, > + struct notifier_block *nb) > +{ > + blocking_notifier_chain_register(&group->notifier, nb); > + > + /* > + * The attaching of kvm and vfio_group might already happen, so > + * here we replay once on registration. > + */ > + if (group->kvm) > + blocking_notifier_call_chain(&group->notifier, > + VFIO_GROUP_NOTIFY_SET_KVM, group->kvm); > +} > + > +static void vfio_group_unregister_notifier(struct vfio_group *group, > + struct notifier_block *nb) > +{ > + blocking_notifier_chain_unregister(&group->notifier, nb); > +} > + > /* hold write lock on container->group_lock */ > static int __vfio_container_attach_groups(struct vfio_container *container, > struct vfio_iommu_driver *driver, > diff --git a/include/linux/vfio.h b/include/linux/vfio.h > index d4ce14d..ec9f74f 100644 > --- a/include/linux/vfio.h > +++ b/include/linux/vfio.h > @@ -100,6 +100,9 @@ extern void vfio_unregister_iommu_driver( > extern long vfio_external_check_extension(struct vfio_group *group, > unsigned long arg); > > +struct kvm; > +extern void vfio_group_notify(struct vfio_group *group, struct kvm *kvm); > + > /* > * Sub-module helpers > */ > @@ -149,6 +152,7 @@ extern int vfio_unpin_pages(struct device *dev, unsigned long *user_pfn, > int npage); > > #define VFIO_IOMMU_NOTIFY_DMA_UNMAP 1 > +#define VFIO_GROUP_NOTIFY_SET_KVM 2 > > extern int vfio_register_notifier(struct device *dev, > struct notifier_block *nb); -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html