Changes in kernel/generic/src/mm/slab.c [7ec3c56:f97f1e51] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/slab.c
r7ec3c56 rf97f1e51 114 114 #include <bitops.h> 115 115 #include <macros.h> 116 #include <cpu.h>117 116 118 117 IRQ_SPINLOCK_STATIC_INITIALIZE(slab_cache_lock); … … 183 182 size_t zone = 0; 184 183 185 uintptr_t data_phys = 186 frame_alloc_generic(cache->frames, flags, 0, &zone); 187 if (!data_phys) 184 void *data = frame_alloc_generic(cache->order, FRAME_KA | flags, &zone); 185 if (!data) { 188 186 return NULL; 189 190 void *data = (void *) PA2KA(data_phys); 187 } 191 188 192 189 slab_t *slab; … … 196 193 slab = slab_alloc(slab_extern_cache, flags); 197 194 if (!slab) { 198 frame_free(KA2PA(data) , cache->frames);195 frame_free(KA2PA(data)); 199 196 return NULL; 200 197 } 201 198 } else { 202 fsize = FRAMES2SIZE(cache->frames);199 fsize = (PAGE_SIZE << cache->order); 203 200 slab = data + fsize - sizeof(*slab); 204 201 } … … 206 203 /* Fill in slab structures */ 207 204 size_t i; 208 for (i = 0; i < cache->frames; i++)205 for (i = 0; i < ((size_t) 1 << cache->order); i++) 209 206 frame_set_parent(ADDR2PFN(KA2PA(data)) + i, slab, zone); 210 207 … … 228 225 NO_TRACE static size_t slab_space_free(slab_cache_t *cache, slab_t *slab) 229 226 { 230 frame_free(KA2PA(slab->start) , slab->cache->frames);227 frame_free(KA2PA(slab->start)); 231 228 if (!(cache->flags & SLAB_CACHE_SLINSIDE)) 232 229 slab_free(slab_extern_cache, slab); … … 234 231 atomic_dec(&cache->allocated_slabs); 235 232 236 return cache->frames;233 return (1 << cache->order); 237 234 } 238 235 … … 561 558 { 562 559 if (cache->flags & SLAB_CACHE_SLINSIDE) 563 return ( FRAMES2SIZE(cache->frames) - sizeof(slab_t)) /564 cache->size;560 return ((PAGE_SIZE << cache->order) 561 - sizeof(slab_t)) / cache->size; 565 562 else 566 return FRAMES2SIZE(cache->frames) / cache->size;563 return (PAGE_SIZE << cache->order) / cache->size; 567 564 } 568 565 … … 573 570 { 574 571 size_t objects = comp_objects(cache); 575 size_t ssize = FRAMES2SIZE(cache->frames);572 size_t ssize = PAGE_SIZE << cache->order; 576 573 577 574 if (cache->flags & SLAB_CACHE_SLINSIDE) … … 610 607 unsigned int kmflag), size_t (*destructor)(void *obj), unsigned int flags) 611 608 { 612 ASSERT(size > 0);613 614 609 memsetb(cache, sizeof(*cache), 0); 615 610 cache->name = name; … … 639 634 cache->flags |= SLAB_CACHE_SLINSIDE; 640 635 641 /* Minimum slab frames */ 642 cache->frames = SIZE2FRAMES(cache->size); 636 /* Minimum slab order */ 637 size_t pages = SIZE2FRAMES(cache->size); 638 639 /* We need the 2^order >= pages */ 640 if (pages == 1) 641 cache->order = 0; 642 else 643 cache->order = fnzb(pages - 1) + 1; 643 644 644 645 while (badness(cache) > SLAB_MAX_BADNESS(cache)) 645 cache-> frames <<= 1;646 cache->order += 1; 646 647 647 648 cache->objects = comp_objects(cache); … … 809 810 810 811 size_t frames = 0; 811 list_foreach(slab_cache_list, link, slab_cache_t, cache) { 812 list_foreach(slab_cache_list, cur) { 813 slab_cache_t *cache = list_get_instance(cur, slab_cache_t, link); 812 814 frames += _slab_reclaim(cache, flags); 813 815 } … … 869 871 870 872 const char *name = cache->name; 871 size_t frames = cache->frames;873 uint8_t order = cache->order; 872 874 size_t size = cache->size; 873 875 size_t objects = cache->objects; … … 879 881 irq_spinlock_unlock(&slab_cache_lock, true); 880 882 881 printf("%-18s %8zu %8 zu %8zu %8ld %8ld %8ld %-5s\n",882 name, size, frames, objects, allocated_slabs,883 printf("%-18s %8zu %8u %8zu %8ld %8ld %8ld %-5s\n", 884 name, size, (1 << order), objects, allocated_slabs, 883 885 cached_objs, allocated_objs, 884 886 flags & SLAB_CACHE_SLINSIDE ? "in" : "out"); … … 890 892 /* Initialize magazine cache */ 891 893 _slab_cache_create(&mag_cache, "slab_magazine_t", 892 sizeof(slab_magazine_t) + SLAB_MAG_SIZE * sizeof(void 894 sizeof(slab_magazine_t) + SLAB_MAG_SIZE * sizeof(void*), 893 895 sizeof(uintptr_t), NULL, NULL, SLAB_CACHE_NOMAGAZINE | 894 896 SLAB_CACHE_SLINSIDE); … … 934 936 irq_spinlock_lock(&slab_cache_lock, false); 935 937 936 list_foreach(slab_cache_list, link, slab_cache_t, slab) { 938 list_foreach(slab_cache_list, cur) { 939 slab_cache_t *slab = list_get_instance(cur, slab_cache_t, link); 937 940 if ((slab->flags & SLAB_CACHE_MAGDEFERRED) != 938 941 SLAB_CACHE_MAGDEFERRED)
Note:
See TracChangeset
for help on using the changeset viewer.