1 #ifndef __TOOLS_LINUX_SLAB_H
2 #define __TOOLS_LINUX_SLAB_H
8 #include <linux/kernel.h>
9 #include <linux/log2.h>
10 #include <linux/page.h>
11 #include <linux/shrinker.h>
12 #include <linux/types.h>
14 #define ARCH_KMALLOC_MINALIGN 16
15 #define KMALLOC_MAX_SIZE SIZE_MAX
17 static inline void *kmalloc(size_t size, gfp_t flags)
23 run_shrinkers(flags, i != 0);
26 size_t alignment = min(rounddown_pow_of_two(size), (size_t)PAGE_SIZE);
27 alignment = max(sizeof(void *), alignment);
28 if (posix_memalign(&p, alignment, size))
33 if (p && (flags & __GFP_ZERO))
35 } while (!p && i++ < 10);
40 static inline void *krealloc(void *old, size_t size, gfp_t flags)
44 new = kmalloc(size, flags);
48 if (flags & __GFP_ZERO)
53 min(malloc_usable_size(old),
54 malloc_usable_size(new)));
61 #define kzalloc(size, flags) kmalloc(size, flags|__GFP_ZERO)
62 #define kmalloc_array(n, size, flags) \
63 ((size) != 0 && (n) > SIZE_MAX / (size) \
64 ? NULL : kmalloc((n) * (size), flags))
66 #define kvmalloc_array(n, size, flags) \
67 ((size) != 0 && (n) > SIZE_MAX / (size) \
68 ? NULL : kmalloc((n) * (size), flags))
70 #define kcalloc(n, size, flags) kmalloc_array(n, size, flags|__GFP_ZERO)
72 #define kfree(p) free(p)
73 #define kzfree(p) free(p)
75 #define kvmalloc(size, flags) kmalloc(size, flags)
76 #define kvzalloc(size, flags) kzalloc(size, flags)
77 #define kvfree(p) kfree(p)
79 static inline struct page *alloc_pages(gfp_t flags, unsigned int order)
81 size_t size = PAGE_SIZE << order;
86 run_shrinkers(flags, i != 0);
88 p = aligned_alloc(PAGE_SIZE, size);
89 if (p && (flags & __GFP_ZERO))
91 } while (!p && i++ < 10);
96 #define alloc_page(gfp) alloc_pages(gfp, 0)
98 #define __get_free_pages(gfp, order) ((unsigned long) alloc_pages(gfp, order))
99 #define __get_free_page(gfp) __get_free_pages(gfp, 0)
101 #define __free_pages(page, order) \
107 #define free_pages(addr, order) \
110 free((void *) (addr)); \
113 #define __free_page(page) __free_pages((page), 0)
114 #define free_page(addr) free_pages((addr), 0)
116 #define VM_IOREMAP 0x00000001 /* ioremap() and friends */
117 #define VM_ALLOC 0x00000002 /* vmalloc() */
118 #define VM_MAP 0x00000004 /* vmap()ed pages */
119 #define VM_USERMAP 0x00000008 /* suitable for remap_vmalloc_range */
120 #define VM_UNINITIALIZED 0x00000020 /* vm_struct is not fully initialized */
121 #define VM_NO_GUARD 0x00000040 /* don't add guard page */
122 #define VM_KASAN 0x00000080 /* has allocated kasan shadow memory */
124 static inline void vunmap(const void *addr) {}
126 static inline void *vmap(struct page **pages, unsigned int count,
127 unsigned long flags, unsigned prot)
132 #define is_vmalloc_addr(page) 0
134 #define vmalloc_to_page(addr) ((struct page *) (addr))
136 static inline void *kmemdup(const void *src, size_t len, gfp_t gfp)
140 p = kmalloc(len, gfp);
150 static inline void *kmem_cache_alloc(struct kmem_cache *c, gfp_t gfp)
152 return kmalloc(c->obj_size, gfp);
155 static inline void kmem_cache_free(struct kmem_cache *c, void *p)
160 static inline void kmem_cache_destroy(struct kmem_cache *p)
165 static inline struct kmem_cache *kmem_cache_create(size_t obj_size)
167 struct kmem_cache *p = kmalloc(sizeof(*p), GFP_KERNEL);
171 p->obj_size = obj_size;
175 #define KMEM_CACHE(_struct, _flags) kmem_cache_create(sizeof(struct _struct))
177 #endif /* __TOOLS_LINUX_SLAB_H */