mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
percpu: use dynamic percpu allocator as the default percpu allocator
This patch makes most !CONFIG_HAVE_SETUP_PER_CPU_AREA archs use dynamic percpu allocator. The first chunk is allocated using embedding helper and 8k is reserved for modules. This ensures that the new allocator behaves almost identically to the original allocator as long as static percpu variables are concerned, so it shouldn't introduce much breakage. s390 and alpha use custom SHIFT_PERCPU_PTR() to work around addressing range limit the addressing model imposes. Unfortunately, this breaks if the address is specified using a variable, so for now, the two archs aren't converted. The following architectures are affected by this change. * sh * arm * cris * mips * sparc(32) * blackfin * avr32 * parisc (broken, under investigation) * m32r * powerpc(32) As this change makes the dynamic allocator the default one, CONFIG_HAVE_DYNAMIC_PER_CPU_AREA is replaced with its invert - CONFIG_HAVE_LEGACY_PER_CPU_AREA, which is added to yet-to-be converted archs. These archs implement their own setup_per_cpu_areas() and the conversion is not trivial. * powerpc(64) * sparc(64) * ia64 * alpha * s390 Boot and batch alloc/free tests on x86_32 with debug code (x86_32 doesn't use default first chunk initialization). Compile tested on sparc(32), powerpc(32), arm and alpha. Kyle McMartin reported that this change breaks parisc. The problem is still under investigation and he is okay with pushing this patch forward and fixing parisc later. [ Impact: use dynamic allocator for most archs w/o custom percpu setup ] Signed-off-by: Tejun Heo <[email protected]> Acked-by: Rusty Russell <[email protected]> Acked-by: David S. Miller <[email protected]> Acked-by: Benjamin Herrenschmidt <[email protected]> Acked-by: Martin Schwidefsky <[email protected]> Reviewed-by: Christoph Lameter <[email protected]> Cc: Paul Mundt <[email protected]> Cc: Russell King <[email protected]> Cc: Mikael Starvik <[email protected]> Cc: Ralf Baechle <[email protected]> Cc: Bryan Wu <[email protected]> Cc: Kyle McMartin <[email protected]> Cc: Matthew Wilcox <[email protected]> Cc: Grant Grundler <[email protected]> Cc: Hirokazu Takata <[email protected]> Cc: Richard Henderson <[email protected]> Cc: Ivan Kokshaysky <[email protected]> Cc: Heiko Carstens <[email protected]> Cc: Ingo Molnar <[email protected]>
This commit is contained in:
parent
0017c869dd
commit
e74e396204
12 changed files with 95 additions and 35 deletions
40
mm/percpu.c
40
mm/percpu.c
|
|
@ -43,7 +43,7 @@
|
|||
*
|
||||
* To use this allocator, arch code should do the followings.
|
||||
*
|
||||
* - define CONFIG_HAVE_DYNAMIC_PER_CPU_AREA
|
||||
* - drop CONFIG_HAVE_LEGACY_PER_CPU_AREA
|
||||
*
|
||||
* - define __addr_to_pcpu_ptr() and __pcpu_ptr_to_addr() to translate
|
||||
* regular address to percpu pointer and back if they need to be
|
||||
|
|
@ -1275,3 +1275,41 @@ ssize_t __init pcpu_embed_first_chunk(size_t static_size, size_t reserved_size,
|
|||
reserved_size, dyn_size,
|
||||
pcpue_unit_size, pcpue_ptr, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic percpu area setup.
|
||||
*
|
||||
* The embedding helper is used because its behavior closely resembles
|
||||
* the original non-dynamic generic percpu area setup. This is
|
||||
* important because many archs have addressing restrictions and might
|
||||
* fail if the percpu area is located far away from the previous
|
||||
* location. As an added bonus, in non-NUMA cases, embedding is
|
||||
* generally a good idea TLB-wise because percpu area can piggy back
|
||||
* on the physical linear memory mapping which uses large page
|
||||
* mappings on applicable archs.
|
||||
*/
|
||||
#ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA
|
||||
unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;
|
||||
EXPORT_SYMBOL(__per_cpu_offset);
|
||||
|
||||
void __init setup_per_cpu_areas(void)
|
||||
{
|
||||
size_t static_size = __per_cpu_end - __per_cpu_start;
|
||||
ssize_t unit_size;
|
||||
unsigned long delta;
|
||||
unsigned int cpu;
|
||||
|
||||
/*
|
||||
* Always reserve area for module percpu variables. That's
|
||||
* what the legacy allocator did.
|
||||
*/
|
||||
unit_size = pcpu_embed_first_chunk(static_size, PERCPU_MODULE_RESERVE,
|
||||
PERCPU_DYNAMIC_RESERVE, -1);
|
||||
if (unit_size < 0)
|
||||
panic("Failed to initialized percpu areas.");
|
||||
|
||||
delta = (unsigned long)pcpu_base_addr - (unsigned long)__per_cpu_start;
|
||||
for_each_possible_cpu(cpu)
|
||||
__per_cpu_offset[cpu] = delta + cpu * unit_size;
|
||||
}
|
||||
#endif /* CONFIG_HAVE_SETUP_PER_CPU_AREA */
|
||||
|
|
|
|||
Loading…
Reference in a new issue