On 19/03/2025 13:24, Joao Martins wrote:
> On 18/03/2025 09:54, Cédric Le Goater wrote:
>> This hides the MemoryListener implementation and makes the code common
>> to both IOMMU backends, legacy and IOMMUFD.
>>
>> Signed-off-by: Cédric Le Goater <clg@redhat.com>
>
> Reviewed-by: Joao Martins <joao.m.martins@oracle.com>
>
After discussing with Avihai, maybe the routine should be representative on what
it does and not so much on the namespace i.e.
vfio_dirty_tracking_register -> vfio_memory_register
vfio_dirty_tracking_unregister -> vfio_memory_unregister
Given that these have nothing to do with dirty tracking.
In terms of memory listeners the only function relevant in this area is:
vfio_dirty_tracking_init
vfio_dirty_tracking_update
Which have different purpose where we parse the memory ranges to construct 32/64
bit ranges for VF trackers.
>> ---
>> hw/vfio/dirty-tracking.h | 4 ++--
>> hw/vfio/container.c | 11 +++--------
>> hw/vfio/dirty-tracking.c | 21 ++++++++++++++++++++-
>> hw/vfio/iommufd.c | 9 ++-------
>> 4 files changed, 27 insertions(+), 18 deletions(-)
>>
>> diff --git a/hw/vfio/dirty-tracking.h b/hw/vfio/dirty-tracking.h
>> index db9494202a780108ce78b642950bfed78ba3f253..6d717f0e918e47e341114c82ffc2cf520fc7b079 100644
>> --- a/hw/vfio/dirty-tracking.h
>> +++ b/hw/vfio/dirty-tracking.h
>> @@ -9,11 +9,11 @@
>> #ifndef HW_VFIO_DIRTY_TRACKING_H
>> #define HW_VFIO_DIRTY_TRACKING_H
>>
>> -extern const MemoryListener vfio_memory_listener;
>> -
>> bool vfio_dirty_tracking_devices_is_started(const VFIOContainerBase *bcontainer);
>> bool vfio_dirty_tracking_devices_is_supported(const VFIOContainerBase *bcontainer);
>> int vfio_dirty_tracking_query_dirty_bitmap(const VFIOContainerBase *bcontainer, uint64_t iova,
>> uint64_t size, ram_addr_t ram_addr, Error **errp);
>> +bool vfio_dirty_tracking_register(VFIOContainerBase *bcontainer, Error **errp);
>> +void vfio_dirty_tracking_unregister(VFIOContainerBase *bcontainer);
>>
>> #endif /* HW_VFIO_DIRTY_TRACKING_H */
>> diff --git a/hw/vfio/container.c b/hw/vfio/container.c
>> index 7b3ec798a77052b8cb0b47d3dceaca1428cb50bd..1fcca75caba19353ad3063ae97b20c15f61564e9 100644
>> --- a/hw/vfio/container.c
>> +++ b/hw/vfio/container.c
>> @@ -616,12 +616,7 @@ static bool vfio_container_connect(VFIOGroup *group, AddressSpace *as,
>> group->container = container;
>> QLIST_INSERT_HEAD(&container->group_list, group, container_next);
>>
>> - bcontainer->listener = vfio_memory_listener;
>> - memory_listener_register(&bcontainer->listener, bcontainer->space->as);
>> -
>> - if (bcontainer->error) {
>> - error_propagate_prepend(errp, bcontainer->error,
>> - "memory listener initialization failed: ");
>> + if (!vfio_dirty_tracking_register(bcontainer, errp)) {
>> goto listener_release_exit;
>> }
>>
>> @@ -631,7 +626,7 @@ static bool vfio_container_connect(VFIOGroup *group, AddressSpace *as,
>> listener_release_exit:
>> QLIST_REMOVE(group, container_next);
>> vfio_group_del_kvm_device(group);
>> - memory_listener_unregister(&bcontainer->listener);
>> + vfio_dirty_tracking_unregister(bcontainer);
>> if (vioc->release) {
>> vioc->release(bcontainer);
>> }
>> @@ -669,7 +664,7 @@ static void vfio_container_disconnect(VFIOGroup *group)
>> * group.
>> */
>> if (QLIST_EMPTY(&container->group_list)) {
>> - memory_listener_unregister(&bcontainer->listener);
>> + vfio_dirty_tracking_unregister(bcontainer);
>> if (vioc->release) {
>> vioc->release(bcontainer);
>> }
>> diff --git a/hw/vfio/dirty-tracking.c b/hw/vfio/dirty-tracking.c
>> index 8e47ccbb9aea748e57271508ddcd10e394abf16c..d7827f7b64adf3e2b41fafd59aab71e0b28c1567 100644
>> --- a/hw/vfio/dirty-tracking.c
>> +++ b/hw/vfio/dirty-tracking.c
>> @@ -1267,7 +1267,7 @@ static void vfio_listener_log_sync(MemoryListener *listener,
>> }
>> }
>>
>> -const MemoryListener vfio_memory_listener = {
>> +static const MemoryListener vfio_memory_listener = {
>> .name = "vfio",
>> .region_add = vfio_listener_region_add,
>> .region_del = vfio_listener_region_del,
>> @@ -1275,3 +1275,22 @@ const MemoryListener vfio_memory_listener = {
>> .log_global_stop = vfio_listener_log_global_stop,
>> .log_sync = vfio_listener_log_sync,
>> };
>> +
>> +bool vfio_dirty_tracking_register(VFIOContainerBase *bcontainer, Error **errp)
>> +{
>> + bcontainer->listener = vfio_memory_listener;
>> + memory_listener_register(&bcontainer->listener, bcontainer->space->as);
>> +
>> + if (bcontainer->error) {
>> + error_propagate_prepend(errp, bcontainer->error,
>> + "memory listener initialization failed: ");
>> + return false;
>> + }
>> +
>> + return true;
>> +}
>> +
>> +void vfio_dirty_tracking_unregister(VFIOContainerBase *bcontainer)
>> +{
>> + memory_listener_unregister(&bcontainer->listener);
>> +}
>> diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
>> index 7f354d86cd14270a70dc990860ad5b69f0310719..7737d552f310c54ae2e035198a1a83da8c3199dd 100644
>> --- a/hw/vfio/iommufd.c
>> +++ b/hw/vfio/iommufd.c
>> @@ -411,7 +411,7 @@ static void iommufd_cdev_container_destroy(VFIOIOMMUFDContainer *container)
>> if (!QLIST_EMPTY(&bcontainer->device_list)) {
>> return;
>> }
>> - memory_listener_unregister(&bcontainer->listener);
>> + vfio_dirty_tracking_unregister(bcontainer);
>> iommufd_backend_free_id(container->be, container->ioas_id);
>> object_unref(container);
>> }
>> @@ -563,12 +563,7 @@ static bool iommufd_cdev_attach(const char *name, VFIODevice *vbasedev,
>> bcontainer->pgsizes = qemu_real_host_page_size();
>> }
>>
>> - bcontainer->listener = vfio_memory_listener;
>> - memory_listener_register(&bcontainer->listener, bcontainer->space->as);
>> -
>> - if (bcontainer->error) {
>> - error_propagate_prepend(errp, bcontainer->error,
>> - "memory listener initialization failed: ");
>> + if (!vfio_dirty_tracking_register(bcontainer, errp)) {
>> goto err_listener_register;
>> }
>>
>
>