On 26/03/2025 07:51, 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 <c...@redhat.com>
Reviewed-by: Joao Martins <joao.m.mart...@oracle.com> > --- > hw/vfio/vfio-listener.h | 3 ++- > hw/vfio/container.c | 11 +++-------- > hw/vfio/iommufd.c | 9 ++------- > hw/vfio/listener.c | 22 +++++++++++++++++++++- > 4 files changed, 28 insertions(+), 17 deletions(-) > > diff --git a/hw/vfio/vfio-listener.h b/hw/vfio/vfio-listener.h > index > 93af6747b28955f038454a335b361787f8364a3a..eb69ddd374fa20683007cfc4e9a7bf6fe707f27d > 100644 > --- a/hw/vfio/vfio-listener.h > +++ b/hw/vfio/vfio-listener.h > @@ -9,6 +9,7 @@ > #ifndef HW_VFIO_VFIO_LISTENER_H > #define HW_VFIO_VFIO_LISTENER_H > > -extern const MemoryListener vfio_memory_listener; > +bool vfio_listener_register(VFIOContainerBase *bcontainer, Error **errp); > +void vfio_listener_unregister(VFIOContainerBase *bcontainer); > > #endif /* HW_VFIO_VFIO_LISTENER_H */ > diff --git a/hw/vfio/container.c b/hw/vfio/container.c > index > acebb53dcb1b829d31cc31d9f7f2cc9599f952eb..f086e5c802f058c01ca740de338538106874fb03 > 100644 > --- a/hw/vfio/container.c > +++ b/hw/vfio/container.c > @@ -616,12 +616,7 @@ static bool vfio_connect_container(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_listener_register(bcontainer, errp)) { > goto listener_release_exit; > } > > @@ -631,7 +626,7 @@ static bool vfio_connect_container(VFIOGroup *group, > AddressSpace *as, > listener_release_exit: > QLIST_REMOVE(group, container_next); > vfio_kvm_device_del_group(group); > - memory_listener_unregister(&bcontainer->listener); > + vfio_listener_unregister(bcontainer); > if (vioc->release) { > vioc->release(bcontainer); > } > @@ -669,7 +664,7 @@ static void vfio_disconnect_container(VFIOGroup *group) > * group. > */ > if (QLIST_EMPTY(&container->group_list)) { > - memory_listener_unregister(&bcontainer->listener); > + vfio_listener_unregister(bcontainer); > if (vioc->release) { > vioc->release(bcontainer); > } > diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c > index > 7488d21215b6eee78c9c51cfb227d9c8c59c4978..e47720247d6acfd6ea0e5a2e2a2eecabfa62dce3 > 100644 > --- a/hw/vfio/iommufd.c > +++ b/hw/vfio/iommufd.c > @@ -410,7 +410,7 @@ static void > iommufd_cdev_container_destroy(VFIOIOMMUFDContainer *container) > if (!QLIST_EMPTY(&bcontainer->device_list)) { > return; > } > - memory_listener_unregister(&bcontainer->listener); > + vfio_listener_unregister(bcontainer); > iommufd_backend_free_id(container->be, container->ioas_id); > object_unref(container); > } > @@ -562,12 +562,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_listener_register(bcontainer, errp)) { > goto err_listener_register; > } > > diff --git a/hw/vfio/listener.c b/hw/vfio/listener.c > index > 07c8dc6ce343510dea20c5946e64a23a57c0f91b..324dc47183be82933197017f473f67cce6d7ec56 > 100644 > --- a/hw/vfio/listener.c > +++ b/hw/vfio/listener.c > @@ -46,6 +46,7 @@ > #include "system/tpm.h" > #include "vfio-migration-internal.h" > #include "vfio-helpers.h" > +#include "vfio-listener.h" > > /* > * Device state interfaces > @@ -1163,7 +1164,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, > @@ -1171,3 +1172,22 @@ const MemoryListener vfio_memory_listener = { > .log_global_stop = vfio_listener_log_global_stop, > .log_sync = vfio_listener_log_sync, > }; > + > +bool vfio_listener_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_listener_unregister(VFIOContainerBase *bcontainer) > +{ > + memory_listener_unregister(&bcontainer->listener); > +}