[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: |
David Gibson |
Subject: |
Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation |
Date: |
Wed, 17 Jul 2019 13:06:40 +1000 |
User-agent: |
Mutt/1.12.0 (2019-05-25) |
On Tue, Jul 16, 2019 at 10:25:55AM +0000, Liu, Yi L wrote:
> > 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.
Sorry, I should have been clearer. I can see that at the VFIO level
it is done on the container. However the function here takes a bus
and devfn, so this qemu internal interface is per-device, which
doesn't really make sense.
> 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. :-)
Sorry, I'm struggling to find a good term for this. By "context" I
mean a namespace containing a bunch of PASID address spaces, those
PASIDs are then visible to some group of devices.
>
> 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
signature.asc
Description: PGP signature
- 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, 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, 2019/07/16
- Re: [Qemu-devel] [RFC v1 05/18] vfio/pci: add pasid alloc/free implementation,
David Gibson <=
- 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