Changes in kernel/generic/src/mm/slab.c [1066041:cd3b380] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/slab.c
r1066041 rcd3b380 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 void *data = frame_alloc_generic(cache->order, FRAME_KA | flags, &zone); 186 if (!data) { 184 uintptr_t data_phys = 185 frame_alloc_generic(cache->frames, flags, 0, &zone); 186 if (!data_phys) 187 187 return NULL; 188 } 188 189 void *data = (void *) PA2KA(data_phys); 189 190 190 191 slab_t *slab; … … 194 195 slab = slab_alloc(slab_extern_cache, flags); 195 196 if (!slab) { 196 frame_free(KA2PA(data) );197 frame_free(KA2PA(data), cache->frames); 197 198 return NULL; 198 199 } 199 200 } else { 200 fsize = (PAGE_SIZE << cache->order);201 fsize = FRAMES2SIZE(cache->frames); 201 202 slab = data + fsize - sizeof(*slab); 202 203 } … … 204 205 /* Fill in slab structures */ 205 206 size_t i; 206 for (i = 0; i < ((size_t) 1 << cache->order); i++)207 for (i = 0; i < cache->frames; i++) 207 208 frame_set_parent(ADDR2PFN(KA2PA(data)) + i, slab, zone); 208 209 … … 226 227 NO_TRACE static size_t slab_space_free(slab_cache_t *cache, slab_t *slab) 227 228 { 228 frame_free(KA2PA(slab->start) );229 frame_free(KA2PA(slab->start), slab->cache->frames); 229 230 if (!(cache->flags & SLAB_CACHE_SLINSIDE)) 230 231 slab_free(slab_extern_cache, slab); … … 232 233 atomic_dec(&cache->allocated_slabs); 233 234 234 return (1 << cache->order);235 return cache->frames; 235 236 } 236 237 … … 559 560 { 560 561 if (cache->flags & SLAB_CACHE_SLINSIDE) 561 return ( (PAGE_SIZE << cache->order)562 - sizeof(slab_t)) /cache->size;562 return (FRAMES2SIZE(cache->frames) - sizeof(slab_t)) / 563 cache->size; 563 564 else 564 return (PAGE_SIZE << cache->order) / cache->size;565 return FRAMES2SIZE(cache->frames) / cache->size; 565 566 } 566 567 … … 571 572 { 572 573 size_t objects = comp_objects(cache); 573 size_t ssize = PAGE_SIZE << cache->order;574 size_t ssize = FRAMES2SIZE(cache->frames); 574 575 575 576 if (cache->flags & SLAB_CACHE_SLINSIDE) … … 635 636 cache->flags |= SLAB_CACHE_SLINSIDE; 636 637 637 /* Minimum slab order */ 638 size_t pages = SIZE2FRAMES(cache->size); 639 640 /* We need the 2^order >= pages */ 641 if (pages == 1) 642 cache->order = 0; 643 else 644 cache->order = fnzb(pages - 1) + 1; 638 /* Minimum slab frames */ 639 cache->frames = SIZE2FRAMES(cache->size); 645 640 646 641 while (badness(cache) > SLAB_MAX_BADNESS(cache)) 647 cache-> order += 1;642 cache->frames <<= 1; 648 643 649 644 cache->objects = comp_objects(cache); … … 811 806 812 807 size_t frames = 0; 813 list_foreach(slab_cache_list, cur) { 814 slab_cache_t *cache = list_get_instance(cur, slab_cache_t, link); 808 list_foreach(slab_cache_list, link, slab_cache_t, cache) { 815 809 frames += _slab_reclaim(cache, flags); 816 810 } … … 872 866 873 867 const char *name = cache->name; 874 uint8_t order = cache->order;868 size_t frames = cache->frames; 875 869 size_t size = cache->size; 876 870 size_t objects = cache->objects; … … 882 876 irq_spinlock_unlock(&slab_cache_lock, true); 883 877 884 printf("%-18s %8zu %8 u %8zu %8ld %8ld %8ld %-5s\n",885 name, size, (1 << order), objects, allocated_slabs,878 printf("%-18s %8zu %8zu %8zu %8ld %8ld %8ld %-5s\n", 879 name, size, frames, objects, allocated_slabs, 886 880 cached_objs, allocated_objs, 887 881 flags & SLAB_CACHE_SLINSIDE ? "in" : "out"); … … 937 931 irq_spinlock_lock(&slab_cache_lock, false); 938 932 939 list_foreach(slab_cache_list, cur) { 940 slab_cache_t *slab = list_get_instance(cur, slab_cache_t, link); 933 list_foreach(slab_cache_list, link, slab_cache_t, slab) { 941 934 if ((slab->flags & SLAB_CACHE_MAGDEFERRED) != 942 935 SLAB_CACHE_MAGDEFERRED)
Note:
See TracChangeset
for help on using the changeset viewer.