diff options
Diffstat (limited to 'libbcachefs/util.h')
-rw-r--r-- | libbcachefs/util.h | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/libbcachefs/util.h b/libbcachefs/util.h index 68d9a861..a9a17d9e 100644 --- a/libbcachefs/util.h +++ b/libbcachefs/util.h @@ -79,23 +79,43 @@ do { \ (__builtin_types_compatible_p(typeof(_val), _type) || \ __builtin_types_compatible_p(typeof(_val), const _type)) -static inline void kvpfree(void *p, size_t size) +static inline void vpfree(void *p, size_t size) { - if (size < PAGE_SIZE) - kfree(p); - else if (is_vmalloc_addr(p)) + if (is_vmalloc_addr(p)) vfree(p); else free_pages((unsigned long) p, get_order(size)); +} +static inline void *vpmalloc(size_t size, gfp_t gfp_mask) +{ + return (void *) __get_free_pages(gfp_mask|__GFP_NOWARN, + get_order(size)) ?: + __vmalloc(size, gfp_mask, PAGE_KERNEL); +} + +static inline void kvpfree(void *p, size_t size) +{ + if (size < PAGE_SIZE) + kfree(p); + else + vpfree(p, size); } static inline void *kvpmalloc(size_t size, gfp_t gfp_mask) { - return size < PAGE_SIZE ? kmalloc(size, gfp_mask) - : (void *) __get_free_pages(gfp_mask|__GFP_NOWARN, - get_order(size)) - ?: __vmalloc(size, gfp_mask, PAGE_KERNEL); + return size < PAGE_SIZE + ? kmalloc(size, gfp_mask) + : vpmalloc(size, gfp_mask); +} + +void mempool_free_vp(void *element, void *pool_data); +void *mempool_alloc_vp(gfp_t gfp_mask, void *pool_data); + +static inline int mempool_init_vp_pool(mempool_t *pool, int min_nr, size_t size) +{ + return mempool_init(pool, min_nr, mempool_alloc_vp, + mempool_free_vp, (void *) size); } #define HEAP(type) \ |