From: Claudio Imbrenda <imbrenda@linux.ibm.com>
To: kvm@vger.kernel.org, pbonzini@redhat.com
Cc: frankja@linux.ibm.com, david@redhat.com, thuth@redhat.com,
cohuck@redhat.com, lvivier@redhat.com
Subject: [kvm-unit-tests RFC v1 3/5] lib/alloc: simplify free and malloc
Date: Fri, 14 Aug 2020 17:10:07 +0200 [thread overview]
Message-ID: <20200814151009.55845-4-imbrenda@linux.ibm.com> (raw)
In-Reply-To: <20200814151009.55845-1-imbrenda@linux.ibm.com>
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>
---
lib/alloc.h | 2 +-
lib/alloc_page.h | 6 +++---
lib/alloc.c | 42 +++++-------------------------------------
lib/alloc_page.c | 2 +-
lib/s390x/smp.c | 4 ++--
lib/vmalloc.c | 2 +-
s390x/smp.c | 4 ++--
7 files changed, 15 insertions(+), 47 deletions(-)
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.h b/lib/alloc_page.h
index 6472abd..26caefe 100644
--- a/lib/alloc_page.h
+++ b/lib/alloc_page.h
@@ -62,18 +62,18 @@ void *alloc_pages(unsigned int order);
* 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/alloc.c b/lib/alloc.c
index 9d89d24..a46f464 100644
--- a/lib/alloc.c
+++ b/lib/alloc.c
@@ -50,56 +50,24 @@ void *calloc(size_t nmemb, size_t size)
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_page.c b/lib/alloc_page.c
index 7c91f91..0e720ad 100644
--- a/lib/alloc_page.c
+++ b/lib/alloc_page.c
@@ -260,7 +260,7 @@ static void _free_pages(void *mem)
} 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/s390x/smp.c b/lib/s390x/smp.c
index d954094..1bee8a9 100644
--- a/lib/s390x/smp.c
+++ b/lib/s390x/smp.c
@@ -163,8 +163,8 @@ int smp_cpu_destroy(uint16_t addr)
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 f72c5b3..55b7a74 100644
--- a/lib/vmalloc.c
+++ b/lib/vmalloc.c
@@ -159,7 +159,7 @@ static void *vm_memalign(size_t alignment, size_t size)
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 @@ static void test_store_status(void)
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 @@ static void test_reset_initial(void)
report_prefix_pop();
report(smp_cpu_stopped(1), "cpu stopped");
- free_pages(status, PAGE_SIZE);
+ free_pages(status);
report_prefix_pop();
}
--
2.26.2
next prev parent reply other threads:[~2020-08-14 15:10 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-14 15:10 [kvm-unit-tests RFC v1 0/5] Rewrite the allocators Claudio Imbrenda
2020-08-14 15:10 ` [kvm-unit-tests RFC v1 1/5] lib/vmalloc: vmalloc support for handling allocation metadata Claudio Imbrenda
2020-08-19 14:36 ` Janosch Frank
2020-08-19 15:31 ` Claudio Imbrenda
2020-08-19 15:36 ` Janosch Frank
2020-08-14 15:10 ` [kvm-unit-tests RFC v1 2/5] lib/alloc_page: complete rewrite of the page allocator Claudio Imbrenda
2020-08-18 16:06 ` Cornelia Huck
2020-08-19 15:44 ` Janosch Frank
2020-08-19 16:46 ` Claudio Imbrenda
2020-08-14 15:10 ` Claudio Imbrenda [this message]
2020-08-14 15:10 ` [kvm-unit-tests RFC v1 4/5] lib/alloc.h: remove align_min from struct alloc_ops Claudio Imbrenda
2020-08-14 15:10 ` [kvm-unit-tests RFC v1 5/5] lib/alloc_page: allow reserving arbitrary memory ranges Claudio Imbrenda
2020-08-17 16:44 ` [kvm-unit-tests RFC v1 0/5] Rewrite the allocators Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200814151009.55845-4-imbrenda@linux.ibm.com \
--to=imbrenda@linux.ibm.com \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=frankja@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=lvivier@redhat.com \
--cc=pbonzini@redhat.com \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox