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 <clg@redhat.com>
Reviewed-by: Joao Martins <joao.m.martins@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);
> +}