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