From: Simon Kuenzer Date: Thu, 12 Nov 2020 16:10:03 +0000 (+0100) Subject: lib/ukalloc: Cross-compatibility wrappers for "free memory" APIs X-Git-Tag: RELEASE-0.6~175 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=7696cf25d957a03da9d78b494807faa4dbc4896a;p=unikraft%2Funikraft.git lib/ukalloc: Cross-compatibility wrappers for "free memory" APIs This commit provides cross compatibility wrappers between page and non-page allocators: `uk_alloc_availmem()`, `uk_alloc_maxalloc()`, `uk_alloc_pavailmem()`, and `uk_alloc_pmaxalloc()`. Signed-off-by: Simon Kuenzer Reviewed-by: Cezar Craciunoiu Tested-by: Unikraft CI GitHub-Pull-Request: #229 --- diff --git a/lib/ukalloc/alloc.c b/lib/ukalloc/alloc.c index 98a0e94f1..a2223b17f 100644 --- a/lib/ukalloc/alloc.c +++ b/lib/ukalloc/alloc.c @@ -271,6 +271,41 @@ int uk_posix_memalign_ifpages(struct uk_alloc *a, return 0; } +ssize_t uk_alloc_maxalloc_ifpages(struct uk_alloc *a) +{ + long num_pages; + ssize_t maxalloc; + + UK_ASSERT(a); + + num_pages = uk_alloc_pmaxalloc(a); + if (num_pages < 0) { + /* forward error code */ + return (ssize_t) num_pages; + } + + maxalloc = ((ssize_t) num_pages) << __PAGE_SHIFT; + + if (maxalloc <= METADATA_IFPAGES_SIZE_POW2) + return 0; + + maxalloc -= METADATA_IFPAGES_SIZE_POW2; + return maxalloc; +} + +ssize_t uk_alloc_availmem_ifpages(struct uk_alloc *a) +{ + long num_pages; + + UK_ASSERT(a); + + num_pages = uk_alloc_pavailmem(a); + if (num_pages < 0) + return (ssize_t) num_pages; + + return ((ssize_t) num_pages) << __PAGE_SHIFT; +} + #if CONFIG_LIBUKALLOC_IFMALLOC struct metadata_ifmalloc { @@ -490,3 +525,29 @@ void *uk_memalign_compat(struct uk_alloc *a, size_t align, size_t size) return ptr; } + +long uk_alloc_pmaxalloc_compat(struct uk_alloc *a) +{ + ssize_t mem; + + UK_ASSERT(a); + + mem = uk_alloc_maxalloc(a); + if (mem < 0) + return (long) mem; + + return (long) (mem >> __PAGE_SHIFT); +} + +long uk_alloc_pavailmem_compat(struct uk_alloc *a) +{ + ssize_t mem; + + UK_ASSERT(a); + + mem = uk_alloc_availmem(a); + if (mem < 0) + return (long) mem; + + return (long) (mem >> __PAGE_SHIFT); +} diff --git a/lib/ukalloc/exportsyms.uk b/lib/ukalloc/exportsyms.uk index 21c1996f8..499d527db 100644 --- a/lib/ukalloc/exportsyms.uk +++ b/lib/ukalloc/exportsyms.uk @@ -4,6 +4,8 @@ uk_malloc_ifpages uk_free_ifpages uk_realloc_ifpages uk_posix_memalign_ifpages +uk_alloc_maxalloc_ifpages +uk_alloc_availmem_ifpages uk_malloc_ifmalloc uk_realloc_ifmalloc uk_posix_memalign_ifmalloc @@ -13,4 +15,6 @@ uk_memalign_compat uk_realloc_compat uk_palloc_compat uk_pfree_compat +uk_alloc_pmaxalloc_compat +uk_alloc_pavailmem_compat _uk_alloc_head diff --git a/lib/ukalloc/include/uk/alloc_impl.h b/lib/ukalloc/include/uk/alloc_impl.h index b0404443c..2b28fe3df 100644 --- a/lib/ukalloc/include/uk/alloc_impl.h +++ b/lib/ukalloc/include/uk/alloc_impl.h @@ -53,12 +53,16 @@ int uk_alloc_register(struct uk_alloc *a); * API functionality is actually implemented. */ -/* Functions that can be used by allocators that implement palloc(), pfree() only */ +/* Functions that can be used by allocators that implement palloc(), + * pfree() and potentially pavail(), pmaxalloc() only + */ void *uk_malloc_ifpages(struct uk_alloc *a, size_t size); void *uk_realloc_ifpages(struct uk_alloc *a, void *ptr, size_t size); int uk_posix_memalign_ifpages(struct uk_alloc *a, void **memptr, size_t align, size_t size); void uk_free_ifpages(struct uk_alloc *a, void *ptr); +ssize_t uk_alloc_availmem_ifpages(struct uk_alloc *a); +ssize_t uk_alloc_maxalloc_ifpages(struct uk_alloc *a); #if CONFIG_LIBUKALLOC_IFMALLOC void *uk_malloc_ifmalloc(struct uk_alloc *a, size_t size); @@ -74,6 +78,8 @@ void *uk_realloc_compat(struct uk_alloc *a, void *ptr, size_t size); void *uk_memalign_compat(struct uk_alloc *a, size_t align, size_t len); void *uk_palloc_compat(struct uk_alloc *a, unsigned long num_pages); void uk_pfree_compat(struct uk_alloc *a, void *ptr, unsigned long num_pages); +long uk_alloc_pavailmem_compat(struct uk_alloc *a); +long uk_alloc_pmaxalloc_compat(struct uk_alloc *a); /* Shortcut for doing a registration of an allocator that does not implement * palloc() or pfree() @@ -91,7 +97,11 @@ void uk_pfree_compat(struct uk_alloc *a, void *ptr, unsigned long num_pages); (a)->palloc = uk_palloc_compat; \ (a)->pfree = uk_pfree_compat; \ (a)->availmem = (availmem_f); \ + (a)->pavailmem = (availmem_f != NULL) \ + ? uk_alloc_pavailmem_compat : NULL; \ (a)->maxalloc = (maxalloc_f); \ + (a)->pmaxalloc = (maxalloc_f != NULL) \ + ? uk_alloc_pmaxalloc_compat : NULL; \ (a)->addmem = (addmem_f); \ \ uk_alloc_register((a)); \ @@ -112,7 +122,11 @@ void uk_pfree_compat(struct uk_alloc *a, void *ptr, unsigned long num_pages); (a)->palloc = uk_palloc_compat; \ (a)->pfree = uk_pfree_compat; \ (a)->availmem = (availmem_f); \ + (a)->pavailmem = (availmem_f != NULL) \ + ? uk_alloc_pavailmem_compat : NULL; \ (a)->maxalloc = (maxalloc_f); \ + (a)->pmaxalloc = (maxalloc_f != NULL) \ + ? uk_alloc_pmaxalloc_compat : NULL; \ (a)->addmem = (addmem_f); \ \ uk_alloc_register((a)); \ @@ -134,7 +148,11 @@ void uk_pfree_compat(struct uk_alloc *a, void *ptr, unsigned long num_pages); (a)->palloc = (palloc_func); \ (a)->pfree = (pfree_func); \ (a)->pavailmem = (pavailmem_func); \ + (a)->availmem = (pavailmem_func != NULL) \ + ? uk_alloc_availmem_ifpages : NULL; \ (a)->pmaxalloc = (pmaxalloc_func); \ + (a)->maxalloc = (pmaxalloc_func != NULL) \ + ? uk_alloc_maxalloc_ifpages : NULL; \ (a)->addmem = (addmem_func); \ \ uk_alloc_register((a)); \