mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-26 07:27:39 +00:00
vfio: Add function to unmap VFIO region
This function will be used for migration region. Migration region is mmaped when migration starts and will be unmapped when migration is complete. Signed-off-by: Kirti Wankhede <kwankhede@nvidia.com> Reviewed-by: Neo Jia <cjia@nvidia.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
parent
700d20b49e
commit
0f7a903ba3
@ -924,6 +924,18 @@ int vfio_region_setup(Object *obj, VFIODevice *vbasedev, VFIORegion *region,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vfio_subregion_unmap(VFIORegion *region, int index)
|
||||
{
|
||||
trace_vfio_region_unmap(memory_region_name(®ion->mmaps[index].mem),
|
||||
region->mmaps[index].offset,
|
||||
region->mmaps[index].offset +
|
||||
region->mmaps[index].size - 1);
|
||||
memory_region_del_subregion(region->mem, ®ion->mmaps[index].mem);
|
||||
munmap(region->mmaps[index].mmap, region->mmaps[index].size);
|
||||
object_unparent(OBJECT(®ion->mmaps[index].mem));
|
||||
region->mmaps[index].mmap = NULL;
|
||||
}
|
||||
|
||||
int vfio_region_mmap(VFIORegion *region)
|
||||
{
|
||||
int i, prot = 0;
|
||||
@ -954,10 +966,7 @@ int vfio_region_mmap(VFIORegion *region)
|
||||
region->mmaps[i].mmap = NULL;
|
||||
|
||||
for (i--; i >= 0; i--) {
|
||||
memory_region_del_subregion(region->mem, ®ion->mmaps[i].mem);
|
||||
munmap(region->mmaps[i].mmap, region->mmaps[i].size);
|
||||
object_unparent(OBJECT(®ion->mmaps[i].mem));
|
||||
region->mmaps[i].mmap = NULL;
|
||||
vfio_subregion_unmap(region, i);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -982,6 +991,21 @@ int vfio_region_mmap(VFIORegion *region)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void vfio_region_unmap(VFIORegion *region)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!region->mem) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < region->nr_mmaps; i++) {
|
||||
if (region->mmaps[i].mmap) {
|
||||
vfio_subregion_unmap(region, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void vfio_region_exit(VFIORegion *region)
|
||||
{
|
||||
int i;
|
||||
|
@ -113,6 +113,7 @@ vfio_region_mmap(const char *name, unsigned long offset, unsigned long end) "Reg
|
||||
vfio_region_exit(const char *name, int index) "Device %s, region %d"
|
||||
vfio_region_finalize(const char *name, int index) "Device %s, region %d"
|
||||
vfio_region_mmaps_set_enabled(const char *name, bool enabled) "Region %s mmaps enabled: %d"
|
||||
vfio_region_unmap(const char *name, unsigned long offset, unsigned long end) "Region %s unmap [0x%lx - 0x%lx]"
|
||||
vfio_region_sparse_mmap_header(const char *name, int index, int nr_areas) "Device %s region %d: %d sparse mmap entries"
|
||||
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/%0x8"
|
||||
|
@ -171,6 +171,7 @@ int vfio_region_setup(Object *obj, VFIODevice *vbasedev, VFIORegion *region,
|
||||
int index, const char *name);
|
||||
int vfio_region_mmap(VFIORegion *region);
|
||||
void vfio_region_mmaps_set_enabled(VFIORegion *region, bool enabled);
|
||||
void vfio_region_unmap(VFIORegion *region);
|
||||
void vfio_region_exit(VFIORegion *region);
|
||||
void vfio_region_finalize(VFIORegion *region);
|
||||
void vfio_reset_handler(void *opaque);
|
||||
|
Loading…
x
Reference in New Issue
Block a user