[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 06/10] vfio/iommufd: Implement VFIOIOMMUClass::set_dirty_t
From: |
Joao Martins |
Subject: |
Re: [PATCH v3 06/10] vfio/iommufd: Implement VFIOIOMMUClass::set_dirty_tracking support |
Date: |
Tue, 9 Jul 2024 10:13:57 +0100 |
On 09/07/2024 08:07, Cédric Le Goater wrote:
> On 7/8/24 4:34 PM, Joao Martins wrote:
>> ioctl(iommufd, IOMMU_HWPT_SET_DIRTY_TRACKING, arg) is the UAPI that
>> enables or disables dirty page tracking. It is used if the hwpt
>> has been created with dirty tracking supported domain (stored in
>> hwpt::flags) and it is called on the whole list of iommu domains
>> it is are tracking. On failure it rolls it back.
>>
>> The checking of hwpt::flags is introduced here as a second user
>> and thus consolidate such check into a helper function
>> iommufd_hwpt_dirty_tracking().
>>
>> Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
>> ---
>> include/sysemu/iommufd.h | 3 +++
>> backends/iommufd.c | 20 ++++++++++++++++++
>> hw/vfio/iommufd.c | 45 +++++++++++++++++++++++++++++++++++++++-
>> backends/trace-events | 1 +
>> 4 files changed, 68 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/sysemu/iommufd.h b/include/sysemu/iommufd.h
>> index 35a8cec9780f..1470377f55ba 100644
>> --- a/include/sysemu/iommufd.h
>> +++ b/include/sysemu/iommufd.h
>> @@ -54,6 +54,9 @@ int iommufd_backend_alloc_hwpt(IOMMUFDBackend *be, uint32_t
>> dev_id,
>> uint32_t pt_id, uint32_t flags,
>> uint32_t data_type, uint32_t data_len,
>> void *data_ptr, uint32_t *out_hwpt);
>> +int iommufd_backend_set_dirty_tracking(IOMMUFDBackend *be, uint32_t hwpt_id,
>> + bool start);
>> #define TYPE_HOST_IOMMU_DEVICE_IOMMUFD TYPE_HOST_IOMMU_DEVICE "-iommufd"
>> +
>> #endif
>> diff --git a/backends/iommufd.c b/backends/iommufd.c
>> index f5f73eaf4a1a..69daabc27473 100644
>> --- a/backends/iommufd.c
>> +++ b/backends/iommufd.c
>> @@ -237,6 +237,26 @@ int iommufd_backend_alloc_hwpt(IOMMUFDBackend *be,
>> uint32_t dev_id,
>> return ret;
>> }
>> +int iommufd_backend_set_dirty_tracking(IOMMUFDBackend *be, uint32_t
>> hwpt_id,
>> + bool start)
>> +{
>> + int ret;
>> + struct iommu_hwpt_set_dirty_tracking set_dirty = {
>> + .size = sizeof(set_dirty),
>> + .hwpt_id = hwpt_id,
>> + .flags = !start ? 0 : IOMMU_HWPT_DIRTY_TRACKING_ENABLE,
>> + };
>> +
>> + ret = ioctl(be->fd, IOMMU_HWPT_SET_DIRTY_TRACKING, &set_dirty);
>> + trace_iommufd_backend_set_dirty(be->fd, hwpt_id, start, ret);
>> + if (ret) {
>> + ret = -errno;
>> + error_report("IOMMU_HWPT_SET_DIRTY_TRACKING failed: %s",
>> + strerror(errno));
>> + }
>> + return ret;
>> +}
>> +
>> bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid,
>> uint32_t *type, void *data, uint32_t
>> len,
>> uint64_t *caps, Error **errp)
>> diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
>> index 1b5b46d28ed6..158a98cb3b12 100644
>> --- a/hw/vfio/iommufd.c
>> +++ b/hw/vfio/iommufd.c
>> @@ -110,6 +110,48 @@ static void
>> iommufd_cdev_unbind_and_disconnect(VFIODevice
>> *vbasedev)
>> iommufd_backend_disconnect(vbasedev->iommufd);
>> }
>> +static bool iommufd_hwpt_dirty_tracking(VFIOIOASHwpt *hwpt)
>> +{
>> + return hwpt->hwpt_flags & IOMMU_HWPT_ALLOC_DIRTY_TRACKING;
>> +}
>> +
>> +static int iommufd_set_dirty_page_tracking(const VFIOContainerBase
>> *bcontainer,
>> + bool start, Error **errp)
>> +{
>> + const VFIOIOMMUFDContainer *container =
>> + container_of(bcontainer, VFIOIOMMUFDContainer, bcontainer);
>> + int ret;
>> + VFIOIOASHwpt *hwpt;
>> +
>> + QLIST_FOREACH(hwpt, &container->hwpt_list, next) {
>> + if (!iommufd_hwpt_dirty_tracking(hwpt)) {
>> + continue;
>> + }
>> +
>> + ret = iommufd_backend_set_dirty_tracking(container->be,
>> + hwpt->hwpt_id, start);
>> + if (ret) {
>> + ret = -errno;
>> + error_setg_errno(errp, errno,
>> + "Failed to start dirty tracking on hwpt_id %u",
>> + hwpt->hwpt_id);
>
>
>
> This error looks redundant with the one printed out in the lower backend
> version. Couldn't we add an 'Error **' parameter and return a bool ?
I'll add here as well.
Joao
- Re: [PATCH v3 04/10] vfio/iommufd: Introduce auto domain creation, (continued)
[PATCH v3 06/10] vfio/iommufd: Implement VFIOIOMMUClass::set_dirty_tracking support, Joao Martins, 2024/07/08
[PATCH v3 07/10] vfio/iommufd: Implement VFIOIOMMUClass::query_dirty_bitmap support, Joao Martins, 2024/07/08
[PATCH v3 09/10] vfio/migration: Don't block migration device dirty tracking is unsupported, Joao Martins, 2024/07/08
[PATCH v3 10/10] vfio/common: Allow disabling device dirty page tracking, Joao Martins, 2024/07/08