Ignore:
File:
1 edited

Legend:

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

    rcd3b380 rf97f1e51  
    182182        size_t zone = 0;
    183183       
    184         uintptr_t data_phys =
    185             frame_alloc_generic(cache->frames, flags, 0, &zone);
    186         if (!data_phys)
     184        void *data = frame_alloc_generic(cache->order, FRAME_KA | flags, &zone);
     185        if (!data) {
    187186                return NULL;
    188        
    189         void *data = (void *) PA2KA(data_phys);
     187        }
    190188       
    191189        slab_t *slab;
     
    195193                slab = slab_alloc(slab_extern_cache, flags);
    196194                if (!slab) {
    197                         frame_free(KA2PA(data), cache->frames);
     195                        frame_free(KA2PA(data));
    198196                        return NULL;
    199197                }
    200198        } else {
    201                 fsize = FRAMES2SIZE(cache->frames);
     199                fsize = (PAGE_SIZE << cache->order);
    202200                slab = data + fsize - sizeof(*slab);
    203201        }
     
    205203        /* Fill in slab structures */
    206204        size_t i;
    207         for (i = 0; i < cache->frames; i++)
     205        for (i = 0; i < ((size_t) 1 << cache->order); i++)
    208206                frame_set_parent(ADDR2PFN(KA2PA(data)) + i, slab, zone);
    209207       
     
    227225NO_TRACE static size_t slab_space_free(slab_cache_t *cache, slab_t *slab)
    228226{
    229         frame_free(KA2PA(slab->start), slab->cache->frames);
     227        frame_free(KA2PA(slab->start));
    230228        if (!(cache->flags & SLAB_CACHE_SLINSIDE))
    231229                slab_free(slab_extern_cache, slab);
     
    233231        atomic_dec(&cache->allocated_slabs);
    234232       
    235         return cache->frames;
     233        return (1 << cache->order);
    236234}
    237235
     
    560558{
    561559        if (cache->flags & SLAB_CACHE_SLINSIDE)
    562                 return (FRAMES2SIZE(cache->frames) - sizeof(slab_t)) /
    563                     cache->size;
     560                return ((PAGE_SIZE << cache->order)
     561                    - sizeof(slab_t)) / cache->size;
    564562        else
    565                 return FRAMES2SIZE(cache->frames) / cache->size;
     563                return (PAGE_SIZE << cache->order) / cache->size;
    566564}
    567565
     
    572570{
    573571        size_t objects = comp_objects(cache);
    574         size_t ssize = FRAMES2SIZE(cache->frames);
     572        size_t ssize = PAGE_SIZE << cache->order;
    575573       
    576574        if (cache->flags & SLAB_CACHE_SLINSIDE)
     
    636634                cache->flags |= SLAB_CACHE_SLINSIDE;
    637635       
    638         /* Minimum slab frames */
    639         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;
    640644       
    641645        while (badness(cache) > SLAB_MAX_BADNESS(cache))
    642                 cache->frames <<= 1;
     646                cache->order += 1;
    643647       
    644648        cache->objects = comp_objects(cache);
     
    806810       
    807811        size_t frames = 0;
    808         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);
    809814                frames += _slab_reclaim(cache, flags);
    810815        }
     
    866871               
    867872                const char *name = cache->name;
    868                 size_t frames = cache->frames;
     873                uint8_t order = cache->order;
    869874                size_t size = cache->size;
    870875                size_t objects = cache->objects;
     
    876881                irq_spinlock_unlock(&slab_cache_lock, true);
    877882               
    878                 printf("%-18s %8zu %8zu %8zu %8ld %8ld %8ld %-5s\n",
    879                     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,
    880885                    cached_objs, allocated_objs,
    881886                    flags & SLAB_CACHE_SLINSIDE ? "in" : "out");
     
    931936        irq_spinlock_lock(&slab_cache_lock, false);
    932937       
    933         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);
    934940                if ((slab->flags & SLAB_CACHE_MAGDEFERRED) !=
    935941                    SLAB_CACHE_MAGDEFERRED)
Note: See TracChangeset for help on using the changeset viewer.