Ignore:
File:
1 edited

Legend:

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

    rcd3b380 rfeeac0d  
    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 = (void *)
     185            PA2KA(frame_alloc_generic(cache->order, flags, 0, &zone));
     186        if (!data)
    187187                return NULL;
    188        
    189         void *data = (void *) PA2KA(data_phys);
    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);
     
    866870               
    867871                const char *name = cache->name;
    868                 size_t frames = cache->frames;
     872                uint8_t order = cache->order;
    869873                size_t size = cache->size;
    870874                size_t objects = cache->objects;
     
    876880                irq_spinlock_unlock(&slab_cache_lock, true);
    877881               
    878                 printf("%-18s %8zu %8zu %8zu %8ld %8ld %8ld %-5s\n",
    879                     name, size, frames, objects, allocated_slabs,
     882                printf("%-18s %8zu %8u %8zu %8ld %8ld %8ld %-5s\n",
     883                    name, size, (1 << order), objects, allocated_slabs,
    880884                    cached_objs, allocated_objs,
    881885                    flags & SLAB_CACHE_SLINSIDE ? "in" : "out");
Note: See TracChangeset for help on using the changeset viewer.