]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
lib/ukalloc: Cross-compatibility wrappers for "free memory" APIs
authorSimon Kuenzer <simon.kuenzer@neclab.eu>
Thu, 12 Nov 2020 16:10:03 +0000 (17:10 +0100)
committerUnikraft <monkey@unikraft.io>
Tue, 22 Jun 2021 13:14:08 +0000 (13:14 +0000)
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 <simon.kuenzer@neclab.eu>
Reviewed-by: Cezar Craciunoiu <cezar.craciunoiu@gmail.com>
Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Pull-Request: #229

lib/ukalloc/alloc.c
lib/ukalloc/exportsyms.uk
lib/ukalloc/include/uk/alloc_impl.h

index 98a0e94f188b82c7de459e5b937cbbaf47193eee..a2223b17f94a1f90daf2a1ae805c9c9decb77f8b 100644 (file)
@@ -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);
+}
index 21c1996f8966ac68cd2e22bc73dd13e8e69baa69..499d527dbb29c3b43824d7ca97476ff4aeebfc2e 100644 (file)
@@ -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
index b0404443cdb6f2612c136a5b973daf646c0b6419..2b28fe3df291d0d4f4e5017d9b4be1993c9a2a83 100644 (file)
@@ -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));                                 \