mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
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. Reviewed-by: John Levon <john.levon@nutanix.com> Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Link: https://lore.kernel.org/qemu-devel/20250326075122.1299361-15-clg@redhat.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
parent
0778f9b3be
commit
d158ed0923
7 changed files with 64 additions and 61 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -47,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
|
||||
/*
|
||||
|
@ -1392,51 +1390,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;
|
||||
|
|
|
@ -14,6 +14,56 @@
|
|||
#include "qapi/error.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "hw/vfio/vfio-container-base.h"
|
||||
#include "hw/vfio/vfio-common.h" /* vfio_reset_handler */
|
||||
#include "system/reset.h"
|
||||
|
||||
static QLIST_HEAD(, VFIOAddressSpace) vfio_address_spaces =
|
||||
QLIST_HEAD_INITIALIZER(vfio_address_spaces);
|
||||
|
||||
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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -486,7 +486,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
|
||||
|
@ -606,7 +606,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);
|
||||
|
@ -631,7 +631,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);
|
||||
|
|
|
@ -120,11 +120,6 @@ 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);
|
||||
|
|
|
@ -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);
|
||||
|
@ -163,4 +168,5 @@ struct VFIOIOMMUClass {
|
|||
MemoryRegionSection *section);
|
||||
void (*release)(VFIOContainerBase *bcontainer);
|
||||
};
|
||||
|
||||
#endif /* HW_VFIO_VFIO_CONTAINER_BASE_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue