Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 1949 → Rev 1950

/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);