Skip to content

Commit

Permalink
vfio/container: Move per container device list in base container
Browse files Browse the repository at this point in the history
VFIO Device is also changed to point to base container instead of
legacy container.

No functional change intended.

Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Signed-off-by: Cédric Le Goater <clg@redhat.com>
  • Loading branch information
duanzhenzhong authored and legoater committed Dec 19, 2023
1 parent bb42449 commit 3e6015d
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 16 deletions.
23 changes: 15 additions & 8 deletions hw/vfio/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ void vfio_unblock_multiple_devices_migration(void)

bool vfio_viommu_preset(VFIODevice *vbasedev)
{
return vbasedev->container->bcontainer.space->as != &address_space_memory;
return vbasedev->bcontainer->space->as != &address_space_memory;
}

static void vfio_set_migration_error(int err)
Expand Down Expand Up @@ -179,6 +179,7 @@ bool vfio_device_state_is_precopy(VFIODevice *vbasedev)

static bool vfio_devices_all_dirty_tracking(VFIOContainer *container)
{
VFIOContainerBase *bcontainer = &container->bcontainer;
VFIODevice *vbasedev;
MigrationState *ms = migrate_get_current();

Expand All @@ -187,7 +188,7 @@ static bool vfio_devices_all_dirty_tracking(VFIOContainer *container)
return false;
}

