x86/non-x86: percpu, node ids, apic ids x86.git fixup
Subsystems (6)
cover x86/non-x86: percpu, node ids, apic ids x86.git fixup
[ patches for x86.git ]
Quoted 8 lines · Ingo Molnar
well i picked up some more stuff so please check x86.git later today, once i have updated it. It should have most of the x86.git relevant bits.
the wider, multiple-arch patches you are doing should go via -mm. (or i can pick any of them up into x86.git for testing, if you reshape it to a "applies fine to x86.git and does not break other arches" x86-only and perhaps generic-percpu bits.
Here is 3 patches to address the following:
01-fix-x86.git-need
- fixes up things missing in x86.git [necessary]
02-fix-x86.git-debug-maxsmp
- adds debug options [do not include, except for DEBUG]
03-fix-x86.git-non-x86-changes
- non-x86 changes that should fix build errors when x86.git is merged into -mm. [necessary for -mm merge] [percpu_modcopy() being the primary problem but also the config option name for "HAVE_PER_CPU_SETUP" is different.]
Signature · 5 lines
-- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 1/3 x86: fix percpu, nodeids, apicids in x86.git
[ patches for x86.git ]
01-fix-x86.git-need
- fixes up things missing in (08/01/22) x86.git [necessary]
This should bring x86.git up-to-date with changes from -mm specific to x86
--- arch/x86/Kconfig | 2 +- arch/x86/kernel/setup64.c | 10 +++++----- arch/x86/kernel/smpboot_32.c | 2 +- arch/x86/mm/numa_64.c | 14 ++++++-------- arch/x86/mm/srat_64.c | 2 +- include/asm-generic/percpu.h | 12 ++---------- include/asm-x86/mmzone_64.h | 6 +++--- include/asm-x86/numa_64.h | 2 +- include/asm-x86/topology.h | 16 +++++++++------- init/main.c | 4 ++-- kernel/module.c | 8 ++++++++ 11 files changed, 39 insertions(+), 39 deletions(-)
arch/x86/Kconfig +1 -1
@@ -100,7 +100,7 @@ config GENERIC_TIME_VSYSCALL bool default X86_64 -config ARCH_SETS_UP_PER_CPU_AREA +config HAVE_SETUP_PER_CPU_AREA def_bool X86_64 config ARCH_SUPPORTS_OPROFILE
arch/x86/kernel/setup64.c +5 -5
@@ -87,10 +87,10 @@ __setup("noexec32=", nonx32_setup);/* * Copy data used in early init routines from the initial arrays to the -* per cpu data areas. These arrays then become expendable and the *_ptrs -* are zeroed indicating that the static arrays are gone. +* per cpu data areas. These arrays then become expendable and the +* *_early_ptr's are zeroed indicating that the static arrays are gone. */ -void __init setup_percpu_maps (void ) +static void __init setup_per_cpu_maps (void ) {int cpu;
@@ -114,7 +114,7 @@ void __init setup_percpu_maps(void)#endif } -/* indicate the early static arrays are gone */ +/* indicate the early static arrays will soon be gone */ x86_cpu_to_apicid_early_ptr =NULL ; x86_bios_cpu_apicid_early_ptr =NULL ;#ifdef CONFIG_NUMA
@@ -157,7 +157,7 @@ void __init setup_per_cpu_areas(void) }/* setup percpu data maps early */ -setup_percpu_maps (); +setup_per_cpu_maps (); }void pda_init (int cpu)
arch/x86/kernel/smpboot_32.c +1 -1
@@ -460,7 +460,7 @@ cpumask_t node_to_cpumask_map[MAX_NUMNOD { [0 ... MAX_NUMNODES-1] = CPU_MASK_NONE };EXPORT_SYMBOL (node_to_cpumask_map);/* which node each logical CPU is on */ -u8 cpu_to_node_map[NR_CPUS ]__read_mostly = { [0 ...NR_CPUS -1 ] =0 }; +int cpu_to_node_map[NR_CPUS ]__read_mostly = { [0 ...NR_CPUS -1 ] =0 };EXPORT_SYMBOL (cpu_to_node_map);/* set up a mapping between cpu and node. */
arch/x86/mm/numa_64.c +6 -8
@@ -31,17 +31,15 @@ bootmem_data_t plat_node_bdata[MAX_NUMNOstruct memnode memnode; -u16 x86_cpu_to_node_map_init[NR_CPUS ] = { +int x86_cpu_to_node_map_init[NR_CPUS ] = { [0 ...NR_CPUS -1 ] =NUMA_NO_NODE };void *x86_cpu_to_node_map_early_ptr; -DEFINE_PER_CPU (u16, x86_cpu_to_node_map) =NUMA_NO_NODE ; +DEFINE_PER_CPU (int, x86_cpu_to_node_map) =NUMA_NO_NODE ;EXPORT_PER_CPU_SYMBOL (x86_cpu_to_node_map); -#ifdef CONFIG_DEBUG_PER_CPU_MAPS EXPORT_SYMBOL (x86_cpu_to_node_map_early_ptr); -#endif -u16 apicid_to_node[MAX_LOCAL_APIC ]__cpuinitdata = { +s16 apicid_to_node[MAX_LOCAL_APIC ]__cpuinitdata = { [0 ...MAX_LOCAL_APIC -1 ] =NUMA_NO_NODE };
@@ -65,7 +63,7 @@ static int __init populate_memnodemap(counsigned long addr, end;int i, res =-1 ; -memset (memnodemap,0xff , memnodemapsize); +memset (memnodemap,0xff ,sizeof (s16)*memnodemapsize);for (i =0 ; i < numnodes; i++) { addr = nodes[i].start; end = nodes[i].end;
@@ -74,7 +72,7 @@ static int __init populate_memnodemap(coif ((end >> shift) >= memnodemapsize)return 0 ; do { - if (memnodemap[addr >> shift] != 0xff) + if (memnodemap[addr >> shift] != NUMA_NO_NODE) return -1; memnodemap[addr >> shift] = i; addr += (1UL << shift);
@@ -535,7 +533,7 @@ __cpuinit void numa_add_cpu(int cpu)void __cpuinit numa_set_node (int cpu,int node) { -u16 *cpu_to_node_map = x86_cpu_to_node_map_early_ptr; +int *cpu_to_node_map = x86_cpu_to_node_map_early_ptr;cpu_pda (cpu)->nodenumber = node;
arch/x86/mm/srat_64.c +1 -1
@@ -397,7 +397,7 @@ int __init acpi_scan_nodes(unsigned longstatic int fake_node_to_pxm_map[MAX_NUMNODES ]__initdata = { [0 ...MAX_NUMNODES -1 ] =PXM_INVAL }; -static u16 fake_apicid_to_node[MAX_LOCAL_APIC ]__initdata = { +static s16 fake_apicid_to_node[MAX_LOCAL_APIC ]__initdata = { [0 ...MAX_LOCAL_APIC -1 ] =NUMA_NO_NODE };static int __init find_node_by_addr (unsigned long addr)
include/asm-generic/percpu.h +2 -10
@@ -47,7 +47,7 @@ extern unsigned long __per_cpu_offset[NR#endif /* -* A percpu variable may point to a discarded reghions. The following are +* A percpu variable may point to a discarded regions. The following are * established ways to produce a usable pointer from the percpu variable * offset. */
@@ -59,18 +59,10 @@ extern unsigned long __per_cpu_offset[NR (*SHIFT_PERCPU_PTR(&per_cpu_var(var), __my_cpu_offset)) -#ifdef CONFIG_ARCH_SETS_UP_PER_CPU_AREA +#ifdef CONFIG_HAVE_SETUP_PER_CPU_AREA extern void setup_per_cpu_areas (void );#endif -/* A macro to avoid #include hell... */ -#define percpu_modcopy (pcpudst, src, size) \ -do { \ - unsigned int __i; \ - for_each_possible_cpu(__i) \ - memcpy((pcpudst)+per_cpu_offset(__i), \ - (src), (size)); \ -} while (0)#else /* ! SMP */ #define per_cpu (var, cpu) (*((void)(cpu), &per_cpu_var(var)))
include/asm-x86/mmzone_64.h +3 -3
@@ -15,9 +15,9 @@struct memnode {int shift;unsigned int mapsize; -u8 *map; -u8 embedded_map[64 -16 ]; -}____cacheline_aligned ;/* total size = 64 bytes */ +s16 *map; +s16 embedded_map[64 -8 ]; +}____cacheline_aligned ;/* total size = 128 bytes */ extern struct memnode memnode;#define memnode_shift memnode.shift#define memnodemap memnode.map
include/asm-x86/numa_64.h +1 -1
@@ -20,7 +20,7 @@ extern void numa_set_node(int cpu, int nextern void srat_reserve_add_area (int nodeid);extern int hotadd_percent; -extern u16 apicid_to_node[MAX_LOCAL_APIC ]; +extern s16 apicid_to_node[MAX_LOCAL_APIC ];extern void numa_initmem_init (unsigned long start_pfn,unsigned long end_pfn);extern unsigned long numa_free_all_bootmem (void );
include/asm-x86/topology.h +9 -7
@@ -31,17 +31,19 @@/* Mappings between logical cpu number and node number */ #ifdef CONFIG_X86_32 -extern u8 cpu_to_node_map[]; +extern int cpu_to_node_map[];#else -DECLARE_PER_CPU (u16, x86_cpu_to_node_map); -extern u16 x86_cpu_to_node_map_init[]; +DECLARE_PER_CPU (int, x86_cpu_to_node_map); +extern int x86_cpu_to_node_map_init[];extern void *x86_cpu_to_node_map_early_ptr; +/* Returns the number of the current Node. */ +#define numa_node_id () (early_cpu_to_node(raw_smp_processor_id()))#endif extern cpumask_t node_to_cpumask_map[]; -#define NUMA_NO_NODE ((u16)(~0)) +#define NUMA_NO_NODE (-1)/* Returns the number of the node containing CPU 'cpu' */ #ifdef CONFIG_X86_32
@@ -54,11 +56,11 @@ static inline int cpu_to_node(int cpu)#else /* CONFIG_X86_64 */ static inline int early_cpu_to_node (int cpu) { -u16 *cpu_to_node_map = x86_cpu_to_node_map_early_ptr; +int *cpu_to_node_map = x86_cpu_to_node_map_early_ptr;if (cpu_to_node_map)return cpu_to_node_map[cpu]; -else if (per_cpu_offset (cpu)) +else if (per_cpu_offset (cpu))return per_cpu (x86_cpu_to_node_map, cpu);else return NUMA_NO_NODE ;
@@ -71,7 +73,7 @@ static inline int cpu_to_node(int cpu)printk ("KERN_NOTICE cpu_to_node(%d): usage too early!\n" , (int )cpu);dump_stack (); - return ((u16 *)x86_cpu_to_node_map_early_ptr)[cpu]; + return ((int *)x86_cpu_to_node_map_early_ptr)[cpu]; }#endif if (per_cpu_offset (cpu))
init/main.c +2 -2
@@ -363,7 +363,7 @@ static inline void smp_prepare_cpus(unsi#else -#ifndef CONFIG_ARCH_SETS_UP_PER_CPU_AREA +#ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA unsigned long __per_cpu_offset[NR_CPUS ]__read_mostly ;EXPORT_SYMBOL (__per_cpu_offset);
@@ -384,7 +384,7 @@ static void __init setup_per_cpu_areas(v ptr += size; } } -#endif /* CONFIG_ARCH_SETS_UP_CPU_AREA */ +#endif /* CONFIG_HAVE_SETUP_PER_CPU_AREA */ /* Called by boot processor to activate the rest. */ static void __init smp_init (void )
kernel/module.c +8 -0
@@ -427,6 +427,14 @@ static unsigned int find_pcpusec(Elf_Ehdreturn find_sec (hdr, sechdrs, secstrings,".data.percpu" ); } +static void percpu_modcopy (void *pcpudest,const void *from,unsigned long size) +{ +int cpu; + +for_each_possible_cpu (cpu) +memcpy (pcpudest +per_cpu_offset (cpu), from, size); +} +static int percpu_modinit (void ) { pcpu_num_used =2 ;
Signature · 5 lines
-- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 2/3 x86: add percpu, cpu_to_node debug options
In reply to [email protected][ patches for x86.git ]
02-fix-x86.git-debug-maxsmp
- adds debug options [do not include, except for DEBUG]
These are debug options only. Should not be applied but are very helpful when the system panics early or when testing of large count NR_CPUS is desired.
--- arch/x86/Kconfig | 22 ++++++++++++++++------ include/asm-x86/page_64.h | 4 ++++ lib/Kconfig.debug | 12 ++++++++++++ 3 files changed, 32 insertions(+), 6 deletions(-)
arch/x86/Kconfig +16 -6
@@ -467,19 +467,28 @@ config SWIOTLB config NR_CPUS - int "Maximum number of CPUs (2-255)" - range 2 255 + int "Maximum number of CPUs (2-4096)" + range 2 4096 depends on SMP default "32" if X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000 - default "8" + default "1024" if X86_64 help This allows you to specify the maximum number of CPUs which this - kernel will support. The maximum supported value is 255 and the + kernel will support. The maximum supported value is 4096 and the minimum value which makes sense is 2. This is purely to save memory - each supported CPU adds approximately eight kilobytes to the kernel image. +config THREAD_ORDER + int "Kernel stack size (in page order)" + range 1 3 + depends on X86_64 + default "3" if X86_SMP + default "1" + help + Increases kernel stack size. + config SCHED_SMT bool "SMT (Hyperthreading) scheduler support" depends on (X86_64 && SMP) || (X86_32 && X86_HT)
@@ -862,8 +871,9 @@ config NUMA_EMU number of nodes. This is only useful for debugging. config NODES_SHIFT - int - default "6" if X86_64 + int "NODES_SHIFT" + range 1 15 if X86_64 + default "9" if X86_64 default "4" if X86_NUMAQ default "3" depends on NEED_MULTIPLE_NODES
include/asm-x86/page_64.h +4 -0
@@ -3,7 +3,11 @@#define PAGETABLE_LEVELS 4 +#ifdef CONFIG_THREAD_ORDER +#define THREAD_ORDER CONFIG_THREAD_ORDER +#else #define THREAD_ORDER 1 +#endif #define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER)#define CURRENT_MASK (~(THREAD_SIZE-1))
lib/Kconfig.debug +12 -0
@@ -570,6 +570,18 @@ config PROVIDE_OHCI1394_DMA_INIT See Documentation/debugging-via-ohci1394.txt for more information. +config DEBUG_PER_CPU + bool "Debug per_cpu usage" + depends on DEBUG_KERNEL + depends on SMP + default n + help + Say Y here to add code that verifies the per_cpu area is + setup before accessing a per_cpu variable. It does add a + significant amount of code to kernel memory. + + If unsure, say N. + source "samples/Kconfig" source "lib/Kconfig.kgdb"
Signature · 5 lines
-- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 2/3] x86: add percpu, cpu_to_node debug options
arch/x86/Kconfig config SWIOTLB · line 490
Quoted 8 lines · * [email protected] <[email protected]> wrote:
arch/x86/Kconfig +8
-0+config THREAD_ORDER + int "Kernel stack size (in page order)" + range 1 3 + depends on X86_64 + default "3" if X86_SMP + default "1" + help + Increases kernel stack size.
you keep sending this broken portion, please dont ...
Ingo
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 2/3] x86: add percpu, cpu_to_node debug options
Quoted 13 lines · Ingo Molnar
arch/x86/Kconfig config SWIOTLB · line 490
Quoted 8 lines · * [email protected] <[email protected]> wrote:
arch/x86/Kconfig +8
-0+config THREAD_ORDER + int "Kernel stack size (in page order)" + range 1 3 + depends on X86_64 + default "3" if X86_SMP + default "1" + help + Increases kernel stack size.you keep sending this broken portion, please dont ...
Quoted 1 line
Ingo
Sorry, I noted in the comments that that's only for the DEBUG patch, and you shouldn't apply that, except when attempting to up the NR_CPUS count for testing. (I should perhaps just quit submitting it? ;-)
As a side note, soon we should be able to up NR_CPUS and not worry about stack overflows.
Thanks,
Mike
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 3/3 generic: fixup percpu Kconfig options, fold percpu_modcopy into module.c
In reply to [email protected][ patches for x86.git ]
03-fix-x86.git-non-x86-changes
- non-x86 changes that should fix build errors when x86.git is merged into -mm. [necessary for -mm merge] [percpu_modcopy() being the primary problem but also the config option name for "HAVE_PER_CPU_SETUP" is different.]
--- arch/ia64/Kconfig | 2 +- arch/ia64/kernel/module.c | 11 ----------- arch/powerpc/Kconfig | 2 +- arch/sparc64/mm/init.c | 5 +++++ include/asm-ia64/percpu.h | 29 +++++++---------------------- include/asm-powerpc/percpu.h | 29 ++--------------------------- include/asm-s390/percpu.h | 42 +++++++++--------------------------------- include/asm-sparc64/percpu.h | 22 +++------------------- 8 files changed, 28 insertions(+), 114 deletions(-)
arch/ia64/Kconfig +1 -1
@@ -80,7 +80,7 @@ config GENERIC_TIME_VSYSCALL bool default y -config ARCH_SETS_UP_PER_CPU_AREA +config HAVE_SETUP_PER_CPU_AREA def_bool y config DMI
arch/ia64/kernel/module.c +0 -11
@@ -940,14 +940,3 @@ module_arch_cleanup (struct module *mod)if (mod->arch.core_unw_table)unw_remove_unwind_table (mod->arch.core_unw_table); } - -#ifdef CONFIG_SMP -void -percpu_modcopy (void *pcpudst,const void *src,unsigned long size) -{ -unsigned int i; -for_each_possible_cpu (i) { -memcpy (pcpudst +per_cpu_offset (i), src, size); - } -} -#endif /* CONFIG_SMP */
arch/powerpc/Kconfig +1 -1
@@ -42,7 +42,7 @@ config GENERIC_HARDIRQS bool default y -config ARCH_SETS_UP_PER_CPU_AREA +config HAVE_SETUP_PER_CPU_AREA def_bool PPC64 config IRQ_PER_CPU
arch/sparc64/mm/init.c +5 -0
@@ -1328,6 +1328,11 @@ pgd_t swapper_pg_dir[2048];static void sun4u_pgprot_init (void );static void sun4v_pgprot_init (void ); +/* Dummy function */ +void __init setup_per_cpu_areas (void ) +{ +} +void __init paging_init (void ) {unsigned long end_pfn, pages_avail, shift, phys_base;
include/asm-ia64/percpu.h +7 -22
@@ -19,34 +19,14 @@# define PER_CPU_ATTRIBUTES __attribute__((__model__ (__small__)))#endif -#define DECLARE_PER_CPU (type, name) \ - extern PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name - -/* -* Pretty much a literal copy of asm-generic/percpu.h, except that percpu_modcopy() is an -* external routine, to avoid include-hell. -*/ #ifdef CONFIG_SMP -extern unsigned long __per_cpu_offset[NR_CPUS ]; -#define per_cpu_offset (x) (__per_cpu_offset[x]) - -/* Equal to __per_cpu_offset[smp_processor_id()], but faster to access: */ -DECLARE_PER_CPU(unsigned long, local_per_cpu_offset); +#define __my_cpu_offset __ia64_per_cpu_var(local_per_cpu_offset) -#define per_cpu (var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu])) -#define __get_cpu_var (var) (*RELOC_HIDE(&per_cpu__##var, __ia64_per_cpu_var(local_per_cpu_offset))) -#define __raw_get_cpu_var (var) (*RELOC_HIDE(&per_cpu__##var, __ia64_per_cpu_var(local_per_cpu_offset))) - -extern void percpu_modcopy (void *pcpudst,const void *src,unsigned long size); -extern void setup_per_cpu_areas (void );extern void *per_cpu_init (void );#else /* ! SMP */ -#define per_cpu (var, cpu) (*((void)(cpu), &per_cpu__##var)) -#define __get_cpu_var (var) per_cpu__##var -#define __raw_get_cpu_var (var) per_cpu__##var#define per_cpu_init () (__phys_per_cpu_start)#endif /* SMP */
@@ -57,7 +37,12 @@ extern void *per_cpu_init(void);* On the positive side, using __ia64_per_cpu_var() instead of __get_cpu_var() is slightly * more efficient. */ -#define __ia64_per_cpu_var (var) (per_cpu__##var) +#define __ia64_per_cpu_var (var) per_cpu__##var + +#include <asm-generic/percpu.h> + +/* Equal to __per_cpu_offset[smp_processor_id()], but faster to access: */ +DECLARE_PER_CPU(unsigned long, local_per_cpu_offset);#endif /* !__ASSEMBLY__ */
include/asm-powerpc/percpu.h +2 -27
@@ -16,34 +16,9 @@#define __my_cpu_offset () get_paca()->data_offset#define per_cpu_offset (x) (__per_cpu_offset(x)) -/* var is in discarded region: offset to particular copy we want */ -#define per_cpu (var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu))) -#define __get_cpu_var (var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset())) -#define __raw_get_cpu_var (var) (*RELOC_HIDE(&per_cpu__##var, local_paca->data_offset)) +#endif /* CONFIG_SMP */ +#endif /* __powerpc64__ */ -/* A macro to avoid #include hell... */ -#define percpu_modcopy (pcpudst, src, size) \ -do { \ - unsigned int __i; \ - for_each_possible_cpu(__i) \ - memcpy((pcpudst)+__per_cpu_offset(__i), \ - (src), (size)); \ -} while (0) - -extern void setup_per_cpu_areas (void ); - -#else /* ! SMP */ - -#define per_cpu (var, cpu) (*((void)(cpu), &per_cpu__##var)) -#define __get_cpu_var (var) per_cpu__##var -#define __raw_get_cpu_var (var) per_cpu__##var - -#endif /* SMP */ - -#define DECLARE_PER_CPU (type, name) extern __typeof__(type) per_cpu__##name - -#else #include <asm-generic/percpu.h> -#endif #endif /* _ASM_POWERPC_PERCPU_H_ */
include/asm-s390/percpu.h +9 -33
58 lines not on this page · raw message
include/asm-sparc64/percpu.h +3 -19
@@ -7,7 +7,6 @@ register unsigned long __local_per_cpu_o#ifdef CONFIG_SMP -#define setup_per_cpu_areas () do { } while (0)extern void real_setup_per_cpu_areas (void );extern unsigned long __per_cpu_base;
@@ -16,29 +15,14 @@ extern unsigned long __per_cpu_shift; (__per_cpu_base + ((unsigned long)(__cpu) << __per_cpu_shift))#define per_cpu_offset (x) (__per_cpu_offset(x)) -/* var is in discarded region: offset to particular copy we want */ -#define per_cpu (var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu))) -#define __get_cpu_var (var) (*RELOC_HIDE(&per_cpu__##var, __local_per_cpu_offset)) -#define __raw_get_cpu_var (var) (*RELOC_HIDE(&per_cpu__##var, __local_per_cpu_offset)) - -/* A macro to avoid #include hell... */ -#define percpu_modcopy (pcpudst, src, size) \ -do { \ - unsigned int __i; \ - for_each_possible_cpu(__i) \ - memcpy((pcpudst)+__per_cpu_offset(__i), \ - (src), (size)); \ -} while (0) +#define __my_cpu_offset __local_per_cpu_offset +#else /* ! SMP */ #define real_setup_per_cpu_areas () do { } while (0) -#define per_cpu (var, cpu) (*((void)cpu, &per_cpu__##var)) -#define __get_cpu_var (var) per_cpu__##var -#define __raw_get_cpu_var (var) per_cpu__##var -#endif /* SMP */ -#define DECLARE_PER_CPU (type, name) extern __typeof__(type) per_cpu__##name +#include <asm-generic/percpu.h> #endif /* __ARCH_SPARC64_PERCPU__ */