Existing VFIO provides group-centric user APIs for userspace. Userspace opens the /dev/vfio/$group_id first before getting device fd and hence getting access to device. This is not the desired model for iommufd. Per the conclusion of community discussion[1], iommufd provides device-centric kAPIs and requires its consumer (like VFIO) to be device-centric user APIs. Such user APIs are used to associate device with iommufd and also the I/O address spaces managed by the iommufd. This series first introduces a per device file structure to be prepared for further enhancement and refactors the kvm-vfio code to be prepared for accepting device file from userspace. Then refactors the vfio to be able to handle iommufd binding. This refactor includes the mechanism of blocking device access before iommufd bind, making vfio_device_open() be exclusive between the group path and the cdev path. Eventually, adds the cdev support for vfio device, and makes group infrastructure optional as it is not needed when vfio device cdev is compiled. This is also a base for further support iommu nesting for vfio device[2]. The complete code can be found in below branch, simple test done with the legacy group path and the cdev path. Draft QEMU branch can be found at[3] https://github.com/yiliu1765/iommufd/tree/vfio_device_cdev_v1 (config CONFIG_IOMMUFD=y) [1] https://lore.kernel.org/kvm/BN9PR11MB5433B1E4AE5B0480369F97178C189@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/ [2] https://github.com/yiliu1765/iommufd/tree/wip/iommufd-v6.2-rc4-nesting [3] https://github.com/yiliu1765/qemu/tree/wip/qemu-iommufd-6.2-rc4 (need further cleanup) Change log: v1: - Fix the circular refcount between kvm struct and device file reference. (JasonG) - Address comments from KevinT - Remained the ioctl for detach, needs to Alex's taste (https://lore.kernel.org/kvm/BN9PR11MB5276BE9F4B0613EE859317028CFF9@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/) rfc: https://lore.kernel.org/kvm/20221219084718.9342-1-yi.l.liu@xxxxxxxxx/ Thanks, Yi Liu Yi Liu (13): vfio: Allocate per device file structure vfio: Refine vfio file kAPIs vfio: Accept vfio device file in the driver facing kAPI kvm/vfio: Rename kvm_vfio_group to prepare for accepting vfio device fd kvm/vfio: Provide struct kvm_device_ops::release() insted of ::destroy() kvm/vfio: Accept vfio device file from userspace vfio: Pass struct vfio_device_file * to vfio_device_open/close() vfio: Block device access via device fd until device is opened vfio: Add infrastructure for bind_iommufd and attach vfio: Make vfio_device_open() exclusive between group path and device cdev path vfio: Add cdev for vfio_device vfio: Add ioctls for device cdev iommufd vfio: Compile group optionally Documentation/virt/kvm/devices/vfio.rst | 32 +- drivers/vfio/Kconfig | 17 + drivers/vfio/Makefile | 3 +- drivers/vfio/group.c | 131 +++--- drivers/vfio/iommufd.c | 79 +++- drivers/vfio/pci/vfio_pci_core.c | 4 +- drivers/vfio/vfio.h | 109 ++++- drivers/vfio/vfio_main.c | 506 ++++++++++++++++++++++-- include/linux/vfio.h | 21 +- include/uapi/linux/iommufd.h | 2 + include/uapi/linux/kvm.h | 23 +- include/uapi/linux/vfio.h | 64 +++ virt/kvm/vfio.c | 145 +++---- 13 files changed, 909 insertions(+), 227 deletions(-) -- 2.34.1