Account for module percpu space separately from kernel percpu
PATCH 1/2 Account for module percpu space separately from kernel percpu
Rather than using a single constant PERCPU_ENOUGH_ROOM, compute it as the sum of kernel_percpu + PERCPU_MODULE_RESERVE. This is now common to all architectures; if an architecture wants to set PERCPU_ENOUGH_ROOM to something special, then it may do so (ia64 is the only one which does).
--- include/asm-alpha/percpu.h | 14 -------------- include/asm-sparc64/percpu.h | 10 ---------- include/asm-x86_64/percpu.h | 10 ---------- include/linux/percpu.h | 9 ++++++++- init/main.c | 7 ++----- kernel/module.c | 2 +- 6 files changed, 11 insertions(+), 41 deletions(-)
===================================================================
include/asm-alpha/percpu.h +0 -14
@@ -1,19 +1,5 @@#ifndef __ALPHA_PERCPU_H#define __ALPHA_PERCPU_H - -/* -* Increase the per cpu area for Alpha so that -* modules using percpu area can load. -*/ -#ifdef CONFIG_MODULES -# define PERCPU_MODULE_RESERVE 8192 -#else -# define PERCPU_MODULE_RESERVE 0 -#endif - -#define PERCPU_ENOUGH_ROOM \ - (ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES) + \ - PERCPU_MODULE_RESERVE)#include <asm-generic/percpu.h>
===================================================================
include/asm-sparc64/percpu.h +0 -10
@@ -4,16 +4,6 @@#include <linux/compiler.h> #ifdef CONFIG_SMP - -#ifdef CONFIG_MODULES -# define PERCPU_MODULE_RESERVE 8192 -#else -# define PERCPU_MODULE_RESERVE 0 -#endif - -#define PERCPU_ENOUGH_ROOM \ - (ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES) + \ - PERCPU_MODULE_RESERVE)extern void setup_per_cpu_areas (void );
===================================================================
include/asm-x86_64/percpu.h +0 -10
@@ -10,16 +10,6 @@#ifdef CONFIG_SMP #include <asm/pda.h> - -#ifdef CONFIG_MODULES -# define PERCPU_MODULE_RESERVE 8192 -#else -# define PERCPU_MODULE_RESERVE 0 -#endif - -#define PERCPU_ENOUGH_ROOM \ - (ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES) + \ - PERCPU_MODULE_RESERVE)#define __per_cpu_offset (cpu) (cpu_pda(cpu)->data_offset)#define __my_cpu_offset () read_pda(data_offset)
===================================================================
include/linux/percpu.h +8 -1
@@ -11,8 +11,15 @@/* Enough to cover all DEFINE_PER_CPUs in kernel, including modules. */ #ifndef PERCPU_ENOUGH_ROOM -#define PERCPU_ENOUGH_ROOM 32768 +#ifdef CONFIG_MODULES +#define PERCPU_MODULE_RESERVE 8192 +#else +#define PERCPU_MODULE_RESERVE 0#endif + +#define PERCPU_ENOUGH_ROOM \ + (__per_cpu_end - __per_cpu_start + PERCPU_MODULE_RESERVE) +#endif /* PERCPU_ENOUGH_ROOM */ /* * Must be an lvalue. Since @var must be a simple identifier,
===================================================================
init/main.c +2 -5
@@ -369,11 +369,8 @@ static void __init setup_per_cpu_areas(vunsigned long nr_possible_cpus =num_possible_cpus ();/* Copy section for each CPU (we discard the original) */ - size =ALIGN (__per_cpu_end - __per_cpu_start,SMP_CACHE_BYTES ); -#ifdef CONFIG_MODULES -if (size <PERCPU_ENOUGH_ROOM ) - size =PERCPU_ENOUGH_ROOM ; -#endif + + size =ALIGN (PERCPU_ENOUGH_ROOM ,SMP_CACHE_BYTES ); ptr =alloc_bootmem (size * nr_possible_cpus);for_each_possible_cpu (i) {
===================================================================
kernel/module.c +1 -1
@@ -430,7 +430,7 @@ static int percpu_modinit(void) pcpu_size =kmalloc (sizeof (pcpu_size[0 ]) * pcpu_num_allocated,GFP_KERNEL );/* Static in-kernel percpu data (used). */ - pcpu_size[0 ] = -ALIGN (__per_cpu_end-__per_cpu_start,SMP_CACHE_BYTES ); + pcpu_size[0 ] = -(__per_cpu_end-__per_cpu_start);/* Free room. */ pcpu_size[1 ] =PERCPU_ENOUGH_ROOM + pcpu_size[0 ];if (pcpu_size[1 ] <0 ) {
Quoted 5 lines · Jeremy Fitzhardinge
Rather than using a single constant
PERCPU_ENOUGH_ROOM, compute it as the sum ofkernel_percpu+PERCPU_MODULE_RESERVE. This is now common to all architectures; if an architecture wants to setPERCPU_ENOUGH_ROOMto something special, then it may do so (ia64 is the only one which does).
I think I have already done this but in case I haven't.
I see any problems there.
Quoted 5 lines · Eric W. Biederman
I think I have already done this but in case I haven't.
I see any problems there.
^don't?
Quoted 7 lines · Jeremy Fitzhardinge
Quoted 5 lines · Eric W. Biederman
I think I have already done this but in case I haven't.
I see any problems there.
^don't?
Yep. I did not see any problems with the patch.
Eric