[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v1 12/13] util: oslib: Resizable anonymous allocations under POSI
From: |
David Hildenbrand |
Subject: |
[PATCH v1 12/13] util: oslib: Resizable anonymous allocations under POSIX |
Date: |
Mon, 3 Feb 2020 19:31:24 +0100 |
Introduce qemu_anon_ram_alloc_resizable() and qemu_anon_ram_resize().
Implement them under POSIX and make them return NULL under WIN32.
Under POSIX, we make use of resizable 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 resizable
anonymous allocations.
Cc: Richard Henderson <address@hidden>
Cc: Paolo Bonzini <address@hidden>
Cc: "Dr. David Alan Gilbert" <address@hidden>
Cc: Eduardo Habkost <address@hidden>
Cc: Marcel Apfelbaum <address@hidden>
Cc: Stefan Weil <address@hidden>
Signed-off-by: David Hildenbrand <address@hidden>
---
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..57b7f40f56 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_resizable(size_t size, size_t max_size,
+ uint64_t *align, bool shared);
+void *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 5a291cc982..e487a0e2c2 100644
--- a/util/oslib-posix.c
+++ b/util/oslib-posix.c
@@ -219,16 +219,47 @@ void *qemu_anon_ram_alloc(size_t size, uint64_t
*alignment, bool shared)
return ptr;
}
+void *qemu_anon_ram_alloc_resizable(size_t size, size_t max_size,
+ uint64_t *alignment, bool shared)
+{
+ size_t align = QEMU_VMALLOC_ALIGN;
+ void *ptr = qemu_ram_mmap_resizable(-1, size, max_size, align, shared,
+ false);
+
+ if (ptr == MAP_FAILED) {
+ return NULL;
+ }
+
+ if (alignment) {
+ *alignment = align;
+ }
+
+ trace_qemu_anon_ram_alloc_resizable(size, max_size, ptr);
+ return ptr;
+}
+
+void *qemu_anon_ram_resize(void *ptr, size_t old_size, size_t new_size,
+ bool shared)
+{
+ ptr = qemu_ram_mmap_resize(ptr, -1, old_size, new_size, shared, false);
+ if (ptr == MAP_FAILED) {
+ return NULL;
+ }
+
+ trace_qemu_anon_ram_resize(old_size, new_size, ptr);
+ return ptr;
+}
+
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..caec028041 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_resizable(size_t size, size_t max_size,
+ uint64_t *align, bool shared)
+{
+ /* resizable ram not implemented yet */
+ return NULL;
+}
+
+void *qemu_anon_ram_resize(void *ptr, size_t old_size, size_t new_size,
+ bool shared)
+{
+ /* resizable ram not implemented yet */
+ return NULL;
+}
+
void qemu_vfree(void *ptr)
{
trace_qemu_vfree(ptr);
diff --git a/util/trace-events b/util/trace-events
index 226f406c46..05ec1eb9f3 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_resizable(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"
--
2.24.1
[PATCH v1 11/13] util: vfio-helpers: Implement ram_block_resized(), David Hildenbrand, 2020/02/03
[PATCH v1 12/13] util: oslib: Resizable anonymous allocations under POSIX,
David Hildenbrand <=
[PATCH v1 06/13] util/mmap-alloc: Factor out reserving of a memory region to mmap_reserve(), David Hildenbrand, 2020/02/03
[PATCH v1 13/13] exec: Ram blocks with resizable anonymous allocations under POSIX, David Hildenbrand, 2020/02/03
Re: [PATCH v1 00/13] Ram blocks with resizable anonymous allocations under POSIX, Michael S. Tsirkin, 2020/02/06
Re: [PATCH v1 00/13] Ram blocks with resizable anonymous allocations under POSIX, Dr. David Alan Gilbert, 2020/02/06