Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 813 → Rev 814

/kernel/trunk/generic/src/mm/slab.c
96,7 → 96,6
#include <adt/list.h>
#include <memstr.h>
#include <align.h>
#include <mm/heap.h>
#include <mm/frame.h>
#include <config.h>
#include <print.h>
154,11 → 153,12
slab_t *slab;
size_t fsize;
int i;
zone_t *zone = NULL;
int status;
frame_t *frame;
 
data = (void *)frame_alloc_rc_zone(cache->order, FRAME_KA | flags, &status, &zone);
pfn_t pfn;
int zone=0;
pfn = frame_alloc_rc_zone(cache->order, FRAME_KA | flags, &status, &zone);
data = (void *) PA2KA(PFN2ADDR(pfn));
if (status != FRAME_OK) {
return NULL;
}
165,7 → 165,7
if (! (cache->flags & SLAB_CACHE_SLINSIDE)) {
slab = slab_alloc(slab_extern_cache, flags);
if (!slab) {
frame_free((__address)data);
frame_free(ADDR2PFN(KA2PA(data)));
return NULL;
}
} else {
174,11 → 174,8
}
/* Fill in slab structures */
/* TODO: some better way of accessing the frame */
for (i=0; i < (1 << cache->order); i++) {
frame = ADDR2FRAME(zone, KA2PA((__address)(data+i*PAGE_SIZE)));
frame->parent = slab;
}
for (i=0; i < (1 << cache->order); i++)
frame_set_parent(pfn+i, slab, zone);
 
slab->start = data;
slab->available = cache->objects;
199,7 → 196,7
*/
static count_t slab_space_free(slab_cache_t *cache, slab_t *slab)
{
frame_free((__address)slab->start);
frame_free(ADDR2PFN(KA2PA(slab->start)));
if (! (cache->flags & SLAB_CACHE_SLINSIDE))
slab_free(slab_extern_cache, slab);
 
211,10 → 208,7
/** Map object to slab structure */
static slab_t * obj2slab(void *obj)
{
frame_t *frame;
 
frame = frame_addr2frame((__address)obj);
return (slab_t *)frame->parent;
return (slab_t *)frame_get_parent(ADDR2PFN(KA2PA(obj)), 0);
}
 
/**************************************/
725,8 → 719,9
/* Disable interrupts to avoid deadlocks with interrupt handlers */
ipl = interrupts_disable();
 
if (!(cache->flags & SLAB_CACHE_NOMAGAZINE))
if (!(cache->flags & SLAB_CACHE_NOMAGAZINE)) {
result = magazine_obj_get(cache);
}
if (!result)
result = slab_obj_create(cache, flags);