Hi Eric, > From: Auger Eric <eric.auger@xxxxxxxxxx> > Sent: Wednesday, April 1, 2020 5:41 PM > To: Liu, Yi L <yi.l.liu@xxxxxxxxx>; alex.williamson@xxxxxxxxxx > Subject: Re: [PATCH v1 3/8] vfio/type1: Report PASID alloc/free support to > userspace > > Yi, > On 3/22/20 1:32 PM, Liu, Yi L wrote: > > From: Liu Yi L <yi.l.liu@xxxxxxxxx> > > > > This patch reports PASID alloc/free availability to userspace (e.g. > > QEMU) thus userspace could do a pre-check before utilizing this feature. > > > > Cc: Kevin Tian <kevin.tian@xxxxxxxxx> > > CC: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> > > Cc: Alex Williamson <alex.williamson@xxxxxxxxxx> > > Cc: Eric Auger <eric.auger@xxxxxxxxxx> > > Cc: Jean-Philippe Brucker <jean-philippe@xxxxxxxxxx> > > Signed-off-by: Liu Yi L <yi.l.liu@xxxxxxxxx> > > --- > > drivers/vfio/vfio_iommu_type1.c | 28 ++++++++++++++++++++++++++++ > > include/uapi/linux/vfio.h | 8 ++++++++ > > 2 files changed, 36 insertions(+) > > > > diff --git a/drivers/vfio/vfio_iommu_type1.c > > b/drivers/vfio/vfio_iommu_type1.c index e40afc0..ddd1ffe 100644 > > --- a/drivers/vfio/vfio_iommu_type1.c > > +++ b/drivers/vfio/vfio_iommu_type1.c > > @@ -2234,6 +2234,30 @@ static int vfio_iommu_type1_pasid_free(struct > vfio_iommu *iommu, > > return ret; > > } > > > > +static int vfio_iommu_info_add_nesting_cap(struct vfio_iommu *iommu, > > + struct vfio_info_cap *caps) > > +{ > > + struct vfio_info_cap_header *header; > > + struct vfio_iommu_type1_info_cap_nesting *nesting_cap; > > + > > + header = vfio_info_cap_add(caps, sizeof(*nesting_cap), > > + VFIO_IOMMU_TYPE1_INFO_CAP_NESTING, 1); > > + if (IS_ERR(header)) > > + return PTR_ERR(header); > > + > > + nesting_cap = container_of(header, > > + struct vfio_iommu_type1_info_cap_nesting, > > + header); > > + > > + nesting_cap->nesting_capabilities = 0; > > + if (iommu->nesting) { > > + /* nesting iommu type supports PASID requests (alloc/free) */ > > + nesting_cap->nesting_capabilities |= VFIO_IOMMU_PASID_REQS; > Supporting nesting does not necessarily mean supporting PASID. here I think the PASID is somehow IDs in kernel which can be used to tag various address spaces provided by guest software. I think this is why we introduced the ioasid. :-) Current implementation is doing PASID alloc/free in vfio. > > + } > > + > > + return 0; > > +} > > + > > static long vfio_iommu_type1_ioctl(void *iommu_data, > > unsigned int cmd, unsigned long arg) { @@ - > 2283,6 +2307,10 @@ > > static long vfio_iommu_type1_ioctl(void *iommu_data, > > if (ret) > > return ret; > > > > + ret = vfio_iommu_info_add_nesting_cap(iommu, &caps); > > + if (ret) > > + return ret; > > + > > if (caps.size) { > > info.flags |= VFIO_IOMMU_INFO_CAPS; > > > > diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h > > index 298ac80..8837219 100644 > > --- a/include/uapi/linux/vfio.h > > +++ b/include/uapi/linux/vfio.h > > @@ -748,6 +748,14 @@ struct vfio_iommu_type1_info_cap_iova_range { > > struct vfio_iova_range iova_ranges[]; > > }; > > > > +#define VFIO_IOMMU_TYPE1_INFO_CAP_NESTING 2 > > + > > +struct vfio_iommu_type1_info_cap_nesting { > > + struct vfio_info_cap_header header; > > +#define VFIO_IOMMU_PASID_REQS (1 << 0) > PASID_REQS sounds a bit far from the claimed host managed alloc/free > capability. > VFIO_IOMMU_SYSTEM_WIDE_PASID? Oh, yep. I can rename it. Regards, Yi Liu