X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=mm%2Fslob.c;h=5adc29cb58dd5768044380b414f5818158a5b2be;hb=a2f44b27303a5353859d77a3e96a1d3f33f56ab7;hp=7b52b20b9607f9c3be1f1244b4c5b14dce07f4a7;hpb=3944158a6d33f94668dbd6bdc32ff5c67bb53ec2;p=linux-2.6.git diff --git a/mm/slob.c b/mm/slob.c index 7b52b20b9..5adc29cb5 100644 --- a/mm/slob.c +++ b/mm/slob.c @@ -60,6 +60,8 @@ static DEFINE_SPINLOCK(slob_lock); static DEFINE_SPINLOCK(block_lock); static void slob_free(void *b, int size); +static void slob_timer_cbk(void); + static void *slob_alloc(size_t size, gfp_t gfp, int align) { @@ -157,7 +159,7 @@ static int fastcall find_order(int size) return order; } -void *kmalloc(size_t size, gfp_t gfp) +void *__kmalloc(size_t size, gfp_t gfp) { slob_t *m; bigblock_t *bb; @@ -186,8 +188,7 @@ void *kmalloc(size_t size, gfp_t gfp) slob_free(bb, sizeof(bigblock_t)); return 0; } - -EXPORT_SYMBOL(kmalloc); +EXPORT_SYMBOL(__kmalloc); void kfree(const void *block) { @@ -270,10 +271,9 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, } EXPORT_SYMBOL(kmem_cache_create); -int kmem_cache_destroy(struct kmem_cache *c) +void kmem_cache_destroy(struct kmem_cache *c) { slob_free(c, sizeof(struct kmem_cache)); - return 0; } EXPORT_SYMBOL(kmem_cache_destroy); @@ -328,63 +328,30 @@ const char *kmem_cache_name(struct kmem_cache *c) EXPORT_SYMBOL(kmem_cache_name); static struct timer_list slob_timer = TIMER_INITIALIZER( - (void (*)(unsigned long))kmem_cache_init, 0, 0); + (void (*)(unsigned long))slob_timer_cbk, 0, 0); -void kmem_cache_init(void) +int kmem_cache_shrink(struct kmem_cache *d) { - void *p = slob_alloc(PAGE_SIZE, 0, PAGE_SIZE-1); - - if (p) - free_page((unsigned long)p); - - mod_timer(&slob_timer, jiffies + HZ); + return 0; } +EXPORT_SYMBOL(kmem_cache_shrink); -atomic_t slab_reclaim_pages = ATOMIC_INIT(0); -EXPORT_SYMBOL(slab_reclaim_pages); - -#ifdef CONFIG_SMP - -void *__alloc_percpu(size_t size) +int kmem_ptr_validate(struct kmem_cache *a, const void *b) { - int i; - struct percpu_data *pdata = kmalloc(sizeof (*pdata), GFP_KERNEL); - - if (!pdata) - return NULL; - - for_each_possible_cpu(i) { - pdata->ptrs[i] = kmalloc(size, GFP_KERNEL); - if (!pdata->ptrs[i]) - goto unwind_oom; - memset(pdata->ptrs[i], 0, size); - } - - /* Catch derefs w/o wrappers */ - return (void *) (~(unsigned long) pdata); + return 0; +} -unwind_oom: - while (--i >= 0) { - if (!cpu_possible(i)) - continue; - kfree(pdata->ptrs[i]); - } - kfree(pdata); - return NULL; +void __init kmem_cache_init(void) +{ + slob_timer_cbk(); } -EXPORT_SYMBOL(__alloc_percpu); -void -free_percpu(const void *objp) +static void slob_timer_cbk(void) { - int i; - struct percpu_data *p = (struct percpu_data *) (~(unsigned long) objp); + void *p = slob_alloc(PAGE_SIZE, 0, PAGE_SIZE-1); - for_each_possible_cpu(i) - kfree(p->ptrs[i]); + if (p) + free_page((unsigned long)p); - kfree(p); + mod_timer(&slob_timer, jiffies + HZ); } -EXPORT_SYMBOL(free_percpu); - -#endif