/trunk/kernel/doc/mm |
---|
80,7 → 80,7 |
will never return NULL, but it CAN sleep indefinitely. The caller |
does not have to check the return value. |
3) The maximum size that can be allocated using malloc is 128K |
3) The maximum size that can be allocated using malloc is 256K |
Rules 1) and 2) apply to slab_alloc as well. Using SLAB allocator |
to allocate too large values is not recommended. |
/trunk/kernel/generic/include/mm/slab.h |
---|
68,13 → 68,13 |
count_t busy; /**< Count of full slots in magazine */ |
count_t size; /**< Number of slots in magazine */ |
void *objs[0]; /**< Slots in magazine */ |
}slab_magazine_t; |
} slab_magazine_t; |
typedef struct { |
slab_magazine_t *current; |
slab_magazine_t *last; |
SPINLOCK_DECLARE(lock); |
}slab_mag_cache_t; |
} slab_mag_cache_t; |
typedef struct { |
82,14 → 82,14 |
link_t link; |
/* Configuration */ |
size_t size; /**< Size of slab position - align_up(sizeof(obj)) */ |
size_t size; /**< Size of slab position - align_up(sizeof(obj)) */ |
int (*constructor)(void *obj, int kmflag); |
int (*destructor)(void *obj); |
int flags; /**< Flags changing behaviour of cache */ |
int flags; /**< Flags changing behaviour of cache */ |
/* Computed values */ |
uint8_t order; /**< Order of frames to be allocated */ |
int objects; /**< Number of objects that fit in */ |
uint8_t order; /**< Order of frames to be allocated */ |
int objects; /**< Number of objects that fit in */ |
/* Statistics */ |
atomic_t allocated_slabs; |
98,16 → 98,16 |
atomic_t magazine_counter; /**< How many magazines in magazines list */ |
/* Slabs */ |
link_t full_slabs; /**< List of full slabs */ |
link_t partial_slabs; /**< List of partial slabs */ |
link_t full_slabs; /**< List of full slabs */ |
link_t partial_slabs; /**< List of partial slabs */ |
SPINLOCK_DECLARE(slablock); |
/* Magazines */ |
link_t magazines; /**< List o full magazines */ |
link_t magazines /**< List o full magazines */ |
SPINLOCK_DECLARE(maglock); |
/** CPU cache */ |
slab_mag_cache_t *mag_cache; |
}slab_cache_t; |
} slab_cache_t; |
extern slab_cache_t * slab_cache_create(char *name, |
size_t size, |
/trunk/kernel/generic/src/mm/slab.c |
---|
137,11 → 137,11 |
/** Slab descriptor */ |
typedef struct { |
slab_cache_t *cache; /**< Pointer to parent cache */ |
link_t link; /* List of full/partial slabs */ |
void *start; /**< Start address of first available item */ |
count_t available; /**< Count of available items in this slab */ |
index_t nextavail; /**< The index of next available item */ |
slab_cache_t *cache; /**< Pointer to parent cache. */ |
link_t link; /**< List of full/partial slabs. */ |
void *start; /**< Start address of first available item. */ |
count_t available; /**< Count of available items in this slab. */ |
index_t nextavail; /**< The index of next available item. */ |
}slab_t; |
#ifdef CONFIG_DEBUG |
289,9 → 289,7 |
return NULL; |
spinlock_lock(&cache->slablock); |
} else { |
slab = list_get_instance(cache->partial_slabs.next, |
slab_t, |
link); |
slab = list_get_instance(cache->partial_slabs.next, slab_t, link); |
list_remove(&slab->link); |
} |
obj = slab->start + slab->nextavail * cache->size; |
298,7 → 296,7 |
slab->nextavail = *((int *)obj); |
slab->available--; |
if (! slab->available) |
if (!slab->available) |
list_prepend(&slab->link, &cache->full_slabs); |
else |
list_prepend(&slab->link, &cache->partial_slabs); |
899,7 → 897,8 |
{ |
slab_t *slab; |
if (!obj) return; |
if (!obj) |
return; |
slab = obj2slab(obj); |
_slab_free(slab->cache, obj, slab); |