>-----Original Message----- >From: Cédric Le Goater <c...@redhat.com> >Subject: [PATCH for-10.1 13/32] vfio: Move VFIOAddressSpace helpers into >container-base.c > >VFIOAddressSpace is a common object used by VFIOContainerBase which is >declared in "hw/vfio/vfio-container-base.h". Move the VFIOAddressSpace >related services into "container-base.c". > >While at it, rename : > > vfio_get_address_space -> vfio_address_space_get > vfio_put_address_space -> vfio_address_space_put > >to better reflect the namespace these routines belong to. > >Signed-off-by: Cédric Le Goater <c...@redhat.com> >--- > include/hw/vfio/vfio-common.h | 6 --- > include/hw/vfio/vfio-container-base.h | 5 ++ > hw/ppc/spapr_pci_vfio.c | 5 +- > hw/vfio/common.c | 66 ------------------------- > hw/vfio/container-base.c | 69 +++++++++++++++++++++++++++ > hw/vfio/container.c | 6 +-- > hw/vfio/iommufd.c | 6 +-- > hw/vfio/trace-events | 4 +- > 8 files changed, 85 insertions(+), 82 deletions(-) > >diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h >index >e23626856e6ff96939a4660f059833f166aa88e9..2ea7f9c6f6e7e752699954ac236 >cac0bbe834b39 100644 >--- a/include/hw/vfio/vfio-common.h >+++ b/include/hw/vfio/vfio-common.h >@@ -120,18 +120,12 @@ struct VFIODeviceOps { > #define TYPE_HOST_IOMMU_DEVICE_IOMMUFD_VFIO \ > TYPE_HOST_IOMMU_DEVICE_IOMMUFD "-vfio" > >-VFIOAddressSpace *vfio_get_address_space(AddressSpace *as); >-void vfio_put_address_space(VFIOAddressSpace *space); >-void vfio_address_space_insert(VFIOAddressSpace *space, >- VFIOContainerBase *bcontainer); >- > void vfio_disable_irqindex(VFIODevice *vbasedev, int index); > void vfio_unmask_single_irqindex(VFIODevice *vbasedev, int index); > void vfio_mask_single_irqindex(VFIODevice *vbasedev, int index); > bool vfio_set_irq_signaling(VFIODevice *vbasedev, int index, int subindex, > int action, int fd, Error **errp); > >-void vfio_reset_handler(void *opaque); > struct vfio_device_info *vfio_get_device_info(int fd); > bool vfio_device_is_mdev(VFIODevice *vbasedev); > bool vfio_device_hiod_realize(VFIODevice *vbasedev, Error **errp); >diff --git a/include/hw/vfio/vfio-container-base.h b/include/hw/vfio/vfio- >container-base.h >index >4cff9943ab4861a25d07b5ebd1200509ebfab12d..27668879f5ca77e558a2bda954 >8c8e60afefe794 100644 >--- a/include/hw/vfio/vfio-container-base.h >+++ b/include/hw/vfio/vfio-container-base.h >@@ -71,6 +71,11 @@ typedef struct VFIORamDiscardListener { > QLIST_ENTRY(VFIORamDiscardListener) next; > } VFIORamDiscardListener; > >+VFIOAddressSpace *vfio_address_space_get(AddressSpace *as); >+void vfio_address_space_put(VFIOAddressSpace *space); >+void vfio_address_space_insert(VFIOAddressSpace *space, >+ VFIOContainerBase *bcontainer); >+ > int vfio_container_dma_map(VFIOContainerBase *bcontainer, > hwaddr iova, ram_addr_t size, > void *vaddr, bool readonly); >diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c >index >1722a5bfa3983d42baac558f22410e36eed375f5..e318d0d912f3e90d1289e4bc21 >95bf68418e5206 100644 >--- a/hw/ppc/spapr_pci_vfio.c >+++ b/hw/ppc/spapr_pci_vfio.c >@@ -24,7 +24,6 @@ > #include "hw/pci-host/spapr.h" > #include "hw/pci/msix.h" > #include "hw/pci/pci_device.h" >-#include "hw/vfio/vfio-common.h" > #include "hw/vfio/vfio-container.h" > #include "qemu/error-report.h" > #include CONFIG_DEVICES /* CONFIG_VFIO_PCI */ >@@ -86,7 +85,7 @@ static int vfio_eeh_container_op(VFIOContainer *container, >uint32_t op) > > static VFIOContainer *vfio_eeh_as_container(AddressSpace *as) > { >- VFIOAddressSpace *space = vfio_get_address_space(as); >+ VFIOAddressSpace *space = vfio_address_space_get(as); > VFIOContainerBase *bcontainer = NULL; > > if (QLIST_EMPTY(&space->containers)) { >@@ -106,7 +105,7 @@ static VFIOContainer >*vfio_eeh_as_container(AddressSpace *as) > } > > out: >- vfio_put_address_space(space); >+ vfio_address_space_put(space); > return container_of(bcontainer, VFIOContainer, bcontainer); > } > >diff --git a/hw/vfio/common.c b/hw/vfio/common.c >index >0e3746eddd1c08e98bf57a59d542e158487d346e..08e2494d7c4a9858657724730 >b2829290fb3f197 100644 >--- a/hw/vfio/common.c >+++ b/hw/vfio/common.c >@@ -36,7 +36,6 @@ > #include "qemu/main-loop.h" > #include "qemu/range.h" > #include "system/kvm.h" >-#include "system/reset.h" > #include "system/runstate.h" > #include "trace.h" > #include "qapi/error.h" >@@ -48,8 +47,6 @@ > > VFIODeviceList vfio_device_list = > QLIST_HEAD_INITIALIZER(vfio_device_list); >-static QLIST_HEAD(, VFIOAddressSpace) vfio_address_spaces = >- QLIST_HEAD_INITIALIZER(vfio_address_spaces); > > #ifdef CONFIG_KVM > /* >@@ -1304,24 +1301,6 @@ const MemoryListener vfio_memory_listener = { > .log_sync = vfio_listener_log_sync, > }; > >-void vfio_reset_handler(void *opaque) >-{ >- VFIODevice *vbasedev; >- >- trace_vfio_reset_handler(); >- QLIST_FOREACH(vbasedev, &vfio_device_list, global_next) { >- if (vbasedev->dev->realized) { >- vbasedev->ops->vfio_compute_needs_reset(vbasedev); >- } >- } >- >- QLIST_FOREACH(vbasedev, &vfio_device_list, global_next) { >- if (vbasedev->dev->realized && vbasedev->needs_reset) { >- vbasedev->ops->vfio_hot_reset_multi(vbasedev); >- } >- } >-} >- > int vfio_kvm_device_add_fd(int fd, Error **errp) > { > #ifdef CONFIG_KVM >@@ -1380,51 +1359,6 @@ int vfio_kvm_device_del_fd(int fd, Error **errp) > return 0; > } > >-VFIOAddressSpace *vfio_get_address_space(AddressSpace *as) >-{ >- VFIOAddressSpace *space; >- >- QLIST_FOREACH(space, &vfio_address_spaces, list) { >- if (space->as == as) { >- return space; >- } >- } >- >- /* No suitable VFIOAddressSpace, create a new one */ >- space = g_malloc0(sizeof(*space)); >- space->as = as; >- QLIST_INIT(&space->containers); >- >- if (QLIST_EMPTY(&vfio_address_spaces)) { >- qemu_register_reset(vfio_reset_handler, NULL); >- } >- >- QLIST_INSERT_HEAD(&vfio_address_spaces, space, list); >- >- return space; >-} >- >-void vfio_put_address_space(VFIOAddressSpace *space) >-{ >- if (!QLIST_EMPTY(&space->containers)) { >- return; >- } >- >- QLIST_REMOVE(space, list); >- g_free(space); >- >- if (QLIST_EMPTY(&vfio_address_spaces)) { >- qemu_unregister_reset(vfio_reset_handler, NULL); >- } >-} >- >-void vfio_address_space_insert(VFIOAddressSpace *space, >- VFIOContainerBase *bcontainer) >-{ >- QLIST_INSERT_HEAD(&space->containers, bcontainer, next); >- bcontainer->space = space; >-} >- > struct vfio_device_info *vfio_get_device_info(int fd) > { > struct vfio_device_info *info; >diff --git a/hw/vfio/container-base.c b/hw/vfio/container-base.c >index >749a3fd29dd6fc9143f14edf7e4ac6238315fcce..83e83ab9e67de8b004dfaf0067e >4c466a6c88451 100644 >--- a/hw/vfio/container-base.c >+++ b/hw/vfio/container-base.c >@@ -13,7 +13,76 @@ > #include "qemu/osdep.h" > #include "qapi/error.h" > #include "qemu/error-report.h" >+#include "system/reset.h" > #include "hw/vfio/vfio-container-base.h" >+#include "hw/vfio/vfio-common.h" /* for vfio_device_list */ >+#include "trace.h" >+ >+static QLIST_HEAD(, VFIOAddressSpace) vfio_address_spaces = >+ QLIST_HEAD_INITIALIZER(vfio_address_spaces); >+ >+static void vfio_reset_handler(void *opaque) >+{ >+ VFIODevice *vbasedev; >+ >+ trace_vfio_reset_handler(); >+ QLIST_FOREACH(vbasedev, &vfio_device_list, global_next) { >+ if (vbasedev->dev->realized) { >+ vbasedev->ops->vfio_compute_needs_reset(vbasedev); >+ } >+ } >+ >+ QLIST_FOREACH(vbasedev, &vfio_device_list, global_next) { >+ if (vbasedev->dev->realized && vbasedev->needs_reset) { >+ vbasedev->ops->vfio_hot_reset_multi(vbasedev); >+ } >+ } >+}
This is not an address space scoped function, no sure if better to move to helper.c or common.c Thanks Zhenzhong >+ >+VFIOAddressSpace *vfio_address_space_get(AddressSpace *as) >+{ >+ VFIOAddressSpace *space; >+ >+ QLIST_FOREACH(space, &vfio_address_spaces, list) { >+ if (space->as == as) { >+ return space; >+ } >+ } >+ >+ /* No suitable VFIOAddressSpace, create a new one */ >+ space = g_malloc0(sizeof(*space)); >+ space->as = as; >+ QLIST_INIT(&space->containers); >+ >+ if (QLIST_EMPTY(&vfio_address_spaces)) { >+ qemu_register_reset(vfio_reset_handler, NULL); >+ } >+ >+ QLIST_INSERT_HEAD(&vfio_address_spaces, space, list); >+ >+ return space; >+} >+ >+void vfio_address_space_put(VFIOAddressSpace *space) >+{ >+ if (!QLIST_EMPTY(&space->containers)) { >+ return; >+ } >+ >+ QLIST_REMOVE(space, list); >+ g_free(space); >+ >+ if (QLIST_EMPTY(&vfio_address_spaces)) { >+ qemu_unregister_reset(vfio_reset_handler, NULL); >+ } >+} >+ >+void vfio_address_space_insert(VFIOAddressSpace *space, >+ VFIOContainerBase *bcontainer) >+{ >+ QLIST_INSERT_HEAD(&space->containers, bcontainer, next); >+ bcontainer->space = space; >+} > > int vfio_container_dma_map(VFIOContainerBase *bcontainer, > hwaddr iova, ram_addr_t size, >diff --git a/hw/vfio/container.c b/hw/vfio/container.c >index >8badeb98ec052ad1fa7b5d45bb1733b1184bc6fb..9b86e24a4072e579bcdc2c060c >e42608ee44ee2e 100644 >--- a/hw/vfio/container.c >+++ b/hw/vfio/container.c >@@ -546,7 +546,7 @@ static bool vfio_connect_container(VFIOGroup *group, >AddressSpace *as, > VFIOAddressSpace *space; > VFIOIOMMUClass *vioc; > >- space = vfio_get_address_space(as); >+ space = vfio_address_space_get(as); > > /* > * VFIO is currently incompatible with discarding of RAM insofar as the >@@ -675,7 +675,7 @@ close_fd_exit: > close(fd); > > put_space_exit: >- vfio_put_address_space(space); >+ vfio_address_space_put(space); > > return false; > } >@@ -714,7 +714,7 @@ static void vfio_disconnect_container(VFIOGroup *group) > close(container->fd); > object_unref(container); > >- vfio_put_address_space(space); >+ vfio_address_space_put(space); > } > } > >diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c >index >a219b6453037e2d4e0d12800ea25678885af98f8..a170f5c71218db8c9b2f00b1a4 >5ee900b6b21346 100644 >--- a/hw/vfio/iommufd.c >+++ b/hw/vfio/iommufd.c >@@ -487,7 +487,7 @@ static bool iommufd_cdev_attach(const char *name, >VFIODevice *vbasedev, > goto err_connect_bind; > } > >- space = vfio_get_address_space(as); >+ space = vfio_address_space_get(as); > > /* > * The HostIOMMUDevice data from legacy backend is static and doesn't need >@@ -607,7 +607,7 @@ err_discard_disable: > err_attach_container: > iommufd_cdev_container_destroy(container); > err_alloc_ioas: >- vfio_put_address_space(space); >+ vfio_address_space_put(space); > iommufd_cdev_unbind_and_disconnect(vbasedev); > err_connect_bind: > close(vbasedev->fd); >@@ -632,7 +632,7 @@ static void iommufd_cdev_detach(VFIODevice *vbasedev) > vfio_cpr_unregister_container(bcontainer); > iommufd_cdev_detach_container(vbasedev, container); > iommufd_cdev_container_destroy(container); >- vfio_put_address_space(space); >+ vfio_address_space_put(space); > > iommufd_cdev_unbind_and_disconnect(vbasedev); > close(vbasedev->fd); >diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events >index >81f4130100c48012c15b5b4858446149a7eaf5b6..c3691c1a172c31c5b10bfd6967 >c32fd32b65d0f7 100644 >--- a/hw/vfio/trace-events >+++ b/hw/vfio/trace-events >@@ -109,7 +109,6 @@ vfio_get_dev_region(const char *name, int index, >uint32_t type, uint32_t subtype > vfio_legacy_dma_unmap_overflow_workaround(void) "" > vfio_get_dirty_bitmap(uint64_t iova, uint64_t size, uint64_t bitmap_size, >uint64_t start, uint64_t dirty_pages) "iova=0x%"PRIx64" size= 0x%"PRIx64" >bitmap_size=0x%"PRIx64" start=0x%"PRIx64" dirty_pages=%"PRIu64 > vfio_iommu_map_dirty_notify(uint64_t iova_start, uint64_t iova_end) "iommu >dirty @ 0x%"PRIx64" - 0x%"PRIx64 >-vfio_reset_handler(void) "" > > # region.c > vfio_region_write(const char *name, int index, uint64_t addr, uint64_t data, >unsigned size) " (%s:region%d+0x%"PRIx64", 0x%"PRIx64 ", %d)" >@@ -194,3 +193,6 @@ iommufd_cdev_fail_attach_existing_container(const >char *msg) " %s" > iommufd_cdev_alloc_ioas(int iommufd, int ioas_id) " [iommufd=%d] new >IOMMUFD container with ioasid=%d" > iommufd_cdev_device_info(char *name, int devfd, int num_irqs, int >num_regions, int flags) " %s (%d) num_irqs=%d num_regions=%d flags=%d" > iommufd_cdev_pci_hot_reset_dep_devices(int domain, int bus, int slot, int >function, int dev_id) "\t%04x:%02x:%02x.%x devid %d" >+ >+# container-base.c >+vfio_reset_handler(void) "" >-- >2.48.1