QLIST_FOREACH(vbasedev, &container->device_list, container_next) {
QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) {
VFIOMigration *migration = vbasedev->migration;

if (!migration) {
Expand All @@ -205,9 +206,10 @@ static bool vfio_devices_all_dirty_tracking(VFIOContainer *container)

bool vfio_devices_all_device_dirty_tracking(VFIOContainer *container)
{
VFIOContainerBase *bcontainer = &container->bcontainer;
VFIODevice *vbasedev;

QLIST_FOREACH(vbasedev, &container->device_list, container_next) {
QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) {
if (!vbasedev->dirty_pages_supported) {
return false;
}
Expand All @@ -222,13 +224,14 @@ bool vfio_devices_all_device_dirty_tracking(VFIOContainer *container)
*/
bool vfio_devices_all_running_and_mig_active(VFIOContainer *container)
{
VFIOContainerBase *bcontainer = &container->bcontainer;
VFIODevice *vbasedev;

if (!migration_is_active(migrate_get_current())) {
return false;
}

QLIST_FOREACH(vbasedev, &container->device_list, container_next) {
QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) {
VFIOMigration *migration = vbasedev->migration;

if (!migration) {
Expand Down Expand Up @@ -833,12 +836,13 @@ static bool vfio_section_is_vfio_pci(MemoryRegionSection *section,
VFIOContainer *container)
{
VFIOPCIDevice *pcidev;
VFIOContainerBase *bcontainer = &container->bcontainer;
VFIODevice *vbasedev;
Object *owner;

owner = memory_region_owner(section->mr);

QLIST_FOREACH(vbasedev, &container->device_list, container_next) {
QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) {
if (vbasedev->type != VFIO_DEVICE_TYPE_PCI) {
continue;
}
Expand Down Expand Up @@ -939,13 +943,14 @@ static void vfio_devices_dma_logging_stop(VFIOContainer *container)
uint64_t buf[DIV_ROUND_UP(sizeof(struct vfio_device_feature),
sizeof(uint64_t))] = {};
struct vfio_device_feature *feature = (struct vfio_device_feature *)buf;
VFIOContainerBase *bcontainer = &container->bcontainer;
VFIODevice *vbasedev;

feature->argsz = sizeof(buf);
feature->flags = VFIO_DEVICE_FEATURE_SET |
VFIO_DEVICE_FEATURE_DMA_LOGGING_STOP;

QLIST_FOREACH(vbasedev, &container->device_list, container_next) {
QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) {
if (!vbasedev->dirty_tracking) {
continue;
}
Expand Down Expand Up @@ -1036,6 +1041,7 @@ static int vfio_devices_dma_logging_start(VFIOContainer *container)
{
struct vfio_device_feature *feature;
VFIODirtyRanges ranges;
VFIOContainerBase *bcontainer = &container->bcontainer;
VFIODevice *vbasedev;
int ret = 0;

Expand All @@ -1046,7 +1052,7 @@ static int vfio_devices_dma_logging_start(VFIOContainer *container)
return -errno;
}

QLIST_FOREACH(vbasedev, &container->device_list, container_next) {
QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) {
if (vbasedev->dirty_tracking) {
continue;
}
Expand Down Expand Up @@ -1139,10 +1145,11 @@ int vfio_devices_query_dirty_bitmap(VFIOContainer *container,
VFIOBitmap *vbmap, hwaddr iova,
hwaddr size)
{
VFIOContainerBase *bcontainer = &container->bcontainer;
VFIODevice *vbasedev;
int ret;

QLIST_FOREACH(vbasedev, &container->device_list, container_next) {
QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) {
ret = vfio_device_dma_logging_report(vbasedev, iova, size,
vbmap->bitmap);
if (ret) {
Expand Down
12 changes: 6 additions & 6 deletions hw/vfio/container.c
Original file line number Diff line number Diff line change
Expand Up @@ -888,7 +888,7 @@ int vfio_attach_device(char *name, VFIODevice *vbasedev,
int groupid = vfio_device_groupid(vbasedev, errp);
VFIODevice *vbasedev_iter;
VFIOGroup *group;
VFIOContainer *container;
VFIOContainerBase *bcontainer;
int ret;

if (groupid < 0) {
Expand All @@ -915,9 +915,9 @@ int vfio_attach_device(char *name, VFIODevice *vbasedev,
return ret;
}

container = group->container;
vbasedev->container = container;
QLIST_INSERT_HEAD(&container->device_list, vbasedev, container_next);
bcontainer = &group->container->bcontainer;
vbasedev->bcontainer = bcontainer;
QLIST_INSERT_HEAD(&bcontainer->device_list, vbasedev, container_next);
QLIST_INSERT_HEAD(&vfio_device_list, vbasedev, global_next);

return ret;
Expand All @@ -927,13 +927,13 @@ void vfio_detach_device(VFIODevice *vbasedev)
{
VFIOGroup *group = vbasedev->group;

if (!vbasedev->container) {
if (!vbasedev->bcontainer) {
return;
}

QLIST_REMOVE(vbasedev, global_next);
QLIST_REMOVE(vbasedev, container_next);
vbasedev->container = NULL;
vbasedev->bcontainer = NULL;
trace_vfio_detach_device(vbasedev->name, group->groupid);
vfio_put_base_device(vbasedev);
vfio_put_group(group);
Expand Down
3 changes: 1 addition & 2 deletions include/hw/vfio/vfio-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ typedef struct VFIOContainer {
QLIST_HEAD(, VFIOHostDMAWindow) hostwin_list;
QLIST_HEAD(, VFIOGroup) group_list;
QLIST_HEAD(, VFIORamDiscardListener) vrdl_list;
QLIST_HEAD(, VFIODevice) device_list;
GList *iova_ranges;
} VFIOContainer;

Expand Down Expand Up @@ -118,7 +117,7 @@ typedef struct VFIODevice {
QLIST_ENTRY(VFIODevice) container_next;
QLIST_ENTRY(VFIODevice) global_next;
struct VFIOGroup *group;
VFIOContainer *container;
VFIOContainerBase *bcontainer;
char *sysfsdev;
char *name;
DeviceState *dev;
Expand Down
1 change: 1 addition & 0 deletions include/hw/vfio/vfio-container-base.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ typedef struct VFIOContainerBase {
bool dirty_pages_supported;
QLIST_HEAD(, VFIOGuestIOMMU) giommu_list;
QLIST_ENTRY(VFIOContainerBase) next;
QLIST_HEAD(, VFIODevice) device_list;
} VFIOContainerBase;

typedef struct VFIOGuestIOMMU {
Expand Down

0 comments on commit 3e6015d

Please sign in to comment.