|
@@ -292,7 +292,7 @@ static bool vfio_get_xlat_addr(IOMMUTLBEntry *iotlb, void **vaddr,
|
|
|
static void vfio_iommu_map_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb)
|
|
|
{
|
|
|
VFIOGuestIOMMU *giommu = container_of(n, VFIOGuestIOMMU, n);
|
|
|
- VFIOContainerBase *bcontainer = &giommu->container->bcontainer;
|
|
|
+ VFIOContainerBase *bcontainer = giommu->bcontainer;
|
|
|
hwaddr iova = iotlb->iova + giommu->iommu_offset;
|
|
|
void *vaddr;
|
|
|
int ret;
|
|
@@ -569,6 +569,7 @@ static void vfio_listener_region_add(MemoryListener *listener,
|
|
|
MemoryRegionSection *section)
|
|
|
{
|
|
|
VFIOContainer *container = container_of(listener, VFIOContainer, listener);
|
|
|
+ VFIOContainerBase *bcontainer = &container->bcontainer;
|
|
|
hwaddr iova, end;
|
|
|
Int128 llend, llsize;
|
|
|
void *vaddr;
|
|
@@ -612,7 +613,7 @@ static void vfio_listener_region_add(MemoryListener *listener,
|
|
|
giommu->iommu_mr = iommu_mr;
|
|
|
giommu->iommu_offset = section->offset_within_address_space -
|
|
|
section->offset_within_region;
|
|
|
- giommu->container = container;
|
|
|
+ giommu->bcontainer = bcontainer;
|
|
|
llend = int128_add(int128_make64(section->offset_within_region),
|
|
|
section->size);
|
|
|
llend = int128_sub(llend, int128_one());
|
|
@@ -647,7 +648,7 @@ static void vfio_listener_region_add(MemoryListener *listener,
|
|
|
g_free(giommu);
|
|
|
goto fail;
|
|
|
}
|
|
|
- QLIST_INSERT_HEAD(&container->giommu_list, giommu, giommu_next);
|
|
|
+ QLIST_INSERT_HEAD(&bcontainer->giommu_list, giommu, giommu_next);
|
|
|
memory_region_iommu_replay(giommu->iommu_mr, &giommu->n);
|
|
|
|
|
|
return;
|
|
@@ -732,6 +733,7 @@ static void vfio_listener_region_del(MemoryListener *listener,
|
|
|
MemoryRegionSection *section)
|
|
|
{
|
|
|
VFIOContainer *container = container_of(listener, VFIOContainer, listener);
|
|
|
+ VFIOContainerBase *bcontainer = &container->bcontainer;
|
|
|
hwaddr iova, end;
|
|
|
Int128 llend, llsize;
|
|
|
int ret;
|
|
@@ -744,7 +746,7 @@ static void vfio_listener_region_del(MemoryListener *listener,
|
|
|
if (memory_region_is_iommu(section->mr)) {
|
|
|
VFIOGuestIOMMU *giommu;
|
|
|
|
|
|
- QLIST_FOREACH(giommu, &container->giommu_list, giommu_next) {
|
|
|
+ QLIST_FOREACH(giommu, &bcontainer->giommu_list, giommu_next) {
|
|
|
if (MEMORY_REGION(giommu->iommu_mr) == section->mr &&
|
|
|
giommu->n.start == section->offset_within_region) {
|
|
|
memory_region_unregister_iommu_notifier(section->mr,
|
|
@@ -1206,7 +1208,9 @@ static void vfio_iommu_map_dirty_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb)
|
|
|
vfio_giommu_dirty_notifier *gdn = container_of(n,
|
|
|
vfio_giommu_dirty_notifier, n);
|
|
|
VFIOGuestIOMMU *giommu = gdn->giommu;
|
|
|
- VFIOContainer *container = giommu->container;
|
|
|
+ VFIOContainerBase *bcontainer = giommu->bcontainer;
|
|
|
+ VFIOContainer *container = container_of(bcontainer, VFIOContainer,
|
|
|
+ bcontainer);
|
|
|
hwaddr iova = iotlb->iova + giommu->iommu_offset;
|
|
|
ram_addr_t translated_addr;
|
|
|
int ret = -EINVAL;
|
|
@@ -1284,12 +1288,13 @@ static int vfio_sync_ram_discard_listener_dirty_bitmap(VFIOContainer *container,
|
|
|
static int vfio_sync_dirty_bitmap(VFIOContainer *container,
|
|
|
MemoryRegionSection *section)
|
|
|
{
|
|
|
+ VFIOContainerBase *bcontainer = &container->bcontainer;
|
|
|
ram_addr_t ram_addr;
|
|
|
|
|
|
if (memory_region_is_iommu(section->mr)) {
|
|
|
VFIOGuestIOMMU *giommu;
|
|
|
|
|
|
- QLIST_FOREACH(giommu, &container->giommu_list, giommu_next) {
|
|
|
+ QLIST_FOREACH(giommu, &bcontainer->giommu_list, giommu_next) {
|
|
|
if (MEMORY_REGION(giommu->iommu_mr) == section->mr &&
|
|
|
giommu->n.start == section->offset_within_region) {
|
|
|
Int128 llend;
|