aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCédric Le Goater <clg@redhat.com>2025-03-26 08:51:19 +0100
committerCédric Le Goater <clg@redhat.com>2025-04-25 09:01:37 +0200
commita9183378f54969c8b11f08fdb3063925de8d77c3 (patch)
tree767d638f2b5ee3ebf1106d57472f5d6078e1e8c5
parent74d376378e2a41392a36f34cef7d2c89ac2dfb33 (diff)
downloadqemu-a9183378f54969c8b11f08fdb3063925de8d77c3.zip
qemu-a9183378f54969c8b11f08fdb3063925de8d77c3.tar.gz
qemu-a9183378f54969c8b11f08fdb3063925de8d77c3.tar.bz2
vfio: Introduce vfio_listener_un/register() routines
This hides the MemoryListener implementation and makes the code common to both IOMMU backends, legacy and IOMMUFD. Reviewed-by: Joao Martins <joao.m.martins@oracle.com> Reviewed-by: John Levon <john.levon@nutanix.com> Link: https://lore.kernel.org/qemu-devel/20250326075122.1299361-35-clg@redhat.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
-rw-r--r--hw/vfio/container.c11
-rw-r--r--hw/vfio/iommufd.c9
-rw-r--r--hw/vfio/listener.c22
-rw-r--r--hw/vfio/vfio-listener.h3
4 files changed, 28 insertions, 17 deletions
diff --git a/hw/vfio/container.c b/hw/vfio/container.c
index ff540e1..e4fcb1a 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 7488d21..e477202 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 70bdeb3..d196745 100644
--- a/hw/vfio/listener.c
+++ b/hw/vfio/listener.c
@@ -45,6 +45,7 @@
#include "system/tpm.h"
#include "vfio-migration-internal.h"
#include "vfio-helpers.h"
+#include "vfio-listener.h"
/*
* Device state interfaces
@@ -1162,7 +1163,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,
@@ -1170,3 +1171,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);
+}
diff --git a/hw/vfio/vfio-listener.h b/hw/vfio/vfio-listener.h
index 93af674..eb69ddd 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 */