mirror of https://github.com/xemu-project/xemu.git
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;
|
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 vfio_region_mmap(VFIORegion *region)
|
||||||
{
|
{
|
||||||
int i, prot = 0;
|
int i, prot = 0;
|
||||||
|
@ -954,10 +966,7 @@ int vfio_region_mmap(VFIORegion *region)
|
||||||
region->mmaps[i].mmap = NULL;
|
region->mmaps[i].mmap = NULL;
|
||||||
|
|
||||||
for (i--; i >= 0; i--) {
|
for (i--; i >= 0; i--) {
|
||||||
memory_region_del_subregion(region->mem, ®ion->mmaps[i].mem);
|
vfio_subregion_unmap(region, i);
|
||||||
munmap(region->mmaps[i].mmap, region->mmaps[i].size);
|
|
||||||
object_unparent(OBJECT(®ion->mmaps[i].mem));
|
|
||||||
region->mmaps[i].mmap = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -982,6 +991,21 @@ int vfio_region_mmap(VFIORegion *region)
|
||||||
return 0;
|
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)
|
void vfio_region_exit(VFIORegion *region)
|
||||||
{
|
{
|
||||||
int i;
|
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_exit(const char *name, int index) "Device %s, region %d"
|
||||||
vfio_region_finalize(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_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_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_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"
|
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 index, const char *name);
|
||||||
int vfio_region_mmap(VFIORegion *region);
|
int vfio_region_mmap(VFIORegion *region);
|
||||||
void vfio_region_mmaps_set_enabled(VFIORegion *region, bool enabled);
|
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_exit(VFIORegion *region);
|
||||||
void vfio_region_finalize(VFIORegion *region);
|
void vfio_region_finalize(VFIORegion *region);
|
||||||
void vfio_reset_handler(void *opaque);
|
void vfio_reset_handler(void *opaque);
|
||||||
|
|
Loading…
Reference in New Issue