2 * Copyright (c) 2015 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 Copyright (c) 2001, 2002, 2003 Eliot Dresselhaus
18 Permission is hereby granted, free of charge, to any person obtaining
19 a copy of this software and associated documentation files (the
20 "Software"), to deal in the Software without restriction, including
21 without limitation the rights to use, copy, modify, merge, publish,
22 distribute, sublicense, and/or sell copies of the Software, and to
23 permit persons to whom the Software is furnished to do so, subject to
24 the following conditions:
26 The above copyright notice and this permission notice shall be
27 included in all copies or substantial portions of the Software.
29 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
33 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
34 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
35 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38 #ifndef _included_clib_mem_h
39 #define _included_clib_mem_h
43 #include <vppinfra/clib.h> /* uword, etc */
44 #include <vppinfra/mheap_bootstrap.h>
45 #include <vppinfra/os.h>
46 #include <vppinfra/string.h> /* memcpy, memset */
47 #include <vppinfra/valgrind.h>
49 #define CLIB_MAX_MHEAPS 256
52 extern void *clib_per_cpu_mheaps[CLIB_MAX_MHEAPS];
55 clib_mem_get_per_cpu_heap (void)
57 int cpu = os_get_thread_index ();
58 return clib_per_cpu_mheaps[cpu];
62 clib_mem_set_per_cpu_heap (u8 * new_heap)
64 int cpu = os_get_thread_index ();
65 void *old = clib_per_cpu_mheaps[cpu];
66 clib_per_cpu_mheaps[cpu] = new_heap;
70 /* Memory allocator which may call os_out_of_memory() if it fails */
72 clib_mem_alloc_aligned_at_offset (uword size, uword align, uword align_offset,
73 int os_out_of_memory_on_failure)
78 if (align_offset > align)
81 align_offset %= align;
86 cpu = os_get_thread_index ();
87 heap = clib_per_cpu_mheaps[cpu];
88 heap = mheap_get_aligned (heap, size, align, align_offset, &offset);
89 clib_per_cpu_mheaps[cpu] = heap;
95 VALGRIND_MALLOCLIKE_BLOCK (p, mheap_data_bytes (heap, offset), 0, 0);
101 if (os_out_of_memory_on_failure)
107 /* Memory allocator which calls os_out_of_memory() when it fails */
109 clib_mem_alloc (uword size)
111 return clib_mem_alloc_aligned_at_offset (size, /* align */ 1,
112 /* align_offset */ 0,
113 /* os_out_of_memory */ 1);
117 clib_mem_alloc_aligned (uword size, uword align)
119 return clib_mem_alloc_aligned_at_offset (size, align, /* align_offset */ 0,
120 /* os_out_of_memory */ 1);
123 /* Memory allocator which calls os_out_of_memory() when it fails */
125 clib_mem_alloc_or_null (uword size)
127 return clib_mem_alloc_aligned_at_offset (size, /* align */ 1,
128 /* align_offset */ 0,
129 /* os_out_of_memory */ 0);
133 clib_mem_alloc_aligned_or_null (uword size, uword align)
135 return clib_mem_alloc_aligned_at_offset (size, align, /* align_offset */ 0,
136 /* os_out_of_memory */ 0);
141 /* Memory allocator which panics when it fails.
142 Use macro so that clib_panic macro can expand __FUNCTION__ and __LINE__. */
143 #define clib_mem_alloc_aligned_no_fail(size,align) \
145 uword _clib_mem_alloc_size = (size); \
146 void * _clib_mem_alloc_p; \
147 _clib_mem_alloc_p = clib_mem_alloc_aligned (_clib_mem_alloc_size, (align)); \
148 if (! _clib_mem_alloc_p) \
149 clib_panic ("failed to allocate %d bytes", _clib_mem_alloc_size); \
153 #define clib_mem_alloc_no_fail(size) clib_mem_alloc_aligned_no_fail(size,1)
155 /* Alias to stack allocator for naming consistency. */
156 #define clib_mem_alloc_stack(bytes) __builtin_alloca(bytes)
159 clib_mem_is_heap_object (void *p)
161 void *heap = clib_mem_get_per_cpu_heap ();
162 uword offset = (uword) p - (uword) heap;
165 if (offset >= vec_len (heap))
168 e = mheap_elt_at_uoffset (heap, offset);
169 n = mheap_next_elt (e);
171 /* Check that heap forward and reverse pointers agree. */
172 return e->n_user_data == n->prev_n_user_data;
176 clib_mem_free (void *p)
178 u8 *heap = clib_mem_get_per_cpu_heap ();
180 /* Make sure object is in the correct heap. */
181 ASSERT (clib_mem_is_heap_object (p));
183 mheap_put (heap, (u8 *) p - heap);
186 VALGRIND_FREELIKE_BLOCK (p, 0);
191 clib_mem_realloc (void *p, uword new_size, uword old_size)
193 /* By default use alloc, copy and free to emulate realloc. */
194 void *q = clib_mem_alloc (new_size);
198 if (old_size < new_size)
199 copy_size = old_size;
201 copy_size = new_size;
202 clib_memcpy (q, p, copy_size);
209 clib_mem_size (void *p)
211 ASSERT (clib_mem_is_heap_object (p));
212 mheap_elt_t *e = mheap_user_pointer_to_elt (p);
213 return mheap_elt_data_bytes (e);
217 clib_mem_get_heap (void)
219 return clib_mem_get_per_cpu_heap ();
223 clib_mem_set_heap (void *heap)
225 return clib_mem_set_per_cpu_heap (heap);
228 void *clib_mem_init (void *heap, uword size);
230 void clib_mem_exit (void);
232 uword clib_mem_get_page_size (void);
234 void clib_mem_validate (void);
236 void clib_mem_trace (int enable);
240 /* Total number of objects allocated. */
243 /* Total allocated bytes. Bytes used and free.
244 used + free = total */
245 uword bytes_total, bytes_used, bytes_free;
247 /* Number of bytes used by mheap data structure overhead
248 (e.g. free lists, mheap header). */
249 uword bytes_overhead;
251 /* Amount of free space returned to operating system. */
252 uword bytes_free_reclaimed;
254 /* For malloc which puts small objects in sbrk region and
255 large objects in mmap'ed regions. */
256 uword bytes_used_sbrk;
257 uword bytes_used_mmap;
259 /* Max. number of bytes in this heap. */
263 void clib_mem_usage (clib_mem_usage_t * usage);
265 u8 *format_clib_mem_usage (u8 * s, va_list * args);
267 /* Include appropriate VM functions depending on whether
268 we are compiling for linux kernel, for Unix or standalone. */
269 #ifdef CLIB_LINUX_KERNEL
270 #include <vppinfra/vm_linux_kernel.h>
274 #include <vppinfra/vm_unix.h>
277 #ifdef CLIB_STANDALONE
278 #include <vppinfra/vm_standalone.h>
281 #include <vppinfra/error.h> /* clib_panic */
283 #endif /* _included_clib_mem_h */
286 * fd.io coding-style-patch-verification: ON
289 * eval: (c-set-style "gnu")