[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: |
Mon, 15 Jul 2019 12:55:19 +1000 |
User-agent: |
Mutt/1.12.0 (2019-05-25) |
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.
>
> 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
- [Qemu-devel] [RFC v1 03/18] hw/pci: introduce PCIPASIDOps to PCIDevice, (continued)
- [Qemu-devel] [RFC v1 03/18] hw/pci: introduce PCIPASIDOps to PCIDevice, Liu Yi L, 2019/07/06
- 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 <=
- 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, 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