On 11/2/23 3:12 AM, Zhenzhong Duan wrote:
> From: Yi Liu <yi.l....@intel.com>
> 
> Add the iommufd backend. The IOMMUFD container class is implemented
> based on the new /dev/iommu user API. This backend obviously depends
> on CONFIG_IOMMUFD.
> 
> So far, the iommufd backend doesn't support dirty page sync yet due
> to missing support in the host kernel.
> 
> Co-authored-by: Eric Auger <eric.au...@redhat.com>
> Signed-off-by: Eric Auger <eric.au...@redhat.com>
> Signed-off-by: Yi Liu <yi.l....@intel.com>
> Signed-off-by: Zhenzhong Duan <zhenzhong.d...@intel.com>
> ---

[...]

> +static int iommufd_cdev_attach_container(VFIODevice *vbasedev,
> +                                         VFIOIOMMUFDContainer *container,
> +                                         Error **errp)
> +{
> +    int ret, iommufd = vbasedev->iommufd->fd;
> +    VFIOIOASHwpt *hwpt;
> +    uint32_t hwpt_id;
> +    Error *err = NULL;
> +
> +    /* try to attach to an existing hwpt in this container */
> +    QLIST_FOREACH(hwpt, &container->hwpt_list, next) {
> +        ret = iommufd_cdev_attach_hwpt(vbasedev, hwpt->hwpt_id, &err);
> +        if (ret) {
> +            const char *msg = error_get_pretty(err);
> +
> +            trace_iommufd_cdev_fail_attach_existing_hwpt(msg);
> +            error_free(err);
> +            err = NULL;
> +        } else {
> +            goto found_hwpt;
> +        }
> +    }
> +
> +    ret = iommufd_backend_alloc_hwpt(iommufd, vbasedev->devid,
> +                                     container->ioas_id, &hwpt_id);
> +
> +    if (ret) {
> +        error_setg_errno(errp, errno, "error alloc shadow hwpt");
> +        return ret;
> +    }

The above alloc_hwpt fails for mdevs (at least, it fails for me attempting to 
use iommufd backend with vfio-ccw and vfio-ap on s390).  The ioctl is failing 
in the kernel because it can't find an IOMMUFD_OBJ_DEVICE.

AFAIU that's because the mdevs are meant to instead use kernel access via 
vfio_iommufd_emulated_attach_ioas, not hwpt.  That's how mdevs behave when 
looking at the kernel vfio compat container.

As a test, I was able to get vfio-ccw and vfio-ap working using the iommufd 
backend by just skipping this alloc_hwpt above and instead passing 
container->ioas_id into the iommufd_cdev_attach_hwpt below.  That triggers the 
vfio_iommufd_emulated_attach_ioas call in the kernel.

> +
> +    /* Attach cdev to a new allocated hwpt within iommufd */
> +    ret = iommufd_cdev_attach_hwpt(vbasedev, hwpt_id, errp);
> +    if (ret) {
> +        iommufd_backend_free_id(iommufd, hwpt_id);
> +        return ret;
> +    }
> +
> +    hwpt = iommufd_container_get_hwpt(container, hwpt_id);
> +found_hwpt:
> +    QLIST_INSERT_HEAD(&hwpt->device_list, vbasedev, next);
> +    vbasedev->hwpt = hwpt;
> +
> +    trace_iommufd_cdev_attach_container(iommufd, vbasedev->name, 
> vbasedev->fd,
> +                                        container->ioas_id, hwpt->hwpt_id);
> +    return ret;
> +}


Reply via email to