Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/mm/slab.c

    r1066041 rcd3b380  
    114114#include <bitops.h>
    115115#include <macros.h>
    116 #include <cpu.h>
    117116
    118117IRQ_SPINLOCK_STATIC_INITIALIZE(slab_cache_lock);
     
    183182        size_t zone = 0;
    184183       
    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)
    187187                return NULL;
    188         }
     188       
     189        void *data = (void *) PA2KA(data_phys);
    189190       
    190191        slab_t *slab;
     
    194195                slab = slab_alloc(slab_extern_cache, flags);
    195196                if (!slab) {
    196                         frame_free(KA2PA(data));
     197                        frame_free(KA2PA(data), cache->frames);
    197198                        return NULL;
    198199                }
    199200        } else {
    200                 fsize = (PAGE_SIZE << cache->order);
     201                fsize = FRAMES2SIZE(cache->frames);
    201202                slab = data + fsize - sizeof(*slab);
    202203        }
     
    204205        /* Fill in slab structures */
    205206        size_t i;
    206         for (i = 0; i < ((size_t) 1 << cache->order); i++)
     207        for (i = 0; i < cache->frames; i++)
    207208                frame_set_parent(ADDR2PFN(KA2PA(data)) + i, slab, zone);
    208209       
     
    226227NO_TRACE static size_t slab_space_free(slab_cache_t *cache, slab_t *slab)
    227228{
    228         frame_free(KA2PA(slab->start));
     229        frame_free(KA2PA(slab->start), slab->cache->frames);
    229230        if (!(cache->flags & SLAB_CACHE_SLINSIDE))
    230231                slab_free(slab_extern_cache, slab);
     
    232233        atomic_dec(&cache->allocated_slabs);
    233234       
    234         return (1 << cache->order);
     235        return cache->frames;
    235236}
    236237
     
    559560{
    560561        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;
    563564        else
    564                 return (PAGE_SIZE << cache->order) / cache->size;
     565                return FRAMES2SIZE(cache->frames) / cache->size;
    565566}
    566567
     
    571572{
    572573        size_t objects = comp_objects(cache);
    573         size_t ssize = PAGE_SIZE << cache->order;
     574        size_t ssize = FRAMES2SIZE(cache->frames);
    574575       
    575576        if (cache->flags & SLAB_CACHE_SLINSIDE)
     
    635636                cache->flags |= SLAB_CACHE_SLINSIDE;
    636637       
    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);
    645640       
    646641        while (badness(cache) > SLAB_MAX_BADNESS(cache))
    647                 cache->order += 1;
     642                cache->frames <<= 1;
    648643       
    649644        cache->objects = comp_objects(cache);
     
    811806       
    812807        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) {
    815809                frames += _slab_reclaim(cache, flags);
    816810        }
     
    872866               
    873867                const char *name = cache->name;
    874                 uint8_t order = cache->order;
     868                size_t frames = cache->frames;
    875869                size_t size = cache->size;
    876870                size_t objects = cache->objects;
     
    882876                irq_spinlock_unlock(&slab_cache_lock, true);
    883877               
    884                 printf("%-18s %8zu %8u %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,
    886880                    cached_objs, allocated_objs,
    887881                    flags & SLAB_CACHE_SLINSIDE ? "in" : "out");
     
    937931        irq_spinlock_lock(&slab_cache_lock, false);
    938932       
    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) {
    941934                if ((slab->flags & SLAB_CACHE_MAGDEFERRED) !=
    942935                    SLAB_CACHE_MAGDEFERRED)
Note: See TracChangeset for help on using the changeset viewer.