mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
[PATCH] Extract the allocpercpu functions from the slab allocator
The allocpercpu functions __alloc_percpu and __free_percpu() are heavily using the slab allocator. However, they are conceptually slab. This also simplifies SLOB (at this point slob may be broken in mm. This should fix it). Signed-off-by: Christoph Lameter <[email protected]> Cc: Matt Mackall <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
39bbcb8f88
commit
d00bcc98d7
4 changed files with 130 additions and 170 deletions
45
mm/slob.c
45
mm/slob.c
|
|
@ -343,48 +343,3 @@ void kmem_cache_init(void)
|
|||
atomic_t slab_reclaim_pages = ATOMIC_INIT(0);
|
||||
EXPORT_SYMBOL(slab_reclaim_pages);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
void *__alloc_percpu(size_t size)
|
||||
{
|
||||
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);
|
||||
|
||||
unwind_oom:
|
||||
while (--i >= 0) {
|
||||
if (!cpu_possible(i))
|
||||
continue;
|
||||
kfree(pdata->ptrs[i]);
|
||||
}
|
||||
kfree(pdata);
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(__alloc_percpu);
|
||||
|
||||
void
|
||||
free_percpu(const void *objp)
|
||||
{
|
||||
int i;
|
||||
struct percpu_data *p = (struct percpu_data *) (~(unsigned long) objp);
|
||||
|
||||
for_each_possible_cpu(i)
|
||||
kfree(p->ptrs[i]);
|
||||
|
||||
kfree(p);
|
||||
}
|
||||
EXPORT_SYMBOL(free_percpu);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in a new issue