diff mbox

[v4,1/3] vfio: add vfio_group_notify support

Message ID 1479209747-5564-2-git-send-email-jike.song@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jike Song Nov. 15, 2016, 11:35 a.m. UTC
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(+)

Comments

Alex Williamson Nov. 15, 2016, 11:11 p.m. UTC | #1
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
Jike Song Nov. 16, 2016, 3:02 a.m. UTC | #2
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 mbox

Patch

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);