[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [RFC v3 12/25] vfio/common: add pasid_alloc/free support
From: |
Liu, Yi L |
Subject: |
RE: [RFC v3 12/25] vfio/common: add pasid_alloc/free support |
Date: |
Wed, 12 Feb 2020 07:20:33 +0000 |
> From: Peter Xu <address@hidden>
> Sent: Wednesday, February 12, 2020 3:32 AM
> To: Liu, Yi L <address@hidden>
> Subject: Re: [RFC v3 12/25] vfio/common: add pasid_alloc/free support
>
> On Wed, Jan 29, 2020 at 04:16:43AM -0800, Liu, Yi L wrote:
> > From: Liu Yi L <address@hidden>
> >
> > This patch adds VFIO pasid alloc/free support to allow host intercept
> > in PASID allocation for VM by adding VFIO implementation of
> > DualStageIOMMUOps.pasid_alloc/free callbacks.
> >
> > Cc: Kevin Tian <address@hidden>
> > Cc: Jacob Pan <address@hidden>
> > Cc: Peter Xu <address@hidden>
> > Cc: Eric Auger <address@hidden>
> > Cc: Yi Sun <address@hidden>
> > Cc: David Gibson <address@hidden>
> > Cc: Alex Williamson <address@hidden>
> > Signed-off-by: Liu Yi L <address@hidden>
> > ---
> > hw/vfio/common.c | 42
> ++++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 42 insertions(+)
> >
> > diff --git a/hw/vfio/common.c b/hw/vfio/common.c index
> > a07824b..014f4e7 100644
> > --- a/hw/vfio/common.c
> > +++ b/hw/vfio/common.c
> > @@ -1179,7 +1179,49 @@ static int vfio_get_iommu_type(VFIOContainer
> *container,
> > return -EINVAL;
> > }
> >
> > +static int vfio_ds_iommu_pasid_alloc(DualStageIOMMUObject *dsi_obj,
> > + uint32_t min, uint32_t max, uint32_t *pasid)
> > +{
> > + VFIOContainer *container = container_of(dsi_obj, VFIOContainer,
> > dsi_obj);
> > + struct vfio_iommu_type1_pasid_request req;
> > + unsigned long argsz;
> > +
> > + argsz = sizeof(req);
> > + req.argsz = argsz;
> > + req.flags = VFIO_IOMMU_PASID_ALLOC;
> > + req.alloc_pasid.min = min;
> > + req.alloc_pasid.max = max;
> > +
> > + if (ioctl(container->fd, VFIO_IOMMU_PASID_REQUEST, &req)) {
> > + error_report("%s: %d, alloc failed", __func__, -errno);
> > + return -errno;
>
> Note that errno is prone to change by other syscalls. Better cache it right
> after
> the ioctl.
>
> > + }
> > + *pasid = req.alloc_pasid.result;
> > + return 0;
> > +}
> > +
> > +static int vfio_ds_iommu_pasid_free(DualStageIOMMUObject *dsi_obj,
> > + uint32_t pasid) {
> > + VFIOContainer *container = container_of(dsi_obj, VFIOContainer,
> > dsi_obj);
> > + struct vfio_iommu_type1_pasid_request req;
> > + unsigned long argsz;
> > +
> > + argsz = sizeof(req);
> > + req.argsz = argsz;
> > + req.flags = VFIO_IOMMU_PASID_FREE;
> > + req.free_pasid = pasid;
> > +
> > + if (ioctl(container->fd, VFIO_IOMMU_PASID_REQUEST, &req)) {
> > + error_report("%s: %d, free failed", __func__, -errno);
> > + return -errno;
>
> Same here.
Got the two comments. Thanks,
Regards,
Yi Liu