Ignore:
File:
1 edited

Legend:

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

    r7ec3c56 rf97f1e51  
    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         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) {
    188186                return NULL;
    189        
    190         void *data = (void *) PA2KA(data_phys);
     187        }
    191188       
    192189        slab_t *slab;
     
    196193                slab = slab_alloc(slab_extern_cache, flags);
    197194                if (!slab) {
    198                         frame_free(KA2PA(data), cache->frames);
     195                        frame_free(KA2PA(data));
    199196                        return NULL;
    200197                }
    201198        } else {
    202                 fsize = FRAMES2SIZE(cache->frames);
     199                fsize = (PAGE_SIZE << cache->order);
    203200                slab = data + fsize - sizeof(*slab);
    204201        }
     
    206203        /* Fill in slab structures */
    207204        size_t i;
    208         for (i = 0; i < cache->frames; i++)
     205        for (i = 0; i < ((size_t) 1 << cache->order); i++)
    209206                frame_set_parent(ADDR2PFN(KA2PA(data)) + i, slab, zone);
    210207       
     
    228225NO_TRACE static size_t slab_space_free(slab_cache_t *cache, slab_t *slab)
    229226{
    230         frame_free(KA2PA(slab->start), slab->cache->frames);
     227        frame_free(KA2PA(slab->start));
    231228        if (!(cache->flags & SLAB_CACHE_SLINSIDE))
    232229                slab_free(slab_extern_cache, slab);
     
    234231        atomic_dec(&cache->allocated_slabs);
    235232       
    236         return cache->frames;
     233        return (1 << cache->order);
    237234}
    238235
     
    561558{
    562559        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;
    565562        else
    566                 return FRAMES2SIZE(cache->frames) / cache->size;
     563                return (PAGE_SIZE << cache->order) / cache->size;
    567564}
    568565
     
    573570{
    574571        size_t objects = comp_objects(cache);
    575         size_t ssize = FRAMES2SIZE(cache->frames);
     572        size_t ssize = PAGE_SIZE << cache->order;
    576573       
    577574        if (cache->flags & SLAB_CACHE_SLINSIDE)
     
    610607    unsigned int kmflag), size_t (*destructor)(void *obj), unsigned int flags)
    611608{
    612         ASSERT(size > 0);
    613        
    614609        memsetb(cache, sizeof(*cache), 0);
    615610        cache->name = name;
     
    639634                cache->flags |= SLAB_CACHE_SLINSIDE;
    640635       
    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;
    643644       
    644645        while (badness(cache) > SLAB_MAX_BADNESS(cache))
    645                 cache->frames <<= 1;
     646                cache->order += 1;
    646647       
    647648        cache->objects = comp_objects(cache);
     
    809810       
    810811        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);
    812814                frames += _slab_reclaim(cache, flags);
    813815        }
     
    869871               
    870872                const char *name = cache->name;
    871                 size_t frames = cache->frames;
     873                uint8_t order = cache->order;
    872874                size_t size = cache->size;
    873875                size_t objects = cache->objects;
     
    879881                irq_spinlock_unlock(&slab_cache_lock, true);
    880882               
    881                 printf("%-18s %8zu %8zu %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,
    883885                    cached_objs, allocated_objs,
    884886                    flags & SLAB_CACHE_SLINSIDE ? "in" : "out");
     
    890892        /* Initialize magazine cache */
    891893        _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*),
    893895            sizeof(uintptr_t), NULL, NULL, SLAB_CACHE_NOMAGAZINE |
    894896            SLAB_CACHE_SLINSIDE);
     
    934936        irq_spinlock_lock(&slab_cache_lock, false);
    935937       
    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);
    937940                if ((slab->flags & SLAB_CACHE_MAGDEFERRED) !=
    938941                    SLAB_CACHE_MAGDEFERRED)
Note: See TracChangeset for help on using the changeset viewer.