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 {
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);
+}
* 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);
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()
(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)); \
(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)); \
(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)); \