mirror of https://github.com/xemu-project/xemu.git
vfio/common: Extract vIOMMU code from vfio_sync_dirty_bitmap()
Extract vIOMMU code from vfio_sync_dirty_bitmap() to a new function and restructure the code. This is done in preparation for optimizing vIOMMU device dirty page tracking. No functional changes intended. Signed-off-by: Avihai Horon <avihaih@nvidia.com> Signed-off-by: Joao Martins <joao.m.martins@oracle.com> [ clg: - Rebased on upstream - Fixed typo in commit log ] Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Tested-by: Eric Auger <eric.auger@redhat.com> Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
parent
344e70945d
commit
723f702b89
|
@ -1302,37 +1302,50 @@ vfio_sync_ram_discard_listener_dirty_bitmap(VFIOContainerBase *bcontainer,
|
||||||
&vrdl);
|
&vrdl);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vfio_sync_dirty_bitmap(VFIOContainerBase *bcontainer,
|
static int vfio_sync_iommu_dirty_bitmap(VFIOContainerBase *bcontainer,
|
||||||
MemoryRegionSection *section, Error **errp)
|
MemoryRegionSection *section)
|
||||||
{
|
{
|
||||||
ram_addr_t ram_addr;
|
|
||||||
|
|
||||||
if (memory_region_is_iommu(section->mr)) {
|
|
||||||
VFIOGuestIOMMU *giommu;
|
VFIOGuestIOMMU *giommu;
|
||||||
|
bool found = false;
|
||||||
|
Int128 llend;
|
||||||
|
vfio_giommu_dirty_notifier gdn;
|
||||||
|
int idx;
|
||||||
|
|
||||||
QLIST_FOREACH(giommu, &bcontainer->giommu_list, giommu_next) {
|
QLIST_FOREACH(giommu, &bcontainer->giommu_list, giommu_next) {
|
||||||
if (MEMORY_REGION(giommu->iommu_mr) == section->mr &&
|
if (MEMORY_REGION(giommu->iommu_mr) == section->mr &&
|
||||||
giommu->n.start == section->offset_within_region) {
|
giommu->n.start == section->offset_within_region) {
|
||||||
Int128 llend;
|
found = true;
|
||||||
vfio_giommu_dirty_notifier gdn = { .giommu = giommu };
|
break;
|
||||||
int idx = memory_region_iommu_attrs_to_index(giommu->iommu_mr,
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
gdn.giommu = giommu;
|
||||||
|
idx = memory_region_iommu_attrs_to_index(giommu->iommu_mr,
|
||||||
MEMTXATTRS_UNSPECIFIED);
|
MEMTXATTRS_UNSPECIFIED);
|
||||||
|
|
||||||
llend = int128_add(int128_make64(section->offset_within_region),
|
llend = int128_add(int128_make64(section->offset_within_region),
|
||||||
section->size);
|
section->size);
|
||||||
llend = int128_sub(llend, int128_one());
|
llend = int128_sub(llend, int128_one());
|
||||||
|
|
||||||
iommu_notifier_init(&gdn.n,
|
iommu_notifier_init(&gdn.n, vfio_iommu_map_dirty_notify, IOMMU_NOTIFIER_MAP,
|
||||||
vfio_iommu_map_dirty_notify,
|
section->offset_within_region, int128_get64(llend),
|
||||||
IOMMU_NOTIFIER_MAP,
|
|
||||||
section->offset_within_region,
|
|
||||||
int128_get64(llend),
|
|
||||||
idx);
|
idx);
|
||||||
memory_region_iommu_replay(giommu->iommu_mr, &gdn.n);
|
memory_region_iommu_replay(giommu->iommu_mr, &gdn.n);
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int vfio_sync_dirty_bitmap(VFIOContainerBase *bcontainer,
|
||||||
|
MemoryRegionSection *section, Error **errp)
|
||||||
|
{
|
||||||
|
ram_addr_t ram_addr;
|
||||||
|
|
||||||
|
if (memory_region_is_iommu(section->mr)) {
|
||||||
|
return vfio_sync_iommu_dirty_bitmap(bcontainer, section);
|
||||||
} else if (memory_region_has_ram_discard_manager(section->mr)) {
|
} else if (memory_region_has_ram_discard_manager(section->mr)) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue