/kernel/trunk/test/mm/slab1/test.c |
---|
45,9 → 45,7 |
printf("Creating cache, object size: %d.\n", size); |
cache = slab_cache_create("test_cache", size, 0, NULL, NULL, |
SLAB_CACHE_NOMAGAZINE); |
slab_print_list(); |
SLAB_CACHE_NOMAGAZINE); |
printf("Allocating %d items...", count); |
for (i=0; i < count; i++) { |
data[i] = slab_alloc(cache, 0); |
67,7 → 65,6 |
} |
printf("done.\n"); |
slab_print_list(); |
printf("Freeing %d items...", count/2); |
for (i=count-1; i >= count/2; i--) { |
slab_free(cache, data[i]); |
128,7 → 125,6 |
slab_free(thr_cache, thr_data[offs][i]); |
} |
printf("Thread #%d finished\n", THREAD->tid); |
slab_print_list(); |
semaphore_up(&thr_sem); |
} |
/kernel/trunk/generic/include/bitops.h |
---|
40,11 → 40,11 |
{ |
int n = 0; |
if (arg & 0xffff0000) { arg >>= 16;n += 16;} |
if (arg & 0xff00) { arg >>= 8; n += 8;} |
if (arg & 0xf0) { arg >>= 4; n += 4;} |
if (arg & 0xc) { arg >>= 2; n+=2;} |
if (arg & 0x2) { arg >>= 1; n+=1;} |
if (arg >> 16) { arg >>= 16;n += 16;} |
if (arg >> 8) { arg >>= 8; n += 8;} |
if (arg >> 4) { arg >>= 4; n += 4;} |
if (arg >> 2) { arg >>= 2; n+=2;} |
if (arg >> 1) { arg >>= 1; n+=1;} |
return n; |
} |
52,12 → 52,7 |
{ |
int n = 0; |
/* This is because mips complains about big numbers, |
* other platforms should optimize it out */ |
__u64 oper = 0xffffffff; |
oper <<= 32; |
if (arg & oper) { arg >>= 32;n += 32;} |
if (arg >> 32) { arg >>= 32;n += 32;} |
return n + fnzb32((__u32) arg); |
} |
/kernel/trunk/generic/src/mm/slab.c |
---|
365,6 → 365,9 |
slab_magazine_t *mag; |
void *obj; |
if (!CPU) |
return NULL; |
spinlock_lock(&cache->mag_cache[CPU->id].lock); |
mag = get_full_current_mag(cache); |
435,6 → 438,9 |
{ |
slab_magazine_t *mag; |
if (!CPU) |
return -1; |
spinlock_lock(&cache->mag_cache[CPU->id].lock); |
mag = make_empty_current_mag(cache); |
507,9 → 513,12 |
list_initialize(&cache->magazines); |
spinlock_initialize(&cache->lock, "cachelock"); |
if (! (cache->flags & SLAB_CACHE_NOMAGAZINE)) { |
for (i=0; i< config.cpu_count; i++) |
for (i=0; i< config.cpu_count; i++) { |
memsetb((__address)&cache->mag_cache[i], |
sizeof(cache->mag_cache[i]), 0); |
spinlock_initialize(&cache->mag_cache[i].lock, |
"cpucachelock"); |
} |
} |
/* Compute slab sizes, object counts in slabs etc. */ |
644,7 → 653,7 |
/* Disable interrupts to avoid deadlocks with interrupt handlers */ |
ipl = interrupts_disable(); |
if (!(cache->flags & SLAB_CACHE_NOMAGAZINE) && CPU) |
if (!(cache->flags & SLAB_CACHE_NOMAGAZINE)) |
result = magazine_obj_get(cache); |
if (!result) { |
669,9 → 678,7 |
ipl = interrupts_disable(); |
if ((cache->flags & SLAB_CACHE_NOMAGAZINE) \ |
|| !CPU \ |
|| magazine_obj_put(cache, obj)) { |
spinlock_lock(&cache->lock); |
slab_obj_destroy(cache, obj, slab); |
spinlock_unlock(&cache->lock); |