2 #include <vppinfra/mem.h>
4 extern void * __libc_malloc (size_t);
5 extern void __libc_free (void *);
6 extern void * __libc_calloc (size_t, size_t);
7 extern void * __libc_realloc (void *, size_t);
8 extern void * __libc_valloc (size_t);
9 extern void * __libc_memalign (size_t, size_t);
10 extern void * __libc_pvalloc (size_t);
12 __thread u64 vpp_mem_no_vpp_heap;
14 static void no_heap (void)
16 vpp_mem_no_vpp_heap++;
18 if (1 == vpp_mem_no_vpp_heap)
19 fprintf (stderr, "vpp mem: libc allocation requested but no vpp heap ready, defaulting to libc.\n");
22 static_always_inline int
25 if (PREDICT_TRUE (clib_mem_get_per_cpu_heap () != 0))
35 if (!check_vpp_heap ())
36 return __libc_malloc (size);
38 return clib_mem_alloc (size);
47 if (!check_vpp_heap ())
48 return __libc_free (p);
54 calloc(size_t nmemb, size_t size)
58 if (!check_vpp_heap ())
59 return __libc_calloc (nmemb, size);
61 p = clib_mem_alloc (nmemb * size);
62 clib_memset (p, 0, nmemb * size);
67 realloc(void *p, size_t size)
69 if (!check_vpp_heap ())
70 return __libc_realloc (p, size);
72 return clib_mem_realloc (p, size, clib_mem_size (p));
76 posix_memalign(void **memptr, size_t alignment, size_t size)
78 if (!check_vpp_heap ())
79 *memptr = __libc_memalign (alignment, size);
81 *memptr = clib_mem_alloc_aligned (size, alignment);
86 aligned_alloc(size_t alignment, size_t size)
88 if (!check_vpp_heap ())
89 return __libc_memalign (alignment, size);
91 return clib_mem_alloc_aligned (size, alignment);
97 if (!check_vpp_heap ())
98 return __libc_valloc (size);
100 return clib_mem_alloc_aligned (size, clib_mem_get_page_size ());
103 void *memalign(size_t alignment, size_t size)
105 if (!check_vpp_heap ())
106 return __libc_memalign (alignment, size);
108 return clib_mem_alloc_aligned (size, alignment);
116 if (!check_vpp_heap ())
117 return __libc_pvalloc (size);
119 pagesz = clib_mem_get_page_size ();
120 return clib_mem_alloc_aligned (round_pow2 (size, pagesz), pagesz);