Ignore:
File:
1 edited

Legend:

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

    rf97f1e51 r7ec3c56  
    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         void *data = frame_alloc_generic(cache->order, FRAME_KA | flags, &zone);
    185         if (!data) {
     185        uintptr_t data_phys =
     186            frame_alloc_generic(cache->frames, flags, 0, &zone);
     187        if (!data_phys)
    186188                return NULL;
    187         }
     189       
     190        void *data = (void *) PA2KA(data_phys);
    188191       
    189192        slab_t *slab;
     
    193196                slab = slab_alloc(slab_extern_cache, flags);
    194197                if (!slab) {
    195                         frame_free(KA2PA(data));
     198                        frame_free(KA2PA(data), cache->frames);
    196199                        return NULL;
    197200                }
    198201        } else {
    199                 fsize = (PAGE_SIZE << cache->order);
     202                fsize = FRAMES2SIZE(cache->frames);
    200203                slab = data + fsize - sizeof(*slab);
    201204        }
     
    203206        /* Fill in slab structures */
    204207        size_t i;
    205         for (i = 0; i < ((size_t) 1 << cache->order); i++)
     208        for (i = 0; i < cache->frames; i++)
    206209                frame_set_parent(ADDR2PFN(KA2PA(data)) + i, slab, zone);
    207210       
     
    225228NO_TRACE static size_t slab_space_free(slab_cache_t *cache, slab_t *slab)
    226229{
    227         frame_free(KA2PA(slab->start));
     230        frame_free(KA2PA(slab->start), slab->cache->frames);
    228231        if (!(cache->flags & SLAB_CACHE_SLINSIDE))
    229232                slab_free(slab_extern_cache, slab);
     
    231234        atomic_dec(&cache->allocated_slabs);
    232235       
    233         return (1 << cache->order);
     236        return cache->frames;
    234237}
    235238
     
    558561{
    559562        if (cache->flags & SLAB_CACHE_SLINSIDE)
    560                 return ((PAGE_SIZE << cache->order)
    561                     - sizeof(slab_t)) / cache->size;
     563                return (FRAMES2SIZE(cache->frames) - sizeof(slab_t)) /
     564                    cache->size;
    562565        else
    563                 return (PAGE_SIZE << cache->order) / cache->size;
     566                return FRAMES2SIZE(cache->frames) / cache->size;
    564567}
    565568
     
    570573{
    571574        size_t objects = comp_objects(cache);
    572         size_t ssize = PAGE_SIZE << cache->order;
     575        size_t ssize = FRAMES2SIZE(cache->frames);
    573576       
    574577        if (cache->flags & SLAB_CACHE_SLINSIDE)
     
    607610    unsigned int kmflag), size_t (*destructor)(void *obj), unsigned int flags)
    608611{
     612        ASSERT(size > 0);
     613       
    609614        memsetb(cache, sizeof(*cache), 0);
    610615        cache->name = name;
     
    634639                cache->flags |= SLAB_CACHE_SLINSIDE;
    635640       
    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;
     641        /* Minimum slab frames */
     642        cache->frames = SIZE2FRAMES(cache->size);
    644643       
    645644        while (badness(cache) > SLAB_MAX_BADNESS(cache))
    646                 cache->order += 1;
     645                cache->frames <<= 1;
    647646       
    648647        cache->objects = comp_objects(cache);
     
    810809       
    811810        size_t frames = 0;
    812         list_foreach(slab_cache_list, cur) {
    813                 slab_cache_t *cache = list_get_instance(cur, slab_cache_t, link);
     811        list_foreach(slab_cache_list, link, slab_cache_t, cache) {
    814812                frames += _slab_reclaim(cache, flags);
    815813        }
     
    871869               
    872870                const char *name = cache->name;
    873                 uint8_t order = cache->order;
     871                size_t frames = cache->frames;
    874872                size_t size = cache->size;
    875873                size_t objects = cache->objects;
     
    881879                irq_spinlock_unlock(&slab_cache_lock, true);
    882880               
    883                 printf("%-18s %8zu %8u %8zu %8ld %8ld %8ld %-5s\n",
    884                     name, size, (1 << order), objects, allocated_slabs,
     881                printf("%-18s %8zu %8zu %8zu %8ld %8ld %8ld %-5s\n",
     882                    name, size, frames, objects, allocated_slabs,
    885883                    cached_objs, allocated_objs,
    886884                    flags & SLAB_CACHE_SLINSIDE ? "in" : "out");
     
    892890        /* Initialize magazine cache */
    893891        _slab_cache_create(&mag_cache, "slab_magazine_t",
    894             sizeof(slab_magazine_t) + SLAB_MAG_SIZE * sizeof(void*),
     892            sizeof(slab_magazine_t) + SLAB_MAG_SIZE * sizeof(void *),
    895893            sizeof(uintptr_t), NULL, NULL, SLAB_CACHE_NOMAGAZINE |
    896894            SLAB_CACHE_SLINSIDE);
     
    936934        irq_spinlock_lock(&slab_cache_lock, false);
    937935       
    938         list_foreach(slab_cache_list, cur) {
    939                 slab_cache_t *slab = list_get_instance(cur, slab_cache_t, link);
     936        list_foreach(slab_cache_list, link, slab_cache_t, slab) {
    940937                if ((slab->flags & SLAB_CACHE_MAGDEFERRED) !=
    941938                    SLAB_CACHE_MAGDEFERRED)
Note: See TracChangeset for help on using the changeset viewer.