On Wed, Nov 08, 2023 at 07:16:52AM +0000, Duan, Zhenzhong wrote: > >> + 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. > > Thanks for help test and investigation. > I was only focusing on real device and missed the mdev particularity, sorry. > You are right, there is no hwpt support for mdev, not even an emulated hwpt. > I'll digging into this and see how to distinguish mdev with real device in > this low level function.
I was expecting that hwpt manipulation would be done exclusively inside the device-specific vIOMMU userspace driver. Generic code paths that don't have that knowledge should use the IOAS for everything Jason