Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 763 → Rev 764

/kernel/trunk/test/mm/slab1/test.c
43,7 → 43,6
 
printf("Creating cache.\n");
cache = slab_cache_create("test_cache", VAL_SIZE, 0, NULL, NULL, SLAB_CACHE_NOMAGAZINE);
slab_print_list();
printf("Destroying cache.\n");
slab_cache_destroy(cache);
 
61,4 → 60,32
slab_free(cache, data[i]);
}
printf("done.\n");
 
printf("Allocating %d items...", VAL_COUNT);
for (i=0; i < VAL_COUNT; i++) {
data[i] = slab_alloc(cache, 0);
}
printf("done.\n");
 
slab_print_list();
printf("Freeing %d items...", VAL_COUNT/2);
for (i=VAL_COUNT-1; i >= VAL_COUNT/2; i--) {
slab_free(cache, data[i]);
}
printf("done.\n");
 
printf("Allocating %d items...", VAL_COUNT/2);
for (i=VAL_COUNT/2; i < VAL_COUNT; i++) {
data[i] = slab_alloc(cache, 0);
}
printf("done.\n");
printf("Freeing %d items...", VAL_COUNT);
for (i=0; i < VAL_COUNT; i++) {
slab_free(cache, data[i]);
}
printf("done.\n");
slab_print_list();
slab_cache_destroy(cache);
 
printf("Test complete.\n");
}
/kernel/trunk/generic/include/mm/slab.h
31,6 → 31,7
 
#include <list.h>
#include <synch/spinlock.h>
#include <arch/atomic.h>
 
/** Initial Magazine size (TODO: dynamically growing magazines) */
#define SLAB_MAG_SIZE 4
72,6 → 73,8
int objects; /**< Number of objects that fit in */
 
/* Statistics */
atomic_t allocated_slabs;
atomic_t allocated_objs;
 
/* Slabs */
link_t full_slabs; /**< List of full slabs */
/kernel/trunk/generic/src/mm/slab.c
69,11 → 69,12
int i;
zone_t *zone = NULL;
int status;
frame_t *frame;
 
data = (void *)frame_alloc(FRAME_KA | flags, cache->order, &status, &zone);
if (status != FRAME_OK)
if (status != FRAME_OK) {
return NULL;
 
}
if (! cache->flags & SLAB_CACHE_SLINSIDE) {
slab = malloc(sizeof(*slab)); // , flags);
if (!slab) {
84,11 → 85,12
fsize = (PAGE_SIZE << cache->order);
slab = data + fsize - sizeof(*slab);
}
 
/* Fill in slab structures */
/* TODO: some better way of accessing the frame */
for (i=0; i< (1<<cache->order); i++) {
ADDR2FRAME(zone, (__address)(data+i*PAGE_SIZE))->parent = slab;
frame = ADDR2FRAME(zone, KA2PA((__address)(data+i*PAGE_SIZE)));
frame->parent = slab;
}
 
slab->start = data;
97,6 → 99,9
 
for (i=0; i<cache->objects;i++)
*((int *) (slab->start + i*cache->size)) = i+1;
 
atomic_inc(&cache->allocated_slabs);
 
return slab;
}
 
110,6 → 115,9
frame_free((__address)slab->start);
if (! cache->flags & SLAB_CACHE_SLINSIDE)
free(slab);
 
atomic_dec(&cache->allocated_slabs);
return 1 << cache->order;
}
 
153,7 → 161,7
if (slab->available == 1) {
/* It was in full, move to partial */
list_remove(&slab->link);
list_prepend(&cache->partial_slabs, &slab->link);
list_prepend(&slab->link, &cache->partial_slabs);
}
if (slab->available == cache->objects) {
/* Free associated memory */
191,8 → 199,9
spinlock_unlock(&cache->lock);
slab = slab_space_alloc(cache, flags);
spinlock_lock(&cache->lock);
if (!slab)
if (!slab) {
return NULL;
}
} else {
slab = list_get_instance(cache->partial_slabs.next,
slab_t,
203,9 → 212,9
slab->nextavail = *((int *)obj);
slab->available--;
if (! slab->available)
list_prepend(&cache->full_slabs, &slab->link);
list_prepend(&slab->link, &cache->full_slabs);
else
list_prepend(&cache->partial_slabs, &slab->link);
list_prepend(&slab->link, &cache->partial_slabs);
return obj;
}
 
315,7 → 324,7
mag = cache->mag_cache[CPU->id].last;
if (!mag || mag->size == mag->busy) {
if (mag)
list_prepend(&cache->magazines, &mag->link);
list_prepend(&mag->link, &cache->magazines);
 
mag = slab_alloc(&mag_cache, FRAME_ATOMIC | FRAME_NO_RECLAIM);
if (!mag)
533,8 → 542,12
spinlock_unlock(&cache->lock);
}
 
if (result)
atomic_inc(&cache->allocated_objs);
 
interrupts_restore(ipl);
 
 
return result;
}
 
552,6 → 565,7
slab_obj_destroy(cache, obj, NULL);
spinlock_unlock(&cache->lock);
}
atomic_dec(&cache->allocated_objs);
interrupts_restore(ipl);
}
 
582,10 → 596,13
link_t *cur;
 
spinlock_lock(&slab_cache_lock);
printf("SLAB name\tOsize\tOrder\n");
printf("SLAB name\tOsize\tOrder\tOcnt\tSlabs\tAllocobjs\n");
for (cur = slab_cache_list.next;cur!=&slab_cache_list; cur=cur->next) {
cache = list_get_instance(cur, slab_cache_t, link);
printf("%s\t%d\t%d\n", cache->name, cache->size, cache->order);
printf("%s\t%d\t%d\t%d\t%d\t%d\n", cache->name, cache->size,
cache->order, cache->objects,
atomic_get(&cache->allocated_slabs),
atomic_get(&cache->allocated_objs));
}
spinlock_unlock(&slab_cache_lock);
}
/kernel/trunk/generic/src/mm/frame.c
184,10 → 184,9
if (flags & FRAME_KA)
v = PA2KA(v);
if (flags & FRAME_ATOMIC) {
ASSERT(status != NULL);
if (status)
*status = FRAME_OK;
}
 
if (pzone)
*pzone = zone;
return v;
/kernel/trunk/arch/mips32/src/mm/tlb.c
366,7 → 366,7
* Handler cannot succeed if badvaddr has no mapping.
*/
if (!pte) {
printf("No such mapping.\n");
printf("No such mapping: %P.\n", badvaddr);
return NULL;
}