Message ID | 20200305142945.216465-14-david@redhat.com |
---|---|
State | New |
Headers | show |
Series | Ram blocks with resizeable anonymous allocations under POSIX | expand |
On Thursday, March 5, 2020 11:29:43 AM -03 David Hildenbrand wrote: > Introduce qemu_anon_ram_alloc_resizeable() and qemu_anon_ram_resize(). > Implement them under POSIX and make them return NULL under WIN32. > > Under POSIX, we make use of resizeable mmaps. An implementation under > WIN32 is theoretically possible AFAIK and can be added later. > > In qemu_anon_ram_free(), rename the size parameter to max_size, to make > it clearer that we have to use the maximum size when freeing resizeable > anonymous allocations. > > Reviewed-by: Peter Xu <peterx@redhat.com> > Cc: Richard Henderson <rth@twiddle.net> > Cc: Paolo Bonzini <pbonzini@redhat.com> > Cc: "Dr. David Alan Gilbert" <dgilbert@redhat.com> > Cc: Eduardo Habkost <ehabkost@redhat.com> > Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> > Cc: Stefan Weil <sw@weilnetz.de> > Cc: Igor Mammedov <imammedo@redhat.com> > Signed-off-by: David Hildenbrand <david@redhat.com> > --- Acked-by: Murilo Opsfelder Araujo <muriloo@linux.ibm.com> > include/qemu/osdep.h | 6 +++++- > util/oslib-posix.c | 37 ++++++++++++++++++++++++++++++++++--- > util/oslib-win32.c | 14 ++++++++++++++ > util/trace-events | 4 +++- > 4 files changed, 56 insertions(+), 5 deletions(-) > > diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h > index 9bd3dcfd13..a1ea9e043d 100644 > --- a/include/qemu/osdep.h > +++ b/include/qemu/osdep.h > @@ -311,8 +311,12 @@ int qemu_daemon(int nochdir, int noclose); > void *qemu_try_memalign(size_t alignment, size_t size); > void *qemu_memalign(size_t alignment, size_t size); > void *qemu_anon_ram_alloc(size_t size, uint64_t *align, bool shared); > +void *qemu_anon_ram_alloc_resizeable(size_t size, size_t max_size, > + uint64_t *align, bool shared); > +bool qemu_anon_ram_resize(void *ptr, size_t old_size, size_t new_size, > + bool shared); > void qemu_vfree(void *ptr); > -void qemu_anon_ram_free(void *ptr, size_t size); > +void qemu_anon_ram_free(void *ptr, size_t max_size); > > #define QEMU_MADV_INVALID -1 > > diff --git a/util/oslib-posix.c b/util/oslib-posix.c > index 897e8f3ba6..34b1ce74b7 100644 > --- a/util/oslib-posix.c > +++ b/util/oslib-posix.c > @@ -223,16 +223,47 @@ void *qemu_anon_ram_alloc(size_t size, uint64_t > *alignment, bool shared) return ptr; > } > > +void *qemu_anon_ram_alloc_resizeable(size_t size, size_t max_size, > + uint64_t *alignment, bool shared) > +{ > + size_t align = QEMU_VMALLOC_ALIGN; > + void *ptr = qemu_ram_mmap_resizeable(-1, size, max_size, align, shared, > + false); > + > + if (ptr == MAP_FAILED) { > + return NULL; > + } > + > + if (alignment) { > + *alignment = align; > + } > + > + trace_qemu_anon_ram_alloc_resizeable(size, max_size, ptr); > + return ptr; > +} > + > +bool qemu_anon_ram_resize(void *ptr, size_t old_size, size_t new_size, > + bool shared) > +{ > + bool resized = qemu_ram_mmap_resize(ptr, -1, old_size, new_size, > shared, + false); > + > + if (resized) { > + trace_qemu_anon_ram_resize(old_size, new_size, ptr); > + } > + return resized; > +} > + > void qemu_vfree(void *ptr) > { > trace_qemu_vfree(ptr); > free(ptr); > } > > -void qemu_anon_ram_free(void *ptr, size_t size) > +void qemu_anon_ram_free(void *ptr, size_t max_size) > { > - trace_qemu_anon_ram_free(ptr, size); > - qemu_ram_munmap(-1, ptr, size); > + trace_qemu_anon_ram_free(ptr, max_size); > + qemu_ram_munmap(-1, ptr, max_size); > } > > void qemu_set_block(int fd) > diff --git a/util/oslib-win32.c b/util/oslib-win32.c > index e9b14ab178..c034fdfe01 100644 > --- a/util/oslib-win32.c > +++ b/util/oslib-win32.c > @@ -90,6 +90,20 @@ void *qemu_anon_ram_alloc(size_t size, uint64_t *align, > bool shared) return ptr; > } > > +void *qemu_anon_ram_alloc_resizeable(size_t size, size_t max_size, > + uint64_t *align, bool shared) > +{ > + /* resizeable ram not implemented yet */ > + return NULL; > +} > + > +bool qemu_anon_ram_resize(void *ptr, size_t old_size, size_t new_size, > + bool shared) > +{ > + /* resizeable ram not implemented yet */ > + return false; > +} > + > void qemu_vfree(void *ptr) > { > trace_qemu_vfree(ptr); > diff --git a/util/trace-events b/util/trace-events > index a4d39eca5e..24a6f1a1e1 100644 > --- a/util/trace-events > +++ b/util/trace-events > @@ -46,8 +46,10 @@ qemu_co_mutex_unlock_return(void *mutex, void *self) > "mutex %p self %p" # oslib-posix.c > qemu_memalign(size_t alignment, size_t size, void *ptr) "alignment %zu size > %zu ptr %p" qemu_anon_ram_alloc(size_t size, void *ptr) "size %zu ptr %p" > +qemu_anon_ram_alloc_resizeable(size_t size, size_t max_size, void *ptr) > "size %zu max_size %zu ptr %p" +qemu_anon_ram_resize(size_t old_size, > size_t new_size, void *ptr) "old_size %zu new_size %zu ptr %p" > qemu_vfree(void *ptr) "ptr %p" > -qemu_anon_ram_free(void *ptr, size_t size) "ptr %p size %zu" > +qemu_anon_ram_free(void *ptr, size_t max_size) "ptr %p max_size %zu" > > # hbitmap.c > hbitmap_iter_skip_words(const void *hb, void *hbi, uint64_t pos, unsigned > long cur) "hb %p hbi %p pos %"PRId64" cur 0x%lx" -- Murilo
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h index 9bd3dcfd13..a1ea9e043d 100644 --- a/include/qemu/osdep.h +++ b/include/qemu/osdep.h @@ -311,8 +311,12 @@ int qemu_daemon(int nochdir, int noclose); void *qemu_try_memalign(size_t alignment, size_t size); void *qemu_memalign(size_t alignment, size_t size); void *qemu_anon_ram_alloc(size_t size, uint64_t *align, bool shared); +void *qemu_anon_ram_alloc_resizeable(size_t size, size_t max_size, + uint64_t *align, bool shared); +bool qemu_anon_ram_resize(void *ptr, size_t old_size, size_t new_size, + bool shared); void qemu_vfree(void *ptr); -void qemu_anon_ram_free(void *ptr, size_t size); +void qemu_anon_ram_free(void *ptr, size_t max_size); #define QEMU_MADV_INVALID -1 diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 897e8f3ba6..34b1ce74b7 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -223,16 +223,47 @@ void *qemu_anon_ram_alloc(size_t size, uint64_t *alignment, bool shared) return ptr; } +void *qemu_anon_ram_alloc_resizeable(size_t size, size_t max_size, + uint64_t *alignment, bool shared) +{ + size_t align = QEMU_VMALLOC_ALIGN; + void *ptr = qemu_ram_mmap_resizeable(-1, size, max_size, align, shared, + false); + + if (ptr == MAP_FAILED) { + return NULL; + } + + if (alignment) { + *alignment = align; + } + + trace_qemu_anon_ram_alloc_resizeable(size, max_size, ptr); + return ptr; +} + +bool qemu_anon_ram_resize(void *ptr, size_t old_size, size_t new_size, + bool shared) +{ + bool resized = qemu_ram_mmap_resize(ptr, -1, old_size, new_size, shared, + false); + + if (resized) { + trace_qemu_anon_ram_resize(old_size, new_size, ptr); + } + return resized; +} + void qemu_vfree(void *ptr) { trace_qemu_vfree(ptr); free(ptr); } -void qemu_anon_ram_free(void *ptr, size_t size) +void qemu_anon_ram_free(void *ptr, size_t max_size) { - trace_qemu_anon_ram_free(ptr, size); - qemu_ram_munmap(-1, ptr, size); + trace_qemu_anon_ram_free(ptr, max_size); + qemu_ram_munmap(-1, ptr, max_size); } void qemu_set_block(int fd) diff --git a/util/oslib-win32.c b/util/oslib-win32.c index e9b14ab178..c034fdfe01 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -90,6 +90,20 @@ void *qemu_anon_ram_alloc(size_t size, uint64_t *align, bool shared) return ptr; } +void *qemu_anon_ram_alloc_resizeable(size_t size, size_t max_size, + uint64_t *align, bool shared) +{ + /* resizeable ram not implemented yet */ + return NULL; +} + +bool qemu_anon_ram_resize(void *ptr, size_t old_size, size_t new_size, + bool shared) +{ + /* resizeable ram not implemented yet */ + return false; +} + void qemu_vfree(void *ptr) { trace_qemu_vfree(ptr); diff --git a/util/trace-events b/util/trace-events index a4d39eca5e..24a6f1a1e1 100644 --- a/util/trace-events +++ b/util/trace-events @@ -46,8 +46,10 @@ qemu_co_mutex_unlock_return(void *mutex, void *self) "mutex %p self %p" # oslib-posix.c qemu_memalign(size_t alignment, size_t size, void *ptr) "alignment %zu size %zu ptr %p" qemu_anon_ram_alloc(size_t size, void *ptr) "size %zu ptr %p" +qemu_anon_ram_alloc_resizeable(size_t size, size_t max_size, void *ptr) "size %zu max_size %zu ptr %p" +qemu_anon_ram_resize(size_t old_size, size_t new_size, void *ptr) "old_size %zu new_size %zu ptr %p" qemu_vfree(void *ptr) "ptr %p" -qemu_anon_ram_free(void *ptr, size_t size) "ptr %p size %zu" +qemu_anon_ram_free(void *ptr, size_t max_size) "ptr %p max_size %zu" # hbitmap.c hbitmap_iter_skip_words(const void *hb, void *hbi, uint64_t pos, unsigned long cur) "hb %p hbi %p pos %"PRId64" cur 0x%lx"