Changes in / [b0beb9b1:64f85f5] in mainline
- Location:
- kernel
- Files:
-
- 1 deleted
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/Makefile
rb0beb9b1 r64f85f5 94 94 -fdebug-prefix-map=$(realpath $(ROOT_PATH))=. 95 95 96 GCC_CFLAGS = -std=gnu 11-Wall -Wextra -Wno-unused-parameter \96 GCC_CFLAGS = -std=gnu99 -Wall -Wextra -Wno-unused-parameter \ 97 97 -Wmissing-prototypes -Werror-implicit-function-declaration \ 98 98 -Wwrite-strings -pipe -Wno-cast-function-type 99 99 100 CLANG_CFLAGS = -std=gnu 11-Wall -Wextra -Wno-unused-parameter \100 CLANG_CFLAGS = -std=gnu99 -Wall -Wextra -Wno-unused-parameter \ 101 101 -Wno-missing-field-initializers -Wno-unused-command-line-argument \ 102 102 -Wmissing-prototypes -Werror-implicit-function-declaration \ … … 197 197 generic/src/mm/tlb.c \ 198 198 generic/src/mm/as.c \ 199 generic/src/mm/malloc.c \200 199 generic/src/mm/backend_anon.c \ 201 200 generic/src/mm/backend_elf.c \ -
kernel/generic/include/bitops.h
rb0beb9b1 r64f85f5 36 36 #define KERN_BITOPS_H_ 37 37 38 #include <stdint.h>39 38 #include <trace.h> 40 39 -
kernel/generic/include/main/main.h
rb0beb9b1 r64f85f5 48 48 extern void main_ap(void); 49 49 50 extern void malloc_init(void);51 52 50 #endif 53 51 -
kernel/generic/include/mm/slab.h
rb0beb9b1 r64f85f5 40 40 #include <atomic.h> 41 41 #include <mm/frame.h> 42 43 /** Minimum size to be allocated by malloc */ 44 #define SLAB_MIN_MALLOC_W 4 45 46 /** Maximum size to be allocated by malloc */ 47 #define SLAB_MAX_MALLOC_W 22 42 48 43 49 /** Initial Magazine size (TODO: dynamically growing magazines) */ -
kernel/generic/src/main/main.c
rb0beb9b1 r64f85f5 246 246 frame_init(); 247 247 slab_cache_init(); 248 malloc_init();249 248 ra_init(); 250 249 sysinfo_init(); -
kernel/generic/src/mm/slab.c
rb0beb9b1 r64f85f5 138 138 static slab_cache_t *slab_extern_cache; 139 139 140 /** Caches for malloc */ 141 static slab_cache_t *malloc_caches[SLAB_MAX_MALLOC_W - SLAB_MIN_MALLOC_W + 1]; 142 143 static const char *malloc_names[] = { 144 "malloc-16", 145 "malloc-32", 146 "malloc-64", 147 "malloc-128", 148 "malloc-256", 149 "malloc-512", 150 "malloc-1K", 151 "malloc-2K", 152 "malloc-4K", 153 "malloc-8K", 154 "malloc-16K", 155 "malloc-32K", 156 "malloc-64K", 157 "malloc-128K", 158 "malloc-256K", 159 "malloc-512K", 160 "malloc-1M", 161 "malloc-2M", 162 "malloc-4M" 163 }; 164 140 165 /** Slab descriptor */ 141 166 typedef struct { … … 750 775 panic("Destroying cache that is not empty."); 751 776 752 if (!(cache->flags & SLAB_CACHE_NOMAGAZINE) && cache->mag_cache) { 753 slab_free(&slab_mag_cache, cache->mag_cache); 777 if (!(cache->flags & SLAB_CACHE_NOMAGAZINE)) { 778 slab_t *mag_slab = obj2slab(cache->mag_cache); 779 _slab_free(mag_slab->cache, cache->mag_cache, mag_slab); 754 780 } 755 781 … … 888 914 NULL, NULL, SLAB_CACHE_SLINSIDE | SLAB_CACHE_MAGDEFERRED); 889 915 916 /* Initialize structures for malloc */ 917 size_t i; 918 size_t size; 919 920 for (i = 0, size = (1 << SLAB_MIN_MALLOC_W); 921 i < (SLAB_MAX_MALLOC_W - SLAB_MIN_MALLOC_W + 1); 922 i++, size <<= 1) { 923 malloc_caches[i] = slab_cache_create(malloc_names[i], size, 0, 924 NULL, NULL, SLAB_CACHE_MAGDEFERRED); 925 } 926 890 927 #ifdef CONFIG_DEBUG 891 928 _slab_initialized = 1; … … 924 961 } 925 962 963 void *malloc(size_t size) 964 { 965 assert(_slab_initialized); 966 assert(size <= (1 << SLAB_MAX_MALLOC_W)); 967 968 if (size < (1 << SLAB_MIN_MALLOC_W)) 969 size = (1 << SLAB_MIN_MALLOC_W); 970 971 uint8_t idx = fnzb(size - 1) - SLAB_MIN_MALLOC_W + 1; 972 973 return slab_alloc(malloc_caches[idx], FRAME_ATOMIC); 974 } 975 976 void *realloc(void *ptr, size_t size) 977 { 978 assert(_slab_initialized); 979 assert(size <= (1 << SLAB_MAX_MALLOC_W)); 980 981 void *new_ptr; 982 983 if (size > 0) { 984 if (size < (1 << SLAB_MIN_MALLOC_W)) 985 size = (1 << SLAB_MIN_MALLOC_W); 986 uint8_t idx = fnzb(size - 1) - SLAB_MIN_MALLOC_W + 1; 987 988 new_ptr = slab_alloc(malloc_caches[idx], FRAME_ATOMIC); 989 } else 990 new_ptr = NULL; 991 992 if ((new_ptr != NULL) && (ptr != NULL)) { 993 slab_t *slab = obj2slab(ptr); 994 memcpy(new_ptr, ptr, min(size, slab->cache->size)); 995 } 996 997 if (ptr != NULL) 998 free(ptr); 999 1000 return new_ptr; 1001 } 1002 1003 void free(void *ptr) 1004 { 1005 if (!ptr) 1006 return; 1007 1008 slab_t *slab = obj2slab(ptr); 1009 _slab_free(slab->cache, ptr, slab); 1010 } 1011 926 1012 /** @} 927 1013 */
Note:
See TracChangeset
for help on using the changeset viewer.