lib/alloc: simplify free and malloc
Remove the size parameter from the various free functions
Since the backends can handle the allocation sizes on their own,
simplify the generic malloc wrappers.
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Message-Id: <20201002154420.292134-6-imbrenda@linux.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
diff --git a/lib/alloc.c b/lib/alloc.c
index 9d89d24..a46f464 100644
--- a/lib/alloc.c
+++ b/lib/alloc.c
@@ -50,56 +50,24 @@
return ptr;
}
-#define METADATA_EXTRA (2 * sizeof(uintptr_t))
-#define OFS_SLACK (-2 * sizeof(uintptr_t))
-#define OFS_SIZE (-sizeof(uintptr_t))
-
-static inline void *block_begin(void *mem)
-{
- uintptr_t slack = *(uintptr_t *)(mem + OFS_SLACK);
- return mem - slack;
-}
-
-static inline uintptr_t block_size(void *mem)
-{
- return *(uintptr_t *)(mem + OFS_SIZE);
-}
-
void free(void *ptr)
{
- if (!alloc_ops->free)
- return;
-
- void *base = block_begin(ptr);
- uintptr_t sz = block_size(ptr);
-
- alloc_ops->free(base, sz);
+ if (alloc_ops->free)
+ alloc_ops->free(ptr);
}
void *memalign(size_t alignment, size_t size)
{
void *p;
- uintptr_t blkalign;
- uintptr_t mem;
if (!size)
return NULL;
- assert(alignment >= sizeof(void *) && is_power_of_2(alignment));
+ assert(is_power_of_2(alignment));
assert(alloc_ops && alloc_ops->memalign);
- size += alignment - 1;
- blkalign = MAX(alignment, alloc_ops->align_min);
- size = ALIGN(size + METADATA_EXTRA, alloc_ops->align_min);
- p = alloc_ops->memalign(blkalign, size);
+ p = alloc_ops->memalign(alignment, size);
assert(p);
- /* Leave room for metadata before aligning the result. */
- mem = (uintptr_t)p + METADATA_EXTRA;
- mem = ALIGN(mem, alignment);
-
- /* Write the metadata */
- *(uintptr_t *)(mem + OFS_SLACK) = mem - (uintptr_t)p;
- *(uintptr_t *)(mem + OFS_SIZE) = size;
- return (void *)mem;
+ return (void *)p;
}
diff --git a/lib/alloc.h b/lib/alloc.h
index c44d459..9b4b634 100644
--- a/lib/alloc.h
+++ b/lib/alloc.h
@@ -24,7 +24,7 @@
struct alloc_ops {
void *(*memalign)(size_t alignment, size_t size);
- void (*free)(void *ptr, size_t size);
+ void (*free)(void *ptr);
size_t align_min;
};
diff --git a/lib/alloc_page.c b/lib/alloc_page.c
index 29d221f..046082a 100644
--- a/lib/alloc_page.c
+++ b/lib/alloc_page.c
@@ -255,7 +255,7 @@
} while (coalesce(a, order, pfn, pfn2));
}
-void free_pages(void *mem, size_t size)
+void free_pages(void *mem)
{
spin_lock(&lock);
_free_pages(mem);
diff --git a/lib/alloc_page.h b/lib/alloc_page.h
index 81847ae..6c23018 100644
--- a/lib/alloc_page.h
+++ b/lib/alloc_page.h
@@ -61,18 +61,18 @@
* alloc_pages* functions.
* The pointer must point to the start of the block.
*/
-void free_pages(void *mem, size_t size);
+void free_pages(void *mem);
/* For backwards compatibility */
static inline void free_page(void *mem)
{
- return free_pages(mem, 1);
+ return free_pages(mem);
}
/* For backwards compatibility */
static inline void free_pages_by_order(void *mem, unsigned int order)
{
- free_pages(mem, 1ull << order);
+ free_pages(mem);
}
#endif
diff --git a/lib/s390x/smp.c b/lib/s390x/smp.c
index ea93329..77d80ca 100644
--- a/lib/s390x/smp.c
+++ b/lib/s390x/smp.c
@@ -163,8 +163,8 @@
rc = smp_cpu_stop_nolock(addr, false);
if (!rc) {
cpu = smp_cpu_from_addr(addr);
- free_pages(cpu->lowcore, 2 * PAGE_SIZE);
- free_pages(cpu->stack, 4 * PAGE_SIZE);
+ free_pages(cpu->lowcore);
+ free_pages(cpu->stack);
cpu->lowcore = (void *)-1UL;
cpu->stack = (void *)-1UL;
}
diff --git a/lib/vmalloc.c b/lib/vmalloc.c
index 3aec5ac..986a34c 100644
--- a/lib/vmalloc.c
+++ b/lib/vmalloc.c
@@ -159,7 +159,7 @@
return mem;
}
-static void vm_free(void *mem, size_t size)
+static void vm_free(void *mem)
{
struct metadata *m;
uintptr_t ptr, end;
diff --git a/s390x/smp.c b/s390x/smp.c
index ad30e3c..4ca1dce 100644
--- a/s390x/smp.c
+++ b/s390x/smp.c
@@ -143,7 +143,7 @@
sigp(1, SIGP_STORE_STATUS_AT_ADDRESS, (uintptr_t)status, NULL);
while (!status->prefix) { mb(); }
report(1, "status written");
- free_pages(status, PAGE_SIZE * 2);
+ free_pages(status);
report_prefix_pop();
smp_cpu_stop(1);
@@ -276,7 +276,7 @@
report_prefix_pop();
report(smp_cpu_stopped(1), "cpu stopped");
- free_pages(status, PAGE_SIZE);
+ free_pages(status);
report_prefix_pop();
}