Re: [RFC v1 3/8] vhost: Add 3 new uapi to support iommufd
From: Jason Wang <hidden>
Date: 2023-11-10 02:32:52
Also in:
lkml, virtualization
On Wed, Nov 8, 2023 at 3:09 PM Jason Wang [off-list ref] wrote:
On Wed, Nov 8, 2023 at 2:39 PM Cindy Lu [off-list ref] wrote:quoted
On Wed, Nov 8, 2023 at 11:03 AM Jason Wang [off-list ref] wrote:quoted
On Tue, Nov 7, 2023 at 2:57 PM Cindy Lu [off-list ref] wrote:quoted
On Mon, Nov 6, 2023 at 3:30 PM Jason Wang [off-list ref] wrote:quoted
On Sat, Nov 4, 2023 at 1:17 AM Cindy Lu [off-list ref] wrote:quoted
VHOST_VDPA_SET_IOMMU_FD: bind the device to iommufd device VDPA_DEVICE_ATTACH_IOMMUFD_AS: Attach a vdpa device to an iommufd address space specified by IOAS id. VDPA_DEVICE_DETACH_IOMMUFD_AS: Detach a vdpa device from the iommufd address space Signed-off-by: Cindy Lu <redacted> ---[...]quoted
diff --git a/include/uapi/linux/vhost.h b/include/uapi/linux/vhost.h index f5c48b61ab62..07e1b2c443ca 100644 --- a/include/uapi/linux/vhost.h +++ b/include/uapi/linux/vhost.h@@ -219,4 +219,70 @@ */ #define VHOST_VDPA_RESUME _IO(VHOST_VIRTIO, 0x7E) +/* vhost_vdpa_set_iommufd + * Input parameters: + * @iommufd: file descriptor from /dev/iommu; pass -1 to unset + * @iommufd_ioasid: IOAS identifier returned from ioctl(IOMMU_IOAS_ALLOC) + * Output parameters: + * @out_dev_id: device identifier + */ +struct vhost_vdpa_set_iommufd { + __s32 iommufd; + __u32 iommufd_ioasid; + __u32 out_dev_id; +}; + +#define VHOST_VDPA_SET_IOMMU_FD \ + _IOW(VHOST_VIRTIO, 0x7F, struct vhost_vdpa_set_iommufd) + +/* + * VDPA_DEVICE_ATTACH_IOMMUFD_AS - + * _IOW(VHOST_VIRTIO, 0x7f, struct vdpa_device_attach_iommufd_as) + * + * Attach a vdpa device to an iommufd address space specified by IOAS + * id. + * + * Available only after a device has been bound to iommufd via + * VHOST_VDPA_SET_IOMMU_FD + * + * Undo by VDPA_DEVICE_DETACH_IOMMUFD_AS or device fd close. + * + * @argsz: user filled size of this data. + * @flags: must be 0. + * @ioas_id: Input the target id which can represent an ioas + * allocated via iommufd subsystem. + * + * Return: 0 on success, -errno on failure. + */ +struct vdpa_device_attach_iommufd_as { + __u32 argsz; + __u32 flags; + __u32 ioas_id; +};I think we need to map ioas to vDPA AS, so there should be an ASID from the view of vDPA? ThanksThe qemu will have a structure save and maintain this information,So I didn't add this in kernel,we can add this but maybe only for check?I meant for example, a simulator has two AS. How can we attach an ioas to a specific AS with the above uAPI? Thank>this __u32 ioas_id here is alloc from the iommufd system. maybe I need to change to new name iommuds_asid to make this more clear the process in qemu is 1) qemu want to use AS 0 (for example) 2) checking the existing asid. the asid 0 not used before 3 )alloc new asid from iommufd system, get new ioas_id (maybe 3 for example) qemu will save this relation 3<-->0 in the driver. 4) setting the ioctl VDPA_DEVICE_ATTACH_IOMMUFD_AS to attach new ASID to the kernelSo if we want to map IOMMUFD AS 3 to VDPA AS 0, how can it be done? For example I didn't see a vDPA AS parameter in the above uAPI. vhost_vdpa_set_iommufd has iommufd_ioasid which is obviously not the vDPA AS. And ioas_id of vdpa_device_attach_iommufd_as (as you explained above) is not vDPA AS.
For example, the simulator/mlx5e has two ASes. It needs to know the mapping between vDPA AS and iommufd AS. Otherwise the translation will be problematic. Thanks
Thanksquoted
5) while map the memory, qemu will use ASID 3 to map /umap and use ASID 0 for legacy mode map/umap So kernel here will not maintain the ioas_id from iommufd, and this also make the code strange since there will 2 different asid for the same AS, maybe we can save these information in the kernel Thanks cindyquoted
quoted
Thanks Cindyquoted
quoted
+ +#define VDPA_DEVICE_ATTACH_IOMMUFD_AS \ + _IOW(VHOST_VIRTIO, 0x82, struct vdpa_device_attach_iommufd_as) + +/* + * VDPA_DEVICE_DETACH_IOMMUFD_AS + * + * Detach a vdpa device from the iommufd address space it has been + * attached to. After it, device should be in a blocking DMA state. + * + * Available only after a device has been bound to iommufd via + * VHOST_VDPA_SET_IOMMU_FD + * + * @argsz: user filled size of this data. + * @flags: must be 0. + * + * Return: 0 on success, -errno on failure. + */ +struct vdpa_device_detach_iommufd_as { + __u32 argsz; + __u32 flags; +}; + +#define VDPA_DEVICE_DETACH_IOMMUFD_AS \ + _IOW(VHOST_VIRTIO, 0x83, struct vdpa_device_detach_iommufd_as) + #endif -- 2.34.3