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