Message ID | 1479209747-5564-2-git-send-email-jike.song@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, 15 Nov 2016 19:35:45 +0800 Jike Song <jike.song@intel.com> 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@linux.intel.com> > Cc: Paolo Bonzini <pbonzini@redhat.com> > Cc: Alex Williamson <alex.williamson@redhat.com> > Signed-off-by: Jike Song <jike.song@intel.com> > --- > 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 11/16/2016 07:11 AM, Alex Williamson wrote: > On Tue, 15 Nov 2016 19:35:45 +0800 > Jike Song <jike.song@intel.com> 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@linux.intel.com> >> Cc: Paolo Bonzini <pbonzini@redhat.com> >> Cc: Alex Williamson <alex.williamson@redhat.com> >> Signed-off-by: Jike Song <jike.song@intel.com> >> --- >> 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. > will change to that. thanks! -- Thanks, Jike -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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); + +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);
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@linux.intel.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Jike Song <jike.song@intel.com> --- drivers/vfio/vfio.c | 30 ++++++++++++++++++++++++++++++ include/linux/vfio.h | 4 ++++ 2 files changed, 34 insertions(+)