[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implement
From: |
Liu, Yi L |
Subject: |
Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation |
Date: |
Tue, 16 Jul 2019 10:25:55 +0000 |
> From: address@hidden [mailto:address@hidden] On Behalf
> Of David Gibson
> Sent: Monday, July 15, 2019 10:55 AM
> To: Liu, Yi L <address@hidden>
> Subject: Re: [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation
>
> On Fri, Jul 05, 2019 at 07:01:38PM +0800, Liu Yi L wrote:
> > This patch adds vfio implementation PCIPASIDOps.alloc_pasid/free_pasid().
> > These two functions are used to propagate guest pasid allocation and
> > free requests to host via vfio container ioctl.
>
> As I said in an earlier comment, I think doing this on the device is
> conceptually incorrect. I think we need an explcit notion of an SVM
> context (i.e. the namespace in which all the PASIDs live) - which will
> IIUC usually be shared amongst multiple devices. The create and free
> PASID requests should be on that object.
Actually, the allocation is not doing on this device. System wide, it is
done on a container. So not sure if it is the API interface gives you a
sense that this is done on device. Also, curious on the SVM context
concept, do you mean it a per-VM context or a per-SVM usage context?
May you elaborate a little more. :-)
Thanks,
Yi Liu
> >
> > 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>
> > Signed-off-by: Liu Yi L <address@hidden>
> > Signed-off-by: Yi Sun <address@hidden>
> > ---
> > hw/vfio/pci.c | 61
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 61 insertions(+)
> >
> > diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
> > index ce3fe96..ab184ad 100644
> > --- a/hw/vfio/pci.c
> > +++ b/hw/vfio/pci.c
> > @@ -2690,6 +2690,65 @@ static void
> > vfio_unregister_req_notifier(VFIOPCIDevice
> *vdev)
> > vdev->req_enabled = false;
> > }
> >
> > +static int vfio_pci_device_request_pasid_alloc(PCIBus *bus,
> > + int32_t devfn,
> > + uint32_t min_pasid,
> > + uint32_t max_pasid)
> > +{
> > + PCIDevice *pdev = bus->devices[devfn];
> > + VFIOPCIDevice *vdev = DO_UPCAST(VFIOPCIDevice, pdev, pdev);
> > + VFIOContainer *container = vdev->vbasedev.group->container;
> > + struct vfio_iommu_type1_pasid_request req;
> > + unsigned long argsz;
> > + int pasid;
> > +
> > + argsz = sizeof(req);
> > + req.argsz = argsz;
> > + req.flag = VFIO_IOMMU_PASID_ALLOC;
> > + req.min_pasid = min_pasid;
> > + req.max_pasid = max_pasid;
> > +
> > + rcu_read_lock();
> > + pasid = ioctl(container->fd, VFIO_IOMMU_PASID_REQUEST, &req);
> > + if (pasid < 0) {
> > + error_report("vfio_pci_device_request_pasid_alloc:"
> > + " request failed, contanier: %p", container);
> > + }
> > + rcu_read_unlock();
> > + return pasid;
> > +}
> > +
> > +static int vfio_pci_device_request_pasid_free(PCIBus *bus,
> > + int32_t devfn,
> > + uint32_t pasid)
> > +{
> > + PCIDevice *pdev = bus->devices[devfn];
> > + VFIOPCIDevice *vdev = DO_UPCAST(VFIOPCIDevice, pdev, pdev);
> > + VFIOContainer *container = vdev->vbasedev.group->container;
> > + struct vfio_iommu_type1_pasid_request req;
> > + unsigned long argsz;
> > + int ret = 0;
> > +
> > + argsz = sizeof(req);
> > + req.argsz = argsz;
> > + req.flag = VFIO_IOMMU_PASID_FREE;
> > + req.pasid = pasid;
> > +
> > + rcu_read_lock();
> > + ret = ioctl(container->fd, VFIO_IOMMU_PASID_REQUEST, &req);
> > + if (ret != 0) {
> > + error_report("vfio_pci_device_request_pasid_free:"
> > + " request failed, contanier: %p", container);
> > + }
> > + rcu_read_unlock();
> > + return ret;
> > +}
> > +
> > +static PCIPASIDOps vfio_pci_pasid_ops = {
> > + .alloc_pasid = vfio_pci_device_request_pasid_alloc,
> > + .free_pasid = vfio_pci_device_request_pasid_free,
> > +};
> > +
> > static void vfio_realize(PCIDevice *pdev, Error **errp)
> > {
> > VFIOPCIDevice *vdev = PCI_VFIO(pdev);
> > @@ -2991,6 +3050,8 @@ static void vfio_realize(PCIDevice *pdev, Error
> > **errp)
> > vfio_register_req_notifier(vdev);
> > vfio_setup_resetfn_quirk(vdev);
> >
> > + pci_setup_pasid_ops(pdev, &vfio_pci_pasid_ops);
> > +
> > return;
> >
> > out_teardown:
>
> --
> David Gibson | I'll have my music baroque, and my code
> david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_
> _other_
> | _way_ _around_!
> http://www.ozlabs.org/~dgibson
- Re: [Qemu-devel] [RFC v1 03/18] hw/pci: introduce PCIPASIDOps to PCIDevice, (continued)
- Re: [Qemu-devel] [RFC v1 03/18] hw/pci: introduce PCIPASIDOps to PCIDevice, Peter Xu, 2019/07/08
- Re: [Qemu-devel] [RFC v1 03/18] hw/pci: introduce PCIPASIDOps to PCIDevice, Auger Eric, 2019/07/09
- Re: [Qemu-devel] [RFC v1 03/18] hw/pci: introduce PCIPASIDOps to PCIDevice, Liu, Yi L, 2019/07/10
- Re: [Qemu-devel] [RFC v1 03/18] hw/pci: introduce PCIPASIDOps to PCIDevice, address@hidden, 2019/07/11
- Re: [Qemu-devel] [RFC v1 03/18] hw/pci: introduce PCIPASIDOps to PCIDevice, Liu, Yi L, 2019/07/11
[Qemu-devel] [RFC v1 01/18] linux-headers: import iommu.h from kernel, Liu Yi L, 2019/07/06
[Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation, Liu Yi L, 2019/07/06
- Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation, Peter Xu, 2019/07/08
- Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation, David Gibson, 2019/07/15
- Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation,
Liu, Yi L <=
- Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation, David Gibson, 2019/07/16
- Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation, Liu, Yi L, 2019/07/22
- Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation, David Gibson, 2019/07/23
- Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation, Liu, Yi L, 2019/07/24
- Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation, Auger Eric, 2019/07/24
- Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation, Liu, Yi L, 2019/07/26
- Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation, David Gibson, 2019/07/26
[Qemu-devel] [RFC v1 06/18] intel_iommu: support virtual command emulation and pasid request, Liu Yi L, 2019/07/06