Message ID | 1588632293-18932-3-git-send-email-kwankhede@nvidia.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add migration support for VFIO devices | expand |
Hi Kirti, On 5/5/20 12:44 AM, Kirti Wankhede wrote: > 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> > --- > hw/vfio/common.c | 20 ++++++++++++++++++++ > hw/vfio/trace-events | 1 + > include/hw/vfio/vfio-common.h | 1 + > 3 files changed, 22 insertions(+) > > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index 0b3593b3c0c4..4a2f0d6a2233 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -983,6 +983,26 @@ 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++) { I'd refactor this block <... > + trace_vfio_region_unmap(memory_region_name(®ion->mmaps[i].mem), > + region->mmaps[i].offset, > + region->mmaps[i].offset + > + region->mmaps[i].size - 1); > + 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; ...> into a helper and reuse it in vfio_region_mmap(). Well, actually I'd factor it out from vfio_region_mmap() then reuse it here. Anyway this is v18 so can be done later on top. Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> > + } > +} > + > void vfio_region_exit(VFIORegion *region) > { > int i; > diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events > index b1ef55a33ffd..8cdc27946cb8 100644 > --- a/hw/vfio/trace-events > +++ b/hw/vfio/trace-events > @@ -111,6 +111,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" > diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h > index fd564209ac71..8d7a0fbb1046 100644 > --- a/include/hw/vfio/vfio-common.h > +++ b/include/hw/vfio/vfio-common.h > @@ -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); >
On 5/5/2020 11:46 AM, Philippe Mathieu-Daudé wrote: > Hi Kirti, > > On 5/5/20 12:44 AM, Kirti Wankhede wrote: >> 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> >> --- >> hw/vfio/common.c | 20 ++++++++++++++++++++ >> hw/vfio/trace-events | 1 + >> include/hw/vfio/vfio-common.h | 1 + >> 3 files changed, 22 insertions(+) >> >> diff --git a/hw/vfio/common.c b/hw/vfio/common.c >> index 0b3593b3c0c4..4a2f0d6a2233 100644 >> --- a/hw/vfio/common.c >> +++ b/hw/vfio/common.c >> @@ -983,6 +983,26 @@ 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++) { > > I'd refactor this block <... >> + >> trace_vfio_region_unmap(memory_region_name(®ion->mmaps[i].mem), >> + region->mmaps[i].offset, >> + region->mmaps[i].offset + >> + region->mmaps[i].size - 1); >> + 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; > > ...> into a helper and reuse it in vfio_region_mmap(). Well, actually > I'd factor it out from vfio_region_mmap() then reuse it here. Anyway > this is v18 so can be done later on top. > Nevermind, this is not the last version, I'll do suggested change. > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> > Thanks, Kirti >> + } >> +} >> + >> void vfio_region_exit(VFIORegion *region) >> { >> int i; >> diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events >> index b1ef55a33ffd..8cdc27946cb8 100644 >> --- a/hw/vfio/trace-events >> +++ b/hw/vfio/trace-events >> @@ -111,6 +111,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" >> diff --git a/include/hw/vfio/vfio-common.h >> b/include/hw/vfio/vfio-common.h >> index fd564209ac71..8d7a0fbb1046 100644 >> --- a/include/hw/vfio/vfio-common.h >> +++ b/include/hw/vfio/vfio-common.h >> @@ -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); >> >
diff --git a/hw/vfio/common.c b/hw/vfio/common.c index 0b3593b3c0c4..4a2f0d6a2233 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -983,6 +983,26 @@ 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++) { + trace_vfio_region_unmap(memory_region_name(®ion->mmaps[i].mem), + region->mmaps[i].offset, + region->mmaps[i].offset + + region->mmaps[i].size - 1); + 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; + } +} + void vfio_region_exit(VFIORegion *region) { int i; diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events index b1ef55a33ffd..8cdc27946cb8 100644 --- a/hw/vfio/trace-events +++ b/hw/vfio/trace-events @@ -111,6 +111,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" diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index fd564209ac71..8d7a0fbb1046 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -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);