Skip to content

Commit

Permalink
vfio/container: Convert functions to base container
Browse files Browse the repository at this point in the history
In the prospect to get rid of VFIOContainer refs
in common.c lets convert misc functions to use the base
container object instead:

vfio_devices_all_dirty_tracking
vfio_devices_all_device_dirty_tracking
vfio_devices_all_running_and_mig_active
vfio_devices_query_dirty_bitmap
vfio_get_dirty_bitmap

Signed-off-by: Eric Auger <eric.auger@redhat.com>
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
eauger authored and legoater committed Dec 19, 2023
1 parent 3e6015d commit e1cac6b
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 33 deletions.
42 changes: 18 additions & 24 deletions hw/vfio/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,9 +177,8 @@ bool vfio_device_state_is_precopy(VFIODevice *vbasedev)
migration->device_state == VFIO_DEVICE_STATE_PRE_COPY_P2P;
}

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

Expand All @@ -204,9 +203,8 @@ static bool vfio_devices_all_dirty_tracking(VFIOContainer *container)
return true;
}

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

QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) {
Expand All @@ -222,9 +220,8 @@ bool vfio_devices_all_device_dirty_tracking(VFIOContainer *container)
* Check if all VFIO devices are running and migration is active, which is
* essentially equivalent to the migration being in pre-copy phase.
*/
bool vfio_devices_all_running_and_mig_active(VFIOContainer *container)
bool vfio_devices_all_running_and_mig_active(VFIOContainerBase *bcontainer)
{
VFIOContainerBase *bcontainer = &container->bcontainer;
VFIODevice *vbasedev;

if (!migration_is_active(migrate_get_current())) {
Expand Down Expand Up @@ -1082,7 +1079,7 @@ static void vfio_listener_log_global_start(MemoryListener *listener)
VFIOContainer *container = container_of(listener, VFIOContainer, listener);
int ret;

if (vfio_devices_all_device_dirty_tracking(container)) {
if (vfio_devices_all_device_dirty_tracking(&container->bcontainer)) {
ret = vfio_devices_dma_logging_start(container);
} else {
ret = vfio_container_set_dirty_page_tracking(&container->bcontainer,
Expand All @@ -1101,7 +1098,7 @@ static void vfio_listener_log_global_stop(MemoryListener *listener)
VFIOContainer *container = container_of(listener, VFIOContainer, listener);
int ret = 0;

if (vfio_devices_all_device_dirty_tracking(container)) {
if (vfio_devices_all_device_dirty_tracking(&container->bcontainer)) {
vfio_devices_dma_logging_stop(container);
} else {
ret = vfio_container_set_dirty_page_tracking(&container->bcontainer,
Expand Down Expand Up @@ -1141,11 +1138,10 @@ static int vfio_device_dma_logging_report(VFIODevice *vbasedev, hwaddr iova,
return 0;
}

int vfio_devices_query_dirty_bitmap(VFIOContainer *container,
int vfio_devices_query_dirty_bitmap(VFIOContainerBase *bcontainer,
VFIOBitmap *vbmap, hwaddr iova,
hwaddr size)
{
VFIOContainerBase *bcontainer = &container->bcontainer;
VFIODevice *vbasedev;
int ret;

Expand All @@ -1165,17 +1161,16 @@ int vfio_devices_query_dirty_bitmap(VFIOContainer *container,
return 0;
}

int vfio_get_dirty_bitmap(VFIOContainer *container, uint64_t iova,
int vfio_get_dirty_bitmap(VFIOContainerBase *bcontainer, uint64_t iova,
uint64_t size, ram_addr_t ram_addr)
{
bool all_device_dirty_tracking =
vfio_devices_all_device_dirty_tracking(container);
vfio_devices_all_device_dirty_tracking(bcontainer);
uint64_t dirty_pages;
VFIOBitmap vbmap;
int ret;

if (!container->bcontainer.dirty_pages_supported &&
!all_device_dirty_tracking) {
if (!bcontainer->dirty_pages_supported && !all_device_dirty_tracking) {
cpu_physical_memory_set_dirty_range(ram_addr, size,
tcg_enabled() ? DIRTY_CLIENTS_ALL :
DIRTY_CLIENTS_NOCODE);
Expand All @@ -1188,10 +1183,9 @@ int vfio_get_dirty_bitmap(VFIOContainer *container, uint64_t iova,
}

if (all_device_dirty_tracking) {
ret = vfio_devices_query_dirty_bitmap(container, &vbmap, iova, size);
ret = vfio_devices_query_dirty_bitmap(bcontainer, &vbmap, iova, size);
} else {
ret = vfio_container_query_dirty_bitmap(&container->bcontainer, &vbmap,
iova, size);
ret = vfio_container_query_dirty_bitmap(bcontainer, &vbmap, iova, size);
}

if (ret) {
Expand All @@ -1201,8 +1195,7 @@ int vfio_get_dirty_bitmap(VFIOContainer *container, uint64_t iova,
dirty_pages = cpu_physical_memory_set_dirty_lebitmap(vbmap.bitmap, ram_addr,
vbmap.pages);

trace_vfio_get_dirty_bitmap(container->fd, iova, size, vbmap.size,
ram_addr, dirty_pages);
trace_vfio_get_dirty_bitmap(iova, size, vbmap.size, ram_addr, dirty_pages);
out:
g_free(vbmap.bitmap);

Expand Down Expand Up @@ -1236,8 +1229,8 @@ static void vfio_iommu_map_dirty_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb)

rcu_read_lock();
if (vfio_get_xlat_addr(iotlb, NULL, &translated_addr, NULL)) {
ret = vfio_get_dirty_bitmap(container, iova, iotlb->addr_mask + 1,
translated_addr);
ret = vfio_get_dirty_bitmap(&container->bcontainer, iova,
iotlb->addr_mask + 1, translated_addr);
if (ret) {
error_report("vfio_iommu_map_dirty_notify(%p, 0x%"HWADDR_PRIx", "
"0x%"HWADDR_PRIx") = %d (%s)",
Expand Down Expand Up @@ -1266,7 +1259,8 @@ static int vfio_ram_discard_get_dirty_bitmap(MemoryRegionSection *section,
* Sync the whole mapped region (spanning multiple individual mappings)
* in one go.
*/
return vfio_get_dirty_bitmap(vrdl->container, iova, size, ram_addr);
return vfio_get_dirty_bitmap(&vrdl->container->bcontainer, iova, size,
ram_addr);
}

static int vfio_sync_ram_discard_listener_dirty_bitmap(VFIOContainer *container,
Expand Down Expand Up @@ -1335,7 +1329,7 @@ static int vfio_sync_dirty_bitmap(VFIOContainer *container,
ram_addr = memory_region_get_ram_addr(section->mr) +
section->offset_within_region;

return vfio_get_dirty_bitmap(container,
return vfio_get_dirty_bitmap(&container->bcontainer,
REAL_HOST_PAGE_ALIGN(section->offset_within_address_space),
int128_get64(section->size), ram_addr);
}
Expand All @@ -1350,7 +1344,7 @@ static void vfio_listener_log_sync(MemoryListener *listener,
return;
}

if (vfio_devices_all_dirty_tracking(container)) {
if (vfio_devices_all_dirty_tracking(&container->bcontainer)) {
ret = vfio_sync_dirty_bitmap(container, section);
if (ret) {
error_report("vfio: Failed to sync dirty bitmap, err: %d (%s)", ret,
Expand Down
6 changes: 3 additions & 3 deletions hw/vfio/container.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,8 @@ static int vfio_legacy_dma_unmap(VFIOContainerBase *bcontainer, hwaddr iova,
bool need_dirty_sync = false;
int ret;

if (iotlb && vfio_devices_all_running_and_mig_active(container)) {
if (!vfio_devices_all_device_dirty_tracking(container) &&
if (iotlb && vfio_devices_all_running_and_mig_active(bcontainer)) {
if (!vfio_devices_all_device_dirty_tracking(bcontainer) &&
container->bcontainer.dirty_pages_supported) {
return vfio_dma_unmap_bitmap(container, iova, size, iotlb);
}
Expand Down Expand Up @@ -162,7 +162,7 @@ static int vfio_legacy_dma_unmap(VFIOContainerBase *bcontainer, hwaddr iova,
}

if (need_dirty_sync) {
ret = vfio_get_dirty_bitmap(container, iova, size,
ret = vfio_get_dirty_bitmap(bcontainer, iova, size,
iotlb->translated_addr);
if (ret) {
return ret;
Expand Down
2 changes: 1 addition & 1 deletion hw/vfio/trace-events
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ vfio_region_sparse_mmap_header(const char *name, int index, int nr_areas) "Devic
vfio_region_sparse_mmap_entry(int i, unsigned long start, unsigned long end) "sparse entry %d [0x%lx - 0x%lx]"
vfio_get_dev_region(const char *name, int index, uint32_t type, uint32_t subtype) "%s index %d, %08x/%08x"
vfio_legacy_dma_unmap_overflow_workaround(void) ""
vfio_get_dirty_bitmap(int fd, uint64_t iova, uint64_t size, uint64_t bitmap_size, uint64_t start, uint64_t dirty_pages) "container fd=%d, iova=0x%"PRIx64" size= 0x%"PRIx64" bitmap_size=0x%"PRIx64" start=0x%"PRIx64" dirty_pages=%"PRIu64
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

# platform.c
Expand Down
9 changes: 4 additions & 5 deletions include/hw/vfio/vfio-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,6 @@ typedef struct VFIODisplay {

VFIOAddressSpace *vfio_get_address_space(AddressSpace *as);
void vfio_put_address_space(VFIOAddressSpace *space);
bool vfio_devices_all_running_and_saving(VFIOContainer *container);

/* SPAPR specific */
int vfio_container_add_section_window(VFIOContainer *container,
Expand Down Expand Up @@ -260,11 +259,11 @@ bool vfio_migration_realize(VFIODevice *vbasedev, Error **errp);
void vfio_migration_exit(VFIODevice *vbasedev);

int vfio_bitmap_alloc(VFIOBitmap *vbmap, hwaddr size);
bool vfio_devices_all_running_and_mig_active(VFIOContainer *container);
bool vfio_devices_all_device_dirty_tracking(VFIOContainer *container);
int vfio_devices_query_dirty_bitmap(VFIOContainer *container,
bool vfio_devices_all_running_and_mig_active(VFIOContainerBase *bcontainer);
bool vfio_devices_all_device_dirty_tracking(VFIOContainerBase *bcontainer);
int vfio_devices_query_dirty_bitmap(VFIOContainerBase *bcontainer,
VFIOBitmap *vbmap, hwaddr iova,
hwaddr size);
int vfio_get_dirty_bitmap(VFIOContainer *container, uint64_t iova,
int vfio_get_dirty_bitmap(VFIOContainerBase *bcontainer, uint64_t iova,
uint64_t size, ram_addr_t ram_addr);
#endif /* HW_VFIO_VFIO_COMMON_H */

0 comments on commit e1cac6b

Please sign in to comment.