Ignore:
File:
1 edited

Legend:

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

    rcd3b380 r1066041  
    114114#include <bitops.h>
    115115#include <macros.h>
     116#include <cpu.h>
    116117
    117118IRQ_SPINLOCK_STATIC_INITIALIZE(slab_cache_lock);
     
    182183        size_t zone = 0;
    183184       
    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) {
    187187                return NULL;
    188        
    189         void *data = (void *) PA2KA(data_phys);
     188        }
    190189       
    191190        slab_t *slab;
     
    195194                slab = slab_alloc(slab_extern_cache, flags);
    196195                if (!slab) {
    197                         frame_free(KA2PA(data), cache->frames);
     196                        frame_free(KA2PA(data));
    198197                        return NULL;
    199198                }
    200199        } else {
    201                 fsize = FRAMES2SIZE(cache->frames);
     200                fsize = (PAGE_SIZE << cache->order);
    202201                slab = data + fsize - sizeof(*slab);
    203202        }
     
    205204        /* Fill in slab structures */
    206205        size_t i;
    207         for (i = 0; i < cache->frames; i++)
     206        for (i = 0; i < ((size_t) 1 << cache->order); i++)
    208207                frame_set_parent(ADDR2PFN(KA2PA(data)) + i, slab, zone);
    209208       
     
    227226NO_TRACE static size_t slab_space_free(slab_cache_t *cache, slab_t *slab)
    228227{
    229         frame_free(KA2PA(slab->start), slab->cache->frames);
     228        frame_free(KA2PA(slab->start));
    230229        if (!(cache->flags & SLAB_CACHE_SLINSIDE))
    231230                slab_free(slab_extern_cache, slab);
     
    233232        atomic_dec(&cache->allocated_slabs);
    234233       
    235         return cache->frames;
     234        return (1 << cache->order);
    236235}
    237236
     
    560559{
    561560        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;
    564563        else
    565                 return FRAMES2SIZE(cache->frames) / cache->size;
     564                return (PAGE_SIZE << cache->order) / cache->size;
    566565}
    567566
     
    572571{
    573572        size_t objects = comp_objects(cache);
    574         size_t ssize = FRAMES2SIZE(cache->frames);
     573        size_t ssize = PAGE_SIZE << cache->order;
    575574       
    576575        if (cache->flags & SLAB_CACHE_SLINSIDE)
     
    636635                cache->flags |= SLAB_CACHE_SLINSIDE;
    637636       
    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;
    640645       
    641646        while (badness(cache) > SLAB_MAX_BADNESS(cache))
    642                 cache->frames <<= 1;
     647                cache->order += 1;
    643648       
    644649        cache->objects = comp_objects(cache);
     
    806811       
    807812        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);
    809815                frames += _slab_reclaim(cache, flags);
    810816        }
     
    866872               
    867873                const char *name = cache->name;
    868                 size_t frames = cache->frames;
     874                uint8_t order = cache->order;
    869875                size_t size = cache->size;
    870876                size_t objects = cache->objects;
     
    876882                irq_spinlock_unlock(&slab_cache_lock, true);
    877883               
    878                 printf("%-18s %8zu %8zu %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,
    880886                    cached_objs, allocated_objs,
    881887                    flags & SLAB_CACHE_SLINSIDE ? "in" : "out");
     
    931937        irq_spinlock_lock(&slab_cache_lock, false);
    932938       
    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);
    934941                if ((slab->flags & SLAB_CACHE_MAGDEFERRED) !=
    935942                    SLAB_CACHE_MAGDEFERRED)
Note: See TracChangeset for help on using the changeset viewer.