From 160d49709ecb63bf119186c1c1eeb5100a9fbea1 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Tue, 28 Nov 2023 11:24:17 +0100 Subject: [PATCH] util/mem: move alloc helper to util section Move the alloc helpers to its own header file so that we avoid an include header recursion when defining auto cleanup helpers. Signed-off-by: Daniel Wagner --- nvme.c | 94 ------------------------------------------ nvme.h | 3 +- util/mem.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++ util/mem.h | 14 +++++++ util/meson.build | 1 + 5 files changed, 119 insertions(+), 96 deletions(-) create mode 100644 util/mem.c create mode 100644 util/mem.h diff --git a/nvme.c b/nvme.c index faf7e23e..40277660 100644 --- a/nvme.c +++ b/nvme.c @@ -193,100 +193,6 @@ static char *output_format_val = "normal"; static void *mmap_registers(nvme_root_t r, struct nvme_dev *dev); -#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) - -static void *nvme_alloc(size_t len) -{ - size_t _len = ROUND_UP(len, 0x1000); - void *p; - - if (posix_memalign((void *)&p, getpagesize(), _len)) - return NULL; - - memset(p, 0, _len); - return p; -} - -void *nvme_realloc(void *p, size_t len) -{ - size_t old_len = malloc_usable_size(p); - - void *result = nvme_alloc(len); - - if (p) { - memcpy(result, p, min(old_len, len)); - free(p); - } - - return result; -} - -static void *__nvme_alloc_huge(size_t len, bool *huge) -{ - void *p; - - if (!posix_memalign(&p, getpagesize(), len)) { - *huge = false; - memset(p, 0, len); - return p; - } - return NULL; -} - -#define HUGE_MIN 0x80000 - -#ifdef CONFIG_LIBHUGETLBFS -void nvme_free_huge(void *p, bool huge) -{ - if (huge) { - if (p) - free_hugepage_region(p); - } else { - free(p); - } -} - -void *nvme_alloc_huge(size_t len, bool *huge) -{ - void *p; - - if (len < HUGE_MIN) - return __nvme_alloc_huge(len, huge); - - p = get_hugepage_region(len, GHR_DEFAULT); - if (!p) - return __nvme_alloc_huge(len, huge); - - *huge = true; - return p; -} -#else -void nvme_free_huge(void *p, bool huge) -{ - free(p); -} - -void *nvme_alloc_huge(size_t len, bool *huge) -{ - return __nvme_alloc_huge(len, huge); -} -#endif - -void *nvme_realloc_huge(void *p, size_t len, bool *huge) -{ - size_t old_len = malloc_usable_size(p); - bool was_huge = *huge; - - void *result = nvme_alloc_huge(len, huge); - - if (p) { - memcpy(result, p, min(old_len, len)); - nvme_free_huge(p, was_huge); - } - - return result; -} - const char *nvme_strerror(int errnum) { if (errnum >= ENVME_CONNECT_RESOLVE) diff --git a/nvme.h b/nvme.h index 10a08f80..a634664e 100644 --- a/nvme.h +++ b/nvme.h @@ -28,6 +28,7 @@ #include "plugin.h" #include "util/json.h" +#include "util/mem.h" #include "util/argconfig.h" #include "util/cleanup.h" @@ -116,8 +117,6 @@ int __id_ctrl(int argc, char **argv, struct command *cmd, struct plugin *plugin, void (*vs)(uint8_t *vs, struct json_object *root)); extern int current_index; -void *nvme_alloc_huge(size_t len, bool *huge); -void nvme_free_huge(void *p, bool huge); const char *nvme_strerror(int errnum); diff --git a/util/mem.c b/util/mem.c new file mode 100644 index 00000000..25370fef --- /dev/null +++ b/util/mem.c @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#include +#include +#include +#include + +#include "mem.h" + +#include "common.h" + +#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) + +void *nvme_alloc(size_t len) +{ + size_t _len = ROUND_UP(len, 0x1000); + void *p; + + if (posix_memalign((void *)&p, getpagesize(), _len)) + return NULL; + + memset(p, 0, _len); + return p; +} + +void *nvme_realloc(void *p, size_t len) +{ + size_t old_len = malloc_usable_size(p); + + void *result = nvme_alloc(len); + + if (p) { + memcpy(result, p, min(old_len, len)); + free(p); + } + + return result; +} + +static void *__nvme_alloc_huge(size_t len, bool *huge) +{ + void *p; + + if (!posix_memalign(&p, getpagesize(), len)) { + *huge = false; + memset(p, 0, len); + return p; + } + return NULL; +} + +#define HUGE_MIN 0x80000 + +#ifdef CONFIG_LIBHUGETLBFS +void nvme_free_huge(void *p, bool huge) +{ + if (huge) { + if (p) + free_hugepage_region(p); + } else { + free(p); + } +} + +void *nvme_alloc_huge(size_t len, bool *huge) +{ + void *p; + + if (len < HUGE_MIN) + return __nvme_alloc_huge(len, huge); + + p = get_hugepage_region(len, GHR_DEFAULT); + if (!p) + return __nvme_alloc_huge(len, huge); + + *huge = true; + return p; +} +#else +void nvme_free_huge(void *p, bool huge) +{ + free(p); +} + +void *nvme_alloc_huge(size_t len, bool *huge) +{ + return __nvme_alloc_huge(len, huge); +} +#endif + +void *nvme_realloc_huge(void *p, size_t len, bool *huge) +{ + size_t old_len = malloc_usable_size(p); + bool was_huge = *huge; + + void *result = nvme_alloc_huge(len, huge); + + if (p) { + memcpy(result, p, min(old_len, len)); + nvme_free_huge(p, was_huge); + } + + return result; +} diff --git a/util/mem.h b/util/mem.h new file mode 100644 index 00000000..12c5b0eb --- /dev/null +++ b/util/mem.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef MEM_H_ +#define MEM_H_ + +#include +#include + +void *nvme_alloc(size_t len); +void *nvme_realloc(void *p, size_t len); + +void *nvme_alloc_huge(size_t len, bool *huge); +void nvme_free_huge(void *p, bool huge); + +#endif /* MEM_H_ */ diff --git a/util/meson.build b/util/meson.build index f149d031..c0ff637b 100644 --- a/util/meson.build +++ b/util/meson.build @@ -5,6 +5,7 @@ sources += [ 'util/base64.c', 'util/cleanup.c', 'util/crc32.c', + 'util/mem.c', 'util/suffix.c', 'util/types.c', ] -- 2.50.1