All of lore.kernel.org
 help / color / mirror / Atom feed
From: Auger Eric <eric.auger@redhat.com>
To: Alex Williamson <alex.williamson@redhat.com>
Cc: yehuday@marvell.com, drjones@redhat.com, jason@lakedaemon.net,
	kvm@vger.kernel.org, marc.zyngier@arm.com, p.fedin@samsung.com,
	joro@8bytes.org, will.deacon@arm.com,
	linux-kernel@vger.kernel.org, Bharat.Bhushan@freescale.com,
	Jean-Philippe.Brucker@arm.com, iommu@lists.linux-foundation.org,
	pranav.sawargaonkar@gmail.com,
	linux-arm-kernel@lists.infradead.org, tglx@linutronix.de,
	robin.murphy@arm.com, Manish.Jaggi@caviumnetworks.com,
	christoffer.dall@linaro.org, eric.auger.pro@gmail.com
Subject: Re: [PATCH v13 15/15] vfio/type1: Return the MSI geometry through VFIO_IOMMU_GET_INFO capability chains
Date: Fri, 7 Oct 2016 19:10:27 +0200	[thread overview]
Message-ID: <4adea280-4bdf-7d0e-be2f-88e7f6219b9c@redhat.com> (raw)
In-Reply-To: <20161006144251.46b45117@t450s.home>

Hi Alex,

On 06/10/2016 22:42, Alex Williamson wrote:
> On Thu, 6 Oct 2016 14:20:40 -0600
> Alex Williamson <alex.williamson@redhat.com> wrote:
> 
>> On Thu,  6 Oct 2016 08:45:31 +0000
>> Eric Auger <eric.auger@redhat.com> wrote:
>>
>>> This patch allows the user-space to retrieve the MSI geometry. The
>>> implementation is based on capability chains, now also added to
>>> VFIO_IOMMU_GET_INFO.
>>>
>>> The returned info comprise:
>>> - whether the MSI IOVA are constrained to a reserved range (x86 case) and
>>>   in the positive, the start/end of the aperture,
>>> - or whether the IOVA aperture need to be set by the userspace. In that
>>>   case, the size and alignment of the IOVA window to be provided are
>>>   returned.
>>>
>>> In case the userspace must provide the IOVA aperture, we currently report
>>> a size/alignment based on all the doorbells registered by the host kernel.
>>> This may exceed the actual needs.
>>>
>>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>>>
>>> ---
>>> v11 -> v11:
>>> - msi_doorbell_pages was renamed msi_doorbell_calc_pages
>>>
>>> v9 -> v10:
>>> - move cap_offset after iova_pgsizes
>>> - replace __u64 alignment by __u32 order
>>> - introduce __u32 flags in vfio_iommu_type1_info_cap_msi_geometry and
>>>   fix alignment
>>> - call msi-doorbell API to compute the size/alignment
>>>
>>> v8 -> v9:
>>> - use iommu_msi_supported flag instead of programmable
>>> - replace IOMMU_INFO_REQUIRE_MSI_MAP flag by a more sophisticated
>>>   capability chain, reporting the MSI geometry
>>>
>>> v7 -> v8:
>>> - use iommu_domain_msi_geometry
>>>
>>> v6 -> v7:
>>> - remove the computation of the number of IOVA pages to be provisionned.
>>>   This number depends on the domain/group/device topology which can
>>>   dynamically change. Let's rely instead rely on an arbitrary max depending
>>>   on the system
>>>
>>> v4 -> v5:
>>> - move msi_info and ret declaration within the conditional code
>>>
>>> v3 -> v4:
>>> - replace former vfio_domains_require_msi_mapping by
>>>   more complex computation of MSI mapping requirements, especially the
>>>   number of pages to be provided by the user-space.
>>> - reword patch title
>>>
>>> RFC v1 -> v1:
>>> - derived from
>>>   [RFC PATCH 3/6] vfio: Extend iommu-info to return MSIs automap state
>>> - renamed allow_msi_reconfig into require_msi_mapping
>>> - fixed VFIO_IOMMU_GET_INFO
>>> ---
>>>  drivers/vfio/vfio_iommu_type1.c | 78 ++++++++++++++++++++++++++++++++++++++++-
>>>  include/uapi/linux/vfio.h       | 32 ++++++++++++++++-
>>>  2 files changed, 108 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
>>> index dc3ee5d..ce5e7eb 100644
>>> --- a/drivers/vfio/vfio_iommu_type1.c
>>> +++ b/drivers/vfio/vfio_iommu_type1.c
>>> @@ -38,6 +38,8 @@
>>>  #include <linux/workqueue.h>
>>>  #include <linux/dma-iommu.h>
>>>  #include <linux/msi-doorbell.h>
>>> +#include <linux/irqdomain.h>
>>> +#include <linux/msi.h>
>>>  
>>>  #define DRIVER_VERSION  "0.2"
>>>  #define DRIVER_AUTHOR   "Alex Williamson <alex.williamson@redhat.com>"
>>> @@ -1101,6 +1103,55 @@ static int vfio_domains_have_iommu_cache(struct vfio_iommu *iommu)
>>>  	return ret;
>>>  }
>>>  
>>> +static int compute_msi_geometry_caps(struct vfio_iommu *iommu,
>>> +				     struct vfio_info_cap *caps)
>>> +{
>>> +	struct vfio_iommu_type1_info_cap_msi_geometry *vfio_msi_geometry;
>>> +	unsigned long order = __ffs(vfio_pgsize_bitmap(iommu));
>>> +	struct iommu_domain_msi_geometry msi_geometry;
>>> +	struct vfio_info_cap_header *header;
>>> +	struct vfio_domain *d;
>>> +	bool reserved;
>>> +	size_t size;
>>> +
>>> +	mutex_lock(&iommu->lock);
>>> +	/* All domains have same require_msi_map property, pick first */
>>> +	d = list_first_entry(&iommu->domain_list, struct vfio_domain, next);
>>> +	iommu_domain_get_attr(d->domain, DOMAIN_ATTR_MSI_GEOMETRY,
>>> +			      &msi_geometry);
>>> +	reserved = !msi_geometry.iommu_msi_supported;
>>> +
>>> +	mutex_unlock(&iommu->lock);
>>> +
>>> +	size = sizeof(*vfio_msi_geometry);
>>> +	header = vfio_info_cap_add(caps, size,
>>> +				   VFIO_IOMMU_TYPE1_INFO_CAP_MSI_GEOMETRY, 1);
>>> +
>>> +	if (IS_ERR(header))
>>> +		return PTR_ERR(header);
>>> +
>>> +	vfio_msi_geometry = container_of(header,
>>> +				struct vfio_iommu_type1_info_cap_msi_geometry,
>>> +				header);
>>> +
>>> +	vfio_msi_geometry->flags = reserved;  
>>
>> Use the bit flag VFIO_IOMMU_MSI_GEOMETRY_RESERVED
>>
>>> +	if (reserved) {
>>> +		vfio_msi_geometry->aperture_start = msi_geometry.aperture_start;
>>> +		vfio_msi_geometry->aperture_end = msi_geometry.aperture_end;  
>>
>> But maybe nobody has set these, did you intend to use
>> iommu_domain_msi_aperture_valid(), which you defined early on but never
>> used?
>>
>>> +		return 0;
>>> +	}
>>> +
>>> +	vfio_msi_geometry->order = order;  
>>
>> I'm tempted to suggest that a user could do the same math on their own
>> since we provide the supported bitmap already... could it ever not be
>> the same? 
>>
>>> +	/*
>>> +	 * we compute a system-wide requirement based on all the registered
>>> +	 * doorbells
>>> +	 */
>>> +	vfio_msi_geometry->size =
>>> +		msi_doorbell_calc_pages(order) * ((uint64_t) 1 << order);
>>> +
>>> +	return 0;
>>> +}
>>> +
>>>  static long vfio_iommu_type1_ioctl(void *iommu_data,
>>>  				   unsigned int cmd, unsigned long arg)
>>>  {
>>> @@ -1122,8 +1173,10 @@ static long vfio_iommu_type1_ioctl(void *iommu_data,
>>>  		}
>>>  	} else if (cmd == VFIO_IOMMU_GET_INFO) {
>>>  		struct vfio_iommu_type1_info info;
>>> +		struct vfio_info_cap caps = { .buf = NULL, .size = 0 };
>>> +		int ret;
>>>  
>>> -		minsz = offsetofend(struct vfio_iommu_type1_info, iova_pgsizes);
>>> +		minsz = offsetofend(struct vfio_iommu_type1_info, cap_offset);
>>>  
>>>  		if (copy_from_user(&info, (void __user *)arg, minsz))
>>>  			return -EFAULT;
>>> @@ -1135,6 +1188,29 @@ static long vfio_iommu_type1_ioctl(void *iommu_data,
>>>  
>>>  		info.iova_pgsizes = vfio_pgsize_bitmap(iommu);
>>>  
>>> +		ret = compute_msi_geometry_caps(iommu, &caps);
>>> +		if (ret)
>>> +			return ret;
>>> +
>>> +		if (caps.size) {
>>> +			info.flags |= VFIO_IOMMU_INFO_CAPS;
>>> +			if (info.argsz < sizeof(info) + caps.size) {
>>> +				info.argsz = sizeof(info) + caps.size;
>>> +				info.cap_offset = 0;
>>> +			} else {
>>> +				vfio_info_cap_shift(&caps, sizeof(info));
>>> +				if (copy_to_user((void __user *)arg +
>>> +						sizeof(info), caps.buf,
>>> +						caps.size)) {
>>> +					kfree(caps.buf);
>>> +					return -EFAULT;
>>> +				}
>>> +				info.cap_offset = sizeof(info);
>>> +			}
>>> +
>>> +			kfree(caps.buf);
>>> +		}
>>> +
>>>  		return copy_to_user((void __user *)arg, &info, minsz) ?
>>>  			-EFAULT : 0;
>>>  
>>> diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h
>>> index 4a9dbc2..8dae013 100644
>>> --- a/include/uapi/linux/vfio.h
>>> +++ b/include/uapi/linux/vfio.h
>>> @@ -488,7 +488,35 @@ struct vfio_iommu_type1_info {
>>>  	__u32	argsz;
>>>  	__u32	flags;
>>>  #define VFIO_IOMMU_INFO_PGSIZES (1 << 0)	/* supported page sizes info */
>>> -	__u64	iova_pgsizes;		/* Bitmap of supported page sizes */
>>> +#define VFIO_IOMMU_INFO_CAPS	(1 << 1)	/* Info supports caps */
>>> +	__u64	iova_pgsizes;	/* Bitmap of supported page sizes */
>>> +	__u32	__resv;
>>> +	__u32   cap_offset;	/* Offset within info struct of first cap */
>>> +};  
>>
>> I understand the padding, but not the ordering.  Why not end with
>> padding?
>>
>>> +
>>> +#define VFIO_IOMMU_TYPE1_INFO_CAP_MSI_GEOMETRY	1
>>> +
>>> +/*
>>> + * The MSI geometry capability allows to report the MSI IOVA geometry:
>>> + * - either the MSI IOVAs are constrained within a reserved IOVA aperture
>>> + *   whose boundaries are given by [@aperture_start, @aperture_end].
>>> + *   this is typically the case on x86 host. The userspace is not allowed
>>> + *   to map userspace memory at IOVAs intersecting this range using
>>> + *   VFIO_IOMMU_MAP_DMA.
>>> + * - or the MSI IOVAs are not requested to belong to any reserved range;
>>> + *   in that case the userspace must provide an IOVA window characterized by
>>> + *   @size and @alignment using VFIO_IOMMU_MAP_DMA with RESERVED_MSI_IOVA flag.
>>> + */
>>> +struct vfio_iommu_type1_info_cap_msi_geometry {
>>> +	struct vfio_info_cap_header header;
>>> +	__u32 flags;
>>> +#define VFIO_IOMMU_MSI_GEOMETRY_RESERVED (1 << 0) /* reserved geometry */
>>> +	/* not reserved */
>>> +	__u32 order; /* iommu page order used for aperture alignment*/
>>> +	__u64 size; /* IOVA aperture size (bytes) the userspace must provide */
>>> +	/* reserved */
>>> +	__u64 aperture_start;
>>> +	__u64 aperture_end;  
>>
>> Should these be a union?  We never set them both.  Should the !reserved
>> case have a flag as well, so the user can positively identify what's
>> being provided?
> 
> Actually, is there really any need to fit both of these within the same
> structure?  Part of the idea of the capability chains is we can create
> a capability for each new thing we want to describe.  So, we could
> simply define a generic reserved IOVA range capability with a 'start'
> and 'end' and then another capability to define MSI mapping
> requirements.  Thanks,
Yes your suggested approach makes sense to me.

One reason why I proceeded that way is we are mixing things at iommu.h
level too. Personally I would have preferred to separate things:
1) add a new IOMMU_CAP_TRANSLATE_MSI capability in iommu_cap
2) rename iommu_msi_supported into "programmable" bool: reporting
whether the aperture is reserved or programmable.

In the early releases I think it was as above but slightly we moved to a
mixed description.

What do you think?

Thank you for the whole review!

Eric

> 
> Alex
>  
>>>  };
>>>  
>>>  #define VFIO_IOMMU_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12)
>>> @@ -503,6 +531,8 @@ struct vfio_iommu_type1_info {
>>>   * IOVA region that will be used on some platforms to map the host MSI frames.
>>>   * In that specific case, vaddr is ignored. Once registered, an MSI reserved
>>>   * IOVA region stays until the container is closed.
>>> + * The requirement for provisioning such reserved IOVA range can be checked by
>>> + * checking the VFIO_IOMMU_TYPE1_INFO_CAP_MSI_GEOMETRY capability.
>>>   */
>>>  struct vfio_iommu_type1_dma_map {
>>>  	__u32	argsz;  
>>
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 

WARNING: multiple messages have this Message-ID (diff)
From: Auger Eric <eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: Alex Williamson
	<alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: yehuday-eYqpPyKDWXRBDgjK7y7TUQ@public.gmane.org,
	jason-NLaQJdtUoK4Be96aLqz0jA@public.gmane.org,
	kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	marc.zyngier-5wv7dgnIgG8@public.gmane.org,
	will.deacon-5wv7dgnIgG8@public.gmane.org,
	p.fedin-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
	drjones-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
	pranav.sawargaonkar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	christoffer.dall-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
	tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org,
	Manish.Jaggi-M3mlKVOIwJVv6pq1l3V1OdBPR1lH4CV8@public.gmane.org,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	eric.auger.pro-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Subject: Re: [PATCH v13 15/15] vfio/type1: Return the MSI geometry through VFIO_IOMMU_GET_INFO capability chains
Date: Fri, 7 Oct 2016 19:10:27 +0200	[thread overview]
Message-ID: <4adea280-4bdf-7d0e-be2f-88e7f6219b9c@redhat.com> (raw)
In-Reply-To: <20161006144251.46b45117-1yVPhWWZRC1BDLzU/O5InQ@public.gmane.org>

Hi Alex,

On 06/10/2016 22:42, Alex Williamson wrote:
> On Thu, 6 Oct 2016 14:20:40 -0600
> Alex Williamson <alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote:
> 
>> On Thu,  6 Oct 2016 08:45:31 +0000
>> Eric Auger <eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote:
>>
>>> This patch allows the user-space to retrieve the MSI geometry. The
>>> implementation is based on capability chains, now also added to
>>> VFIO_IOMMU_GET_INFO.
>>>
>>> The returned info comprise:
>>> - whether the MSI IOVA are constrained to a reserved range (x86 case) and
>>>   in the positive, the start/end of the aperture,
>>> - or whether the IOVA aperture need to be set by the userspace. In that
>>>   case, the size and alignment of the IOVA window to be provided are
>>>   returned.
>>>
>>> In case the userspace must provide the IOVA aperture, we currently report
>>> a size/alignment based on all the doorbells registered by the host kernel.
>>> This may exceed the actual needs.
>>>
>>> Signed-off-by: Eric Auger <eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
>>>
>>> ---
>>> v11 -> v11:
>>> - msi_doorbell_pages was renamed msi_doorbell_calc_pages
>>>
>>> v9 -> v10:
>>> - move cap_offset after iova_pgsizes
>>> - replace __u64 alignment by __u32 order
>>> - introduce __u32 flags in vfio_iommu_type1_info_cap_msi_geometry and
>>>   fix alignment
>>> - call msi-doorbell API to compute the size/alignment
>>>
>>> v8 -> v9:
>>> - use iommu_msi_supported flag instead of programmable
>>> - replace IOMMU_INFO_REQUIRE_MSI_MAP flag by a more sophisticated
>>>   capability chain, reporting the MSI geometry
>>>
>>> v7 -> v8:
>>> - use iommu_domain_msi_geometry
>>>
>>> v6 -> v7:
>>> - remove the computation of the number of IOVA pages to be provisionned.
>>>   This number depends on the domain/group/device topology which can
>>>   dynamically change. Let's rely instead rely on an arbitrary max depending
>>>   on the system
>>>
>>> v4 -> v5:
>>> - move msi_info and ret declaration within the conditional code
>>>
>>> v3 -> v4:
>>> - replace former vfio_domains_require_msi_mapping by
>>>   more complex computation of MSI mapping requirements, especially the
>>>   number of pages to be provided by the user-space.
>>> - reword patch title
>>>
>>> RFC v1 -> v1:
>>> - derived from
>>>   [RFC PATCH 3/6] vfio: Extend iommu-info to return MSIs automap state
>>> - renamed allow_msi_reconfig into require_msi_mapping
>>> - fixed VFIO_IOMMU_GET_INFO
>>> ---
>>>  drivers/vfio/vfio_iommu_type1.c | 78 ++++++++++++++++++++++++++++++++++++++++-
>>>  include/uapi/linux/vfio.h       | 32 ++++++++++++++++-
>>>  2 files changed, 108 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
>>> index dc3ee5d..ce5e7eb 100644
>>> --- a/drivers/vfio/vfio_iommu_type1.c
>>> +++ b/drivers/vfio/vfio_iommu_type1.c
>>> @@ -38,6 +38,8 @@
>>>  #include <linux/workqueue.h>
>>>  #include <linux/dma-iommu.h>
>>>  #include <linux/msi-doorbell.h>
>>> +#include <linux/irqdomain.h>
>>> +#include <linux/msi.h>
>>>  
>>>  #define DRIVER_VERSION  "0.2"
>>>  #define DRIVER_AUTHOR   "Alex Williamson <alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>"
>>> @@ -1101,6 +1103,55 @@ static int vfio_domains_have_iommu_cache(struct vfio_iommu *iommu)
>>>  	return ret;
>>>  }
>>>  
>>> +static int compute_msi_geometry_caps(struct vfio_iommu *iommu,
>>> +				     struct vfio_info_cap *caps)
>>> +{
>>> +	struct vfio_iommu_type1_info_cap_msi_geometry *vfio_msi_geometry;
>>> +	unsigned long order = __ffs(vfio_pgsize_bitmap(iommu));
>>> +	struct iommu_domain_msi_geometry msi_geometry;
>>> +	struct vfio_info_cap_header *header;
>>> +	struct vfio_domain *d;
>>> +	bool reserved;
>>> +	size_t size;
>>> +
>>> +	mutex_lock(&iommu->lock);
>>> +	/* All domains have same require_msi_map property, pick first */
>>> +	d = list_first_entry(&iommu->domain_list, struct vfio_domain, next);
>>> +	iommu_domain_get_attr(d->domain, DOMAIN_ATTR_MSI_GEOMETRY,
>>> +			      &msi_geometry);
>>> +	reserved = !msi_geometry.iommu_msi_supported;
>>> +
>>> +	mutex_unlock(&iommu->lock);
>>> +
>>> +	size = sizeof(*vfio_msi_geometry);
>>> +	header = vfio_info_cap_add(caps, size,
>>> +				   VFIO_IOMMU_TYPE1_INFO_CAP_MSI_GEOMETRY, 1);
>>> +
>>> +	if (IS_ERR(header))
>>> +		return PTR_ERR(header);
>>> +
>>> +	vfio_msi_geometry = container_of(header,
>>> +				struct vfio_iommu_type1_info_cap_msi_geometry,
>>> +				header);
>>> +
>>> +	vfio_msi_geometry->flags = reserved;  
>>
>> Use the bit flag VFIO_IOMMU_MSI_GEOMETRY_RESERVED
>>
>>> +	if (reserved) {
>>> +		vfio_msi_geometry->aperture_start = msi_geometry.aperture_start;
>>> +		vfio_msi_geometry->aperture_end = msi_geometry.aperture_end;  
>>
>> But maybe nobody has set these, did you intend to use
>> iommu_domain_msi_aperture_valid(), which you defined early on but never
>> used?
>>
>>> +		return 0;
>>> +	}
>>> +
>>> +	vfio_msi_geometry->order = order;  
>>
>> I'm tempted to suggest that a user could do the same math on their own
>> since we provide the supported bitmap already... could it ever not be
>> the same? 
>>
>>> +	/*
>>> +	 * we compute a system-wide requirement based on all the registered
>>> +	 * doorbells
>>> +	 */
>>> +	vfio_msi_geometry->size =
>>> +		msi_doorbell_calc_pages(order) * ((uint64_t) 1 << order);
>>> +
>>> +	return 0;
>>> +}
>>> +
>>>  static long vfio_iommu_type1_ioctl(void *iommu_data,
>>>  				   unsigned int cmd, unsigned long arg)
>>>  {
>>> @@ -1122,8 +1173,10 @@ static long vfio_iommu_type1_ioctl(void *iommu_data,
>>>  		}
>>>  	} else if (cmd == VFIO_IOMMU_GET_INFO) {
>>>  		struct vfio_iommu_type1_info info;
>>> +		struct vfio_info_cap caps = { .buf = NULL, .size = 0 };
>>> +		int ret;
>>>  
>>> -		minsz = offsetofend(struct vfio_iommu_type1_info, iova_pgsizes);
>>> +		minsz = offsetofend(struct vfio_iommu_type1_info, cap_offset);
>>>  
>>>  		if (copy_from_user(&info, (void __user *)arg, minsz))
>>>  			return -EFAULT;
>>> @@ -1135,6 +1188,29 @@ static long vfio_iommu_type1_ioctl(void *iommu_data,
>>>  
>>>  		info.iova_pgsizes = vfio_pgsize_bitmap(iommu);
>>>  
>>> +		ret = compute_msi_geometry_caps(iommu, &caps);
>>> +		if (ret)
>>> +			return ret;
>>> +
>>> +		if (caps.size) {
>>> +			info.flags |= VFIO_IOMMU_INFO_CAPS;
>>> +			if (info.argsz < sizeof(info) + caps.size) {
>>> +				info.argsz = sizeof(info) + caps.size;
>>> +				info.cap_offset = 0;
>>> +			} else {
>>> +				vfio_info_cap_shift(&caps, sizeof(info));
>>> +				if (copy_to_user((void __user *)arg +
>>> +						sizeof(info), caps.buf,
>>> +						caps.size)) {
>>> +					kfree(caps.buf);
>>> +					return -EFAULT;
>>> +				}
>>> +				info.cap_offset = sizeof(info);
>>> +			}
>>> +
>>> +			kfree(caps.buf);
>>> +		}
>>> +
>>>  		return copy_to_user((void __user *)arg, &info, minsz) ?
>>>  			-EFAULT : 0;
>>>  
>>> diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h
>>> index 4a9dbc2..8dae013 100644
>>> --- a/include/uapi/linux/vfio.h
>>> +++ b/include/uapi/linux/vfio.h
>>> @@ -488,7 +488,35 @@ struct vfio_iommu_type1_info {
>>>  	__u32	argsz;
>>>  	__u32	flags;
>>>  #define VFIO_IOMMU_INFO_PGSIZES (1 << 0)	/* supported page sizes info */
>>> -	__u64	iova_pgsizes;		/* Bitmap of supported page sizes */
>>> +#define VFIO_IOMMU_INFO_CAPS	(1 << 1)	/* Info supports caps */
>>> +	__u64	iova_pgsizes;	/* Bitmap of supported page sizes */
>>> +	__u32	__resv;
>>> +	__u32   cap_offset;	/* Offset within info struct of first cap */
>>> +};  
>>
>> I understand the padding, but not the ordering.  Why not end with
>> padding?
>>
>>> +
>>> +#define VFIO_IOMMU_TYPE1_INFO_CAP_MSI_GEOMETRY	1
>>> +
>>> +/*
>>> + * The MSI geometry capability allows to report the MSI IOVA geometry:
>>> + * - either the MSI IOVAs are constrained within a reserved IOVA aperture
>>> + *   whose boundaries are given by [@aperture_start, @aperture_end].
>>> + *   this is typically the case on x86 host. The userspace is not allowed
>>> + *   to map userspace memory at IOVAs intersecting this range using
>>> + *   VFIO_IOMMU_MAP_DMA.
>>> + * - or the MSI IOVAs are not requested to belong to any reserved range;
>>> + *   in that case the userspace must provide an IOVA window characterized by
>>> + *   @size and @alignment using VFIO_IOMMU_MAP_DMA with RESERVED_MSI_IOVA flag.
>>> + */
>>> +struct vfio_iommu_type1_info_cap_msi_geometry {
>>> +	struct vfio_info_cap_header header;
>>> +	__u32 flags;
>>> +#define VFIO_IOMMU_MSI_GEOMETRY_RESERVED (1 << 0) /* reserved geometry */
>>> +	/* not reserved */
>>> +	__u32 order; /* iommu page order used for aperture alignment*/
>>> +	__u64 size; /* IOVA aperture size (bytes) the userspace must provide */
>>> +	/* reserved */
>>> +	__u64 aperture_start;
>>> +	__u64 aperture_end;  
>>
>> Should these be a union?  We never set them both.  Should the !reserved
>> case have a flag as well, so the user can positively identify what's
>> being provided?
> 
> Actually, is there really any need to fit both of these within the same
> structure?  Part of the idea of the capability chains is we can create
> a capability for each new thing we want to describe.  So, we could
> simply define a generic reserved IOVA range capability with a 'start'
> and 'end' and then another capability to define MSI mapping
> requirements.  Thanks,
Yes your suggested approach makes sense to me.

One reason why I proceeded that way is we are mixing things at iommu.h
level too. Personally I would have preferred to separate things:
1) add a new IOMMU_CAP_TRANSLATE_MSI capability in iommu_cap
2) rename iommu_msi_supported into "programmable" bool: reporting
whether the aperture is reserved or programmable.

In the early releases I think it was as above but slightly we moved to a
mixed description.

What do you think?

Thank you for the whole review!

Eric

> 
> Alex
>  
>>>  };
>>>  
>>>  #define VFIO_IOMMU_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12)
>>> @@ -503,6 +531,8 @@ struct vfio_iommu_type1_info {
>>>   * IOVA region that will be used on some platforms to map the host MSI frames.
>>>   * In that specific case, vaddr is ignored. Once registered, an MSI reserved
>>>   * IOVA region stays until the container is closed.
>>> + * The requirement for provisioning such reserved IOVA range can be checked by
>>> + * checking the VFIO_IOMMU_TYPE1_INFO_CAP_MSI_GEOMETRY capability.
>>>   */
>>>  struct vfio_iommu_type1_dma_map {
>>>  	__u32	argsz;  
>>
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 

WARNING: multiple messages have this Message-ID (diff)
From: eric.auger@redhat.com (Auger Eric)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v13 15/15] vfio/type1: Return the MSI geometry through VFIO_IOMMU_GET_INFO capability chains
Date: Fri, 7 Oct 2016 19:10:27 +0200	[thread overview]
Message-ID: <4adea280-4bdf-7d0e-be2f-88e7f6219b9c@redhat.com> (raw)
In-Reply-To: <20161006144251.46b45117@t450s.home>

Hi Alex,

On 06/10/2016 22:42, Alex Williamson wrote:
> On Thu, 6 Oct 2016 14:20:40 -0600
> Alex Williamson <alex.williamson@redhat.com> wrote:
> 
>> On Thu,  6 Oct 2016 08:45:31 +0000
>> Eric Auger <eric.auger@redhat.com> wrote:
>>
>>> This patch allows the user-space to retrieve the MSI geometry. The
>>> implementation is based on capability chains, now also added to
>>> VFIO_IOMMU_GET_INFO.
>>>
>>> The returned info comprise:
>>> - whether the MSI IOVA are constrained to a reserved range (x86 case) and
>>>   in the positive, the start/end of the aperture,
>>> - or whether the IOVA aperture need to be set by the userspace. In that
>>>   case, the size and alignment of the IOVA window to be provided are
>>>   returned.
>>>
>>> In case the userspace must provide the IOVA aperture, we currently report
>>> a size/alignment based on all the doorbells registered by the host kernel.
>>> This may exceed the actual needs.
>>>
>>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>>>
>>> ---
>>> v11 -> v11:
>>> - msi_doorbell_pages was renamed msi_doorbell_calc_pages
>>>
>>> v9 -> v10:
>>> - move cap_offset after iova_pgsizes
>>> - replace __u64 alignment by __u32 order
>>> - introduce __u32 flags in vfio_iommu_type1_info_cap_msi_geometry and
>>>   fix alignment
>>> - call msi-doorbell API to compute the size/alignment
>>>
>>> v8 -> v9:
>>> - use iommu_msi_supported flag instead of programmable
>>> - replace IOMMU_INFO_REQUIRE_MSI_MAP flag by a more sophisticated
>>>   capability chain, reporting the MSI geometry
>>>
>>> v7 -> v8:
>>> - use iommu_domain_msi_geometry
>>>
>>> v6 -> v7:
>>> - remove the computation of the number of IOVA pages to be provisionned.
>>>   This number depends on the domain/group/device topology which can
>>>   dynamically change. Let's rely instead rely on an arbitrary max depending
>>>   on the system
>>>
>>> v4 -> v5:
>>> - move msi_info and ret declaration within the conditional code
>>>
>>> v3 -> v4:
>>> - replace former vfio_domains_require_msi_mapping by
>>>   more complex computation of MSI mapping requirements, especially the
>>>   number of pages to be provided by the user-space.
>>> - reword patch title
>>>
>>> RFC v1 -> v1:
>>> - derived from
>>>   [RFC PATCH 3/6] vfio: Extend iommu-info to return MSIs automap state
>>> - renamed allow_msi_reconfig into require_msi_mapping
>>> - fixed VFIO_IOMMU_GET_INFO
>>> ---
>>>  drivers/vfio/vfio_iommu_type1.c | 78 ++++++++++++++++++++++++++++++++++++++++-
>>>  include/uapi/linux/vfio.h       | 32 ++++++++++++++++-
>>>  2 files changed, 108 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
>>> index dc3ee5d..ce5e7eb 100644
>>> --- a/drivers/vfio/vfio_iommu_type1.c
>>> +++ b/drivers/vfio/vfio_iommu_type1.c
>>> @@ -38,6 +38,8 @@
>>>  #include <linux/workqueue.h>
>>>  #include <linux/dma-iommu.h>
>>>  #include <linux/msi-doorbell.h>
>>> +#include <linux/irqdomain.h>
>>> +#include <linux/msi.h>
>>>  
>>>  #define DRIVER_VERSION  "0.2"
>>>  #define DRIVER_AUTHOR   "Alex Williamson <alex.williamson@redhat.com>"
>>> @@ -1101,6 +1103,55 @@ static int vfio_domains_have_iommu_cache(struct vfio_iommu *iommu)
>>>  	return ret;
>>>  }
>>>  
>>> +static int compute_msi_geometry_caps(struct vfio_iommu *iommu,
>>> +				     struct vfio_info_cap *caps)
>>> +{
>>> +	struct vfio_iommu_type1_info_cap_msi_geometry *vfio_msi_geometry;
>>> +	unsigned long order = __ffs(vfio_pgsize_bitmap(iommu));
>>> +	struct iommu_domain_msi_geometry msi_geometry;
>>> +	struct vfio_info_cap_header *header;
>>> +	struct vfio_domain *d;
>>> +	bool reserved;
>>> +	size_t size;
>>> +
>>> +	mutex_lock(&iommu->lock);
>>> +	/* All domains have same require_msi_map property, pick first */
>>> +	d = list_first_entry(&iommu->domain_list, struct vfio_domain, next);
>>> +	iommu_domain_get_attr(d->domain, DOMAIN_ATTR_MSI_GEOMETRY,
>>> +			      &msi_geometry);
>>> +	reserved = !msi_geometry.iommu_msi_supported;
>>> +
>>> +	mutex_unlock(&iommu->lock);
>>> +
>>> +	size = sizeof(*vfio_msi_geometry);
>>> +	header = vfio_info_cap_add(caps, size,
>>> +				   VFIO_IOMMU_TYPE1_INFO_CAP_MSI_GEOMETRY, 1);
>>> +
>>> +	if (IS_ERR(header))
>>> +		return PTR_ERR(header);
>>> +
>>> +	vfio_msi_geometry = container_of(header,
>>> +				struct vfio_iommu_type1_info_cap_msi_geometry,
>>> +				header);
>>> +
>>> +	vfio_msi_geometry->flags = reserved;  
>>
>> Use the bit flag VFIO_IOMMU_MSI_GEOMETRY_RESERVED
>>
>>> +	if (reserved) {
>>> +		vfio_msi_geometry->aperture_start = msi_geometry.aperture_start;
>>> +		vfio_msi_geometry->aperture_end = msi_geometry.aperture_end;  
>>
>> But maybe nobody has set these, did you intend to use
>> iommu_domain_msi_aperture_valid(), which you defined early on but never
>> used?
>>
>>> +		return 0;
>>> +	}
>>> +
>>> +	vfio_msi_geometry->order = order;  
>>
>> I'm tempted to suggest that a user could do the same math on their own
>> since we provide the supported bitmap already... could it ever not be
>> the same? 
>>
>>> +	/*
>>> +	 * we compute a system-wide requirement based on all the registered
>>> +	 * doorbells
>>> +	 */
>>> +	vfio_msi_geometry->size =
>>> +		msi_doorbell_calc_pages(order) * ((uint64_t) 1 << order);
>>> +
>>> +	return 0;
>>> +}
>>> +
>>>  static long vfio_iommu_type1_ioctl(void *iommu_data,
>>>  				   unsigned int cmd, unsigned long arg)
>>>  {
>>> @@ -1122,8 +1173,10 @@ static long vfio_iommu_type1_ioctl(void *iommu_data,
>>>  		}
>>>  	} else if (cmd == VFIO_IOMMU_GET_INFO) {
>>>  		struct vfio_iommu_type1_info info;
>>> +		struct vfio_info_cap caps = { .buf = NULL, .size = 0 };
>>> +		int ret;
>>>  
>>> -		minsz = offsetofend(struct vfio_iommu_type1_info, iova_pgsizes);
>>> +		minsz = offsetofend(struct vfio_iommu_type1_info, cap_offset);
>>>  
>>>  		if (copy_from_user(&info, (void __user *)arg, minsz))
>>>  			return -EFAULT;
>>> @@ -1135,6 +1188,29 @@ static long vfio_iommu_type1_ioctl(void *iommu_data,
>>>  
>>>  		info.iova_pgsizes = vfio_pgsize_bitmap(iommu);
>>>  
>>> +		ret = compute_msi_geometry_caps(iommu, &caps);
>>> +		if (ret)
>>> +			return ret;
>>> +
>>> +		if (caps.size) {
>>> +			info.flags |= VFIO_IOMMU_INFO_CAPS;
>>> +			if (info.argsz < sizeof(info) + caps.size) {
>>> +				info.argsz = sizeof(info) + caps.size;
>>> +				info.cap_offset = 0;
>>> +			} else {
>>> +				vfio_info_cap_shift(&caps, sizeof(info));
>>> +				if (copy_to_user((void __user *)arg +
>>> +						sizeof(info), caps.buf,
>>> +						caps.size)) {
>>> +					kfree(caps.buf);
>>> +					return -EFAULT;
>>> +				}
>>> +				info.cap_offset = sizeof(info);
>>> +			}
>>> +
>>> +			kfree(caps.buf);
>>> +		}
>>> +
>>>  		return copy_to_user((void __user *)arg, &info, minsz) ?
>>>  			-EFAULT : 0;
>>>  
>>> diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h
>>> index 4a9dbc2..8dae013 100644
>>> --- a/include/uapi/linux/vfio.h
>>> +++ b/include/uapi/linux/vfio.h
>>> @@ -488,7 +488,35 @@ struct vfio_iommu_type1_info {
>>>  	__u32	argsz;
>>>  	__u32	flags;
>>>  #define VFIO_IOMMU_INFO_PGSIZES (1 << 0)	/* supported page sizes info */
>>> -	__u64	iova_pgsizes;		/* Bitmap of supported page sizes */
>>> +#define VFIO_IOMMU_INFO_CAPS	(1 << 1)	/* Info supports caps */
>>> +	__u64	iova_pgsizes;	/* Bitmap of supported page sizes */
>>> +	__u32	__resv;
>>> +	__u32   cap_offset;	/* Offset within info struct of first cap */
>>> +};  
>>
>> I understand the padding, but not the ordering.  Why not end with
>> padding?
>>
>>> +
>>> +#define VFIO_IOMMU_TYPE1_INFO_CAP_MSI_GEOMETRY	1
>>> +
>>> +/*
>>> + * The MSI geometry capability allows to report the MSI IOVA geometry:
>>> + * - either the MSI IOVAs are constrained within a reserved IOVA aperture
>>> + *   whose boundaries are given by [@aperture_start, @aperture_end].
>>> + *   this is typically the case on x86 host. The userspace is not allowed
>>> + *   to map userspace memory at IOVAs intersecting this range using
>>> + *   VFIO_IOMMU_MAP_DMA.
>>> + * - or the MSI IOVAs are not requested to belong to any reserved range;
>>> + *   in that case the userspace must provide an IOVA window characterized by
>>> + *   @size and @alignment using VFIO_IOMMU_MAP_DMA with RESERVED_MSI_IOVA flag.
>>> + */
>>> +struct vfio_iommu_type1_info_cap_msi_geometry {
>>> +	struct vfio_info_cap_header header;
>>> +	__u32 flags;
>>> +#define VFIO_IOMMU_MSI_GEOMETRY_RESERVED (1 << 0) /* reserved geometry */
>>> +	/* not reserved */
>>> +	__u32 order; /* iommu page order used for aperture alignment*/
>>> +	__u64 size; /* IOVA aperture size (bytes) the userspace must provide */
>>> +	/* reserved */
>>> +	__u64 aperture_start;
>>> +	__u64 aperture_end;  
>>
>> Should these be a union?  We never set them both.  Should the !reserved
>> case have a flag as well, so the user can positively identify what's
>> being provided?
> 
> Actually, is there really any need to fit both of these within the same
> structure?  Part of the idea of the capability chains is we can create
> a capability for each new thing we want to describe.  So, we could
> simply define a generic reserved IOVA range capability with a 'start'
> and 'end' and then another capability to define MSI mapping
> requirements.  Thanks,
Yes your suggested approach makes sense to me.

One reason why I proceeded that way is we are mixing things at iommu.h
level too. Personally I would have preferred to separate things:
1) add a new IOMMU_CAP_TRANSLATE_MSI capability in iommu_cap
2) rename iommu_msi_supported into "programmable" bool: reporting
whether the aperture is reserved or programmable.

In the early releases I think it was as above but slightly we moved to a
mixed description.

What do you think?

Thank you for the whole review!

Eric

> 
> Alex
>  
>>>  };
>>>  
>>>  #define VFIO_IOMMU_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12)
>>> @@ -503,6 +531,8 @@ struct vfio_iommu_type1_info {
>>>   * IOVA region that will be used on some platforms to map the host MSI frames.
>>>   * In that specific case, vaddr is ignored. Once registered, an MSI reserved
>>>   * IOVA region stays until the container is closed.
>>> + * The requirement for provisioning such reserved IOVA range can be checked by
>>> + * checking the VFIO_IOMMU_TYPE1_INFO_CAP_MSI_GEOMETRY capability.
>>>   */
>>>  struct vfio_iommu_type1_dma_map {
>>>  	__u32	argsz;  
>>
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 

  reply	other threads:[~2016-10-07 17:10 UTC|newest]

Thread overview: 109+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-06  8:45 [PATCH v13 00/15] KVM PCIe/MSI passthrough on ARM/ARM64 Eric Auger
2016-10-06  8:45 ` Eric Auger
2016-10-06  8:45 ` Eric Auger
2016-10-06  8:45 ` [PATCH v13 01/15] iommu: Introduce DOMAIN_ATTR_MSI_GEOMETRY Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45 ` [PATCH v13 02/15] iommu/arm-smmu: Initialize the msi geometry Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06 20:16   ` Alex Williamson
2016-10-06 20:16     ` Alex Williamson
2016-10-06 20:16     ` Alex Williamson
2016-10-06  8:45 ` [PATCH v13 03/15] iommu/dma: Allow MSI-only cookies Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06 20:17   ` Alex Williamson
2016-10-06 20:17     ` Alex Williamson
2016-10-06 20:17     ` Alex Williamson
2016-10-07 17:14     ` Auger Eric
2016-10-07 17:14       ` Auger Eric
2016-10-07 17:14       ` Auger Eric
2016-10-10 14:26     ` Robin Murphy
2016-10-10 14:26       ` Robin Murphy
2016-10-10 14:26       ` Robin Murphy
2016-10-10 14:47       ` Auger Eric
2016-10-10 14:47         ` Auger Eric
2016-10-10 14:47         ` Auger Eric
2016-10-10 15:52         ` Robin Murphy
2016-10-10 15:52           ` Robin Murphy
2016-10-10 15:52           ` Robin Murphy
2016-10-06  8:45 ` [PATCH v13 04/15] genirq/msi: Introduce the MSI doorbell API Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06 20:17   ` Alex Williamson
2016-10-06 20:17     ` Alex Williamson
2016-10-07 17:13     ` Auger Eric
2016-10-07 17:13       ` Auger Eric
2016-10-07 17:13       ` Auger Eric
2016-10-06  8:45 ` [PATCH v13 05/15] genirq/msi: msi_doorbell_calc_pages Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45 ` [PATCH v13 06/15] irqchip/gic-v2m: Register the MSI doorbell Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45 ` [PATCH v13 07/15] irqchip/gicv3-its: " Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45 ` [PATCH v13 08/15] vfio: Introduce a vfio_dma type field Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06 20:18   ` Alex Williamson
2016-10-06 20:18     ` Alex Williamson
2016-10-06 20:18     ` Alex Williamson
2016-10-06  8:45 ` [PATCH v13 09/15] vfio/type1: vfio_find_dma accepting a type argument Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06 20:18   ` Alex Williamson
2016-10-06 20:18     ` Alex Williamson
2016-10-06 20:18     ` Alex Williamson
2016-10-06  8:45 ` [PATCH v13 10/15] vfio/type1: Implement recursive vfio_find_dma_from_node Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06 20:19   ` Alex Williamson
2016-10-06 20:19     ` Alex Williamson
2016-10-06 20:19     ` Alex Williamson
2016-10-06  8:45 ` [PATCH v13 11/15] vfio/type1: Handle unmap/unpin and replay for VFIO_IOVA_RESERVED slots Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06 20:19   ` Alex Williamson
2016-10-06 20:19     ` Alex Williamson
2016-10-06 20:19     ` Alex Williamson
2016-10-07 17:11     ` Auger Eric
2016-10-07 17:11       ` Auger Eric
2016-10-07 17:11       ` Auger Eric
2016-10-06  8:45 ` [PATCH v13 12/15] vfio: Allow reserved msi iova registration Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06 20:19   ` Alex Williamson
2016-10-06 20:19     ` Alex Williamson
2016-10-06 20:19     ` Alex Williamson
2016-10-07 17:11     ` Auger Eric
2016-10-07 17:11       ` Auger Eric
2016-10-07 17:11       ` Auger Eric
2016-10-07 20:45       ` Alex Williamson
2016-10-07 20:45         ` Alex Williamson
2016-10-07 20:45         ` Alex Williamson
2016-10-06  8:45 ` [PATCH v13 13/15] vfio/type1: Check doorbell safety Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06 20:19   ` Alex Williamson
2016-10-06 20:19     ` Alex Williamson
2016-10-06 20:19     ` Alex Williamson
2016-10-06  8:45 ` [PATCH v13 14/15] iommu/arm-smmu: Do not advertise IOMMU_CAP_INTR_REMAP Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45 ` [PATCH v13 15/15] vfio/type1: Return the MSI geometry through VFIO_IOMMU_GET_INFO capability chains Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06  8:45   ` Eric Auger
2016-10-06 20:20   ` Alex Williamson
2016-10-06 20:20     ` Alex Williamson
2016-10-06 20:20     ` Alex Williamson
2016-10-06 20:42     ` Alex Williamson
2016-10-06 20:42       ` Alex Williamson
2016-10-06 20:42       ` Alex Williamson
2016-10-07 17:10       ` Auger Eric [this message]
2016-10-07 17:10         ` Auger Eric
2016-10-07 17:10         ` Auger Eric
2016-10-07 20:38         ` Alex Williamson
2016-10-07 20:38           ` Alex Williamson
2016-10-07 20:38           ` Alex Williamson
2016-10-10 15:01           ` Auger Eric
2016-10-10 15:01             ` Auger Eric

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4adea280-4bdf-7d0e-be2f-88e7f6219b9c@redhat.com \
    --to=eric.auger@redhat.com \
    --cc=Bharat.Bhushan@freescale.com \
    --cc=Jean-Philippe.Brucker@arm.com \
    --cc=Manish.Jaggi@caviumnetworks.com \
    --cc=alex.williamson@redhat.com \
    --cc=christoffer.dall@linaro.org \
    --cc=drjones@redhat.com \
    --cc=eric.auger.pro@gmail.com \
    --cc=iommu@lists.linux-foundation.org \
    --cc=jason@lakedaemon.net \
    --cc=joro@8bytes.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=p.fedin@samsung.com \
    --cc=pranav.sawargaonkar@gmail.com \
    --cc=robin.murphy@arm.com \
    --cc=tglx@linutronix.de \
    --cc=will.deacon@arm.com \
    --cc=yehuday@marvell.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.