>-----Original Message-----
>From: Steven Sistare <steven.sist...@oracle.com>
>Subject: Re: [PATCH V3 29/42] backends/iommufd: change process ioctl
>
>On 5/21/2025 11:19 PM, Duan, Zhenzhong wrote:
>>> -----Original Message-----
>>> From: Steven Sistare <steven.sist...@oracle.com>
>>> Subject: Re: [PATCH V3 29/42] backends/iommufd: change process ioctl
>>>
>>> On 5/20/2025 11:11 PM, Duan, Zhenzhong wrote:
>>>>> -----Original Message-----
>>>>> From: Steven Sistare <steven.sist...@oracle.com>
>>>>> Subject: Re: [PATCH V3 29/42] backends/iommufd: change process ioctl
>>>>>
>>>>> On 5/19/2025 11:51 AM, Steven Sistare wrote:
>>>>>> On 5/16/2025 4:42 AM, Duan, Zhenzhong wrote:
>>>>>>>> -----Original Message-----
>>>>>>>> From: Steve Sistare <steven.sist...@oracle.com>
>>>>>>>> Subject: [PATCH V3 29/42] backends/iommufd: change process ioctl
>>>>>>>>
>>>>>>>> Define the change process ioctl
>>>>>>>>
>>>>>>>> Signed-off-by: Steve Sistare <steven.sist...@oracle.com>
>>>>>>>> ---
>>>>>>>> backends/iommufd.c       | 20 ++++++++++++++++++++
>>>>>>>> backends/trace-events    |  1 +
>>>>>>>> include/system/iommufd.h |  2 ++
>>>>>>>> 3 files changed, 23 insertions(+)
>>>>>>>>
>>>>>>>> diff --git a/backends/iommufd.c b/backends/iommufd.c
>>>>>>>> index 5c1958f..6fed1c1 100644
>>>>>>>> --- a/backends/iommufd.c
>>>>>>>> +++ b/backends/iommufd.c
>>>>>>>> @@ -73,6 +73,26 @@ static void
>>> iommufd_backend_class_init(ObjectClass
>>>>> *oc,
>>>>>>>> const void *data)
>>>>>>>>        object_class_property_add_str(oc, "fd", NULL,
>>> iommufd_backend_set_fd);
>>>>>>>> }
>>>>>>>>
>>>>>>>> +bool iommufd_change_process_capable(IOMMUFDBackend *be)
>>>>>>>> +{
>>>>>>>> +    struct iommu_ioas_change_process args = {.size = sizeof(args)};
>>>>>>>> +
>>>>>>>> +    return !ioctl(be->fd, IOMMU_IOAS_CHANGE_PROCESS, &args);
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +bool iommufd_change_process(IOMMUFDBackend *be, Error **errp)
>>>>>>>> +{
>>>>>>>> +    struct iommu_ioas_change_process args = {.size = sizeof(args)};
>>>>>>>> +    bool ret = !ioctl(be->fd, IOMMU_IOAS_CHANGE_PROCESS, &args);
>>>>>>>
>>>>>>> This is same ioctl as above check, could it be called more than once for
>>> same
>>>>> process?
>>>>>>
>>>>>> Yes, and it is a no-op if the process has not changed since the last time
>DMA
>>>>>> was mapped.
>>>>>
>>>>> More questions?
>>>>
>>>> Looks a bit redundant for me, meanwhile if
>iommufd_change_process_capable()
>>> is called on target qemu, may it do both checking and change?
>>>>
>>>> I would suggest to define only iommufd_change_process() and comment that
>>> it's no-op if process not changed...
>>>
>>> We need to check if IOMMU_IOAS_CHANGE_PROCESS is allowed before
>>> performing
>>> live update so we can add a blocker and prevent live update cleanly:
>>>
>>> vfio_iommufd_cpr_register_container
>>>      if !vfio_cpr_supported()        // calls iommufd_change_process_capable
>>>          migrate_add_blocker_modes()
>>
>> This reminds me of other questions, is this ioctl() suitable for checking if 
>> cpr-
>transfer supported?
>> If there is vIOMMU, there can be no mapping and process_capable() check will
>pass,
>> but if memory is not file backed...
>> Does cpr-transfer support vIOMMU or not?
>
>I don't know, I have not tried your sample args yet, but I will.
>With vIOMMU, what entity/interface pins memory for the vfio device?

Oh, I don't mean virtio-iommu, it can be intel-iommu or virtio-iommu for this 
issue.
I mean when guest attach device to a DMA domain, there can be no mapping in 
that domain initially.

>
>> QEMU knows details of all memory backends, why not checking memory
>backends directly instead of a system call?
>
>IOMMU_IOAS_CHANGE_PROCESS is relatively new. The ioctl verifies that the
>kernel
>supports it.  And if supported, it also verifies that all dma mappings are
>of the file type.

But the dma mappings are dynamic if there is vIOMMU, so checking dma mappings 
are checking nothing if there is no mapping in the DMA domain.

>
>- Steve
>
>>> How about I just add a comment:
>>>
>>> bool iommufd_change_process_capable(IOMMUFDBackend *be)
>>> {
>>>      /*
>>>       * Call IOMMU_IOAS_CHANGE_PROCESS to verify it is a recognized ioctl.
>>>       * This is a no-op if the process has not changed since DMA was mapped.
>>>       */
>>>
>>> - Steve
>>

Reply via email to