x86: unify x86_32 and 64 NUMA init paths, take#5
Subsystems (4)
PATCH 1/1 x86: unify x86_32 and 64 NUMA init paths, take#5
Hello,
This is the fifth take of unify-x86_32-and-64-NUMA-init-paths patchset.
It's rebased (again!) on top of v2.6.39-rc2. There isn't any change from the last take[L] other than what's necessary for the rebasing.
As commit 56d91f13 already introduced MAX_LOCAL_APIC but didn't replace MAX_APICID, the second patch is updated to convert the users of MAX_APICID and drop MAX_APICID. 0015 also received updates to accomodate changes made by d906f0eb. Other than the two mentioned changes, all changes were trivial context updates.
This patchset contains the following sixteen patches.
0001-x86-Kill-unused-static-boot_cpu_logical_apicid-in-sm.patch 0002-x86-Drop-x86_32-MAX_APICID.patch 0003-x86-Make-default_send_IPI_mask_sequence-allbutself_l.patch 0004-x86-Replace-cpu_2_logical_apicid-with-early-percpu-v.patch 0005-x86-Always-use-x86_cpu_to_logical_apicid-for-cpu-log.patch 0006-x86-Kill-apic-cpu_to_logical_apicid.patch 0007-x86-Add-apic-x86_32_early_logical_apicid.patch 0008-x86-Implement-the-default-x86_32_early_logical_apici.patch 0009-x86-Implement-x86_32_early_logical_apicid-for-bigsmp.patch 0010-x86-Implement-x86_32_early_logical_apicid-for-summit.patch 0011-x86-Implement-x86_32_early_logical_apicid-for-numaq_.patch 0012-x86-Replace-apic-apicid_to_node-with-x86_32_numa_cpu.patch 0013-x86-Unify-cpu-apicid-NUMA-node-mapping-between-32-an.patch 0014-x86-Unify-CPU-NUMA-node-mapping-between-32-and-64bit.patch 0015-x86-Unify-node_to_cpumask_map-handling-between-32-an.patch 0016-x86-Unify-NUMA-initialization-between-32-and-64bit.patch
It's based on top of v2.6.38-rc2 (1bae4ce2) and available in the following git branch.
git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc.git unify-numa
Diffstat follows.
arch/x86/Kconfig | 2 arch/x86/include/asm/apic.h | 36 +++-- arch/x86/include/asm/ipi.h | 8 - arch/x86/include/asm/mpspec.h | 3 arch/x86/include/asm/numa.h | 49 +++++++ arch/x86/include/asm/numa_32.h | 7 - arch/x86/include/asm/numa_64.h | 16 -- arch/x86/include/asm/smp.h | 3 arch/x86/include/asm/topology.h | 17 -- arch/x86/kernel/acpi/boot.c | 8 - arch/x86/kernel/apic/apic.c | 39 +++++ arch/x86/kernel/apic/apic_flat_64.c | 4 arch/x86/kernel/apic/apic_noop.c | 26 +-- arch/x86/kernel/apic/bigsmp_32.c | 34 ++--- arch/x86/kernel/apic/es7000_32.c | 35 ++--- arch/x86/kernel/apic/ipi.c | 12 - arch/x86/kernel/apic/numaq_32.c | 21 +-- arch/x86/kernel/apic/probe_32.c | 10 + arch/x86/kernel/apic/summit_32.c | 47 ++----- arch/x86/kernel/apic/x2apic_cluster.c | 2 arch/x86/kernel/apic/x2apic_phys.c | 2 arch/x86/kernel/apic/x2apic_uv_x.c | 2 arch/x86/kernel/cpu/amd.c | 51 ++++--- arch/x86/kernel/cpu/common.c | 2 arch/x86/kernel/cpu/intel.c | 5 arch/x86/kernel/setup.c | 2 arch/x86/kernel/setup_percpu.c | 11 + arch/x86/kernel/smpboot.c | 68 ---------- arch/x86/mm/amdtopology_64.c | 4 arch/x86/mm/numa.c | 208 ++++++++++++++++++++++++++++++- arch/x86/mm/numa_32.c | 7 + arch/x86/mm/numa_64.c | 227 ++-------------------------------- arch/x86/mm/srat_32.c | 6 arch/x86/mm/srat_64.c | 12 - 34 files changed, 498 insertions(+), 488 deletions(-)
Thanks.
--
tejun
PATCH 1/16 x86: Kill unused static boot_cpu_logical_apicid in smpboot.c
--- arch/x86/kernel/smpboot.c | 6 +----- 1 files changed, 1 insertions(+), 5 deletions(-)
arch/x86/kernel/smpboot.c +1 -5
@@ -165,8 +165,6 @@ static void unmap_cpu_to_node(int cpu)#endif #ifdef CONFIG_X86_32 -static int boot_cpu_logical_apicid; -u8 cpu_2_logical_apicid[NR_CPUS ]__read_mostly = { [0 ...NR_CPUS -1 ] =BAD_APICID };
@@ -1096,9 +1094,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)* Setup boot CPU information */ smp_store_cpu_info (0 );/* Final full version of the data */ -#ifdef CONFIG_X86_32 - boot_cpu_logical_apicid =logical_smp_processor_id (); -#endif +current_thread_info ()->cpu =0 ;/* needed? */ for_each_possible_cpu (i) {zalloc_cpumask_var (&per_cpu (cpu_sibling_map, i),GFP_KERNEL );
Signature · 1 line
1.7.1
Re: [PATCH 01/16] x86: Kill unused static boot_cpu_logical_apicid in smpboot.c
Quoted 27 lines · Tejun Heo
Signed-off-by Tejun Heo <[email protected]>Reviewed-by Pekka Enberg <[email protected]>---
arch/x86/kernel/smpboot.c | 6 +-----1 files changed, 1 insertions(+), 5 deletions(-)arch/x86/kernel/smpboot.c +0
-2@@ -165,8 +165,6 @@ static void unmap_cpu_to_node(int cpu) #endif #ifdef CONFIG_X86_32 -static int boot_cpu_logical_apicid; -u8 cpu_2_logical_apicid[NR_CPUS]
__read_mostly=
{ [0 ... NR_CPUS-1] =BAD_APICID};arch/x86/kernel/smpboot.c +0
-0@@ -1096,9 +1094,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)* Setup boot CPU information */ smp_store_cpu_info(0); /* Final full version of the data */
arch/x86/kernel/smpboot.c +1
-3-#ifdef CONFIG_X86_32 - boot_cpu_logical_apicid = logical_smp_processor_id(); -#endif +
Quoted 3 lines
current_thread_info()->cpu = 0; /* needed? */
for_each_possible_cpu(i){zalloc_cpumask_var(&per_cpu(cpu_sibling_map, i), GFP_KERNEL);
[tip:x86/numa] x86: Kill unused static boot_cpu_logical_apicid in smpboot.c
In reply to Tejun HeoCommit-ID: bd22a2f1982fa3e90ce7d5d011c37d88aa67e73c Gitweb: http://git.kernel.org/tip/bd22a2f1982fa3e90ce7d5d011c37d88aa67e73c Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:27 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:04 +0100
x86: Kill unused static boot_cpu_logical_apicid in smpboot.c
LKML-Reference: <[email protected]>
--- arch/x86/kernel/smpboot.c | 6 +----- 1 files changed, 1 insertions(+), 5 deletions(-)
arch/x86/kernel/smpboot.c +1 -5
@@ -165,8 +165,6 @@ static void unmap_cpu_to_node(int cpu)#endif #ifdef CONFIG_X86_32 -static int boot_cpu_logical_apicid; -u8 cpu_2_logical_apicid[NR_CPUS ]__read_mostly = { [0 ...NR_CPUS -1 ] =BAD_APICID };
@@ -1096,9 +1094,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)* Setup boot CPU information */ smp_store_cpu_info (0 );/* Final full version of the data */ -#ifdef CONFIG_X86_32 - boot_cpu_logical_apicid =logical_smp_processor_id (); -#endif +current_thread_info ()->cpu =0 ;/* needed? */ for_each_possible_cpu (i) {zalloc_cpumask_var (&per_cpu (cpu_sibling_map, i),GFP_KERNEL );
PATCH 2/16 x86: Drop x86_32 MAX_APICID
In reply to Tejun HeoCommit 56d91f13 (x86, acpi: Add MAX_LOCAL_APIC for 32bit) added MAX_LOCAL_APIC for x86_32 but didn't replace MAX_APICID users with it. Convert MAX_APICID users to MAX_LOCAL_APIC and drop MAX_APICID.
--- arch/x86/include/asm/mpspec.h | 2 -- arch/x86/kernel/smpboot.c | 2 +- arch/x86/mm/srat_32.c | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-)
arch/x86/include/asm/mpspec.h +0 -2
@@ -33,8 +33,6 @@ extern int mp_bus_id_to_local[MAX_MP_BUSSES];extern int quad_local_to_mp_bus_id [NR_CPUS /4 ][4 ];#endif -#define MAX_APICID 256 -#else /* CONFIG_X86_64: */ #define MAX_MP_BUSSES 256
arch/x86/kernel/smpboot.c +1 -1
@@ -72,7 +72,7 @@#include <asm/i8259.h> #ifdef CONFIG_X86_32 -u8 apicid_2_node[MAX_APICID ]; +u8 apicid_2_node[MAX_LOCAL_APIC ];#endif /* State of each CPU */
arch/x86/mm/srat_32.c +2 -2
@@ -57,7 +57,7 @@ struct node_memory_chunk_s {static struct node_memory_chunk_s __initdata node_memory_chunk[MAXCHUNKS ];static int __initdata num_memory_chunks;/* total number of memory chunks */ -static u8 __initdata apicid_to_pxm[MAX_APICID ]; +static u8 __initdata apicid_to_pxm[MAX_LOCAL_APIC ];int acpi_numa__initdata ;
@@ -254,7 +254,7 @@ int __init get_memcfg_from_srat(void)printk (KERN_DEBUG "Number of memory chunks in system = %d\n" , num_memory_chunks); -for (i =0 ; i <MAX_APICID ; i++) +for (i =0 ; i <MAX_LOCAL_APIC ; i++) apicid_2_node[i] =pxm_to_node (apicid_to_pxm[i]);for (j =0 ; j < num_memory_chunks; j++){
Signature · 1 line
1.7.1
Re: [PATCH 02/16] x86: Drop x86_32 MAX_APICID
Quoted 53 lines · Tejun Heo
Commit
56d91f13(x86, acpi: AddMAX_LOCAL_APICfor 32bit) addedMAX_LOCAL_APICforx86_32but didn't replaceMAX_APICIDusers with it. ConvertMAX_APICIDusers toMAX_LOCAL_APICand dropMAX_APICID.Signed-off-by Tejun Heo <[email protected]>Reviewed-by Pekka Enberg <[email protected]>Cc Yinghai Lu <[email protected]>---
arch/x86/include/asm/mpspec.h | 2 --
arch/x86/kernel/smpboot.c | 2 +-
arch/x86/mm/srat_32.c | 4 ++--3 files changed, 3 insertions(+), 5 deletions(-)arch/x86/include/asm/mpspec.h +0
-2@@ -33,8 +33,6 @@ extern int mp_bus_id_to_local[MAX_MP_BUSSES]; extern int quad_local_to_mp_bus_id [NR_CPUS/4][4]; #endif -#define MAX_APICID 256 - #else /* CONFIG_X86_64: */ #define MAX_MP_BUSSES 256arch/x86/kernel/smpboot.c +1
-1@@ -72,7 +72,7 @@ #include <asm/i8259.h> #ifdef CONFIG_X86_32 -u8 apicid_2_node[MAX_APICID ]; +u8 apicid_2_node[MAX_LOCAL_APIC ]; #endif /* State of each CPU */arch/x86/mm/srat_32.c +0
-0@@ -57,7 +57,7 @@ struct node_memory_chunk_s { static struct node_memory_chunk_s __initdata node_memory_chunk[MAXCHUNKS];static int
__initdatanum_memory_chunks; /* total number of memory chunks */arch/x86/mm/srat_32.c +1
-1-static u8 __initdata apicid_to_pxm[MAX_APICID ]; +static u8 __initdata apicid_to_pxm[MAX_LOCAL_APIC ];int
acpi_numa__initdata;
arch/x86/mm/srat_32.c int __init get_memcfg_from_srat(void)
Quoted 9 lines
arch/x86/mm/srat_32.c +1
-2@@ -254,7 +254,7 @@ int __init get_memcfg_from_srat(void) printk(KERN_DEBUG "Number of memory chunks in system = %d\n", num_memory_chunks); - for (i = 0; i < MAX_APICID; i++) + for (i = 0; i < MAX_LOCAL_APIC; i++) apicid_2_node[i] = pxm_to_node(apicid_to_pxm[i]); for (j = 0; j < num_memory_chunks; j++){ --
[tip:x86/numa] x86: Drop x86_32 MAX_APICID
In reply to Tejun HeoCommit-ID: b78aa66b1fe4179d28e3f6502dc179773519a1bb Gitweb: http://git.kernel.org/tip/b78aa66b1fe4179d28e3f6502dc179773519a1bb Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:28 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:04 +0100
x86: Drop x86_32 MAX_APICID
Commit 56d91f13 (x86, acpi: Add MAX_LOCAL_APIC for 32bit) added MAX_LOCAL_APIC for x86_32 but didn't replace MAX_APICID users with it. Convert MAX_APICID users to MAX_LOCAL_APIC and drop MAX_APICID.
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/mpspec.h | 2 -- arch/x86/kernel/smpboot.c | 2 +- arch/x86/mm/srat_32.c | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-)
arch/x86/include/asm/mpspec.h +0 -2
@@ -33,8 +33,6 @@ extern int mp_bus_id_to_local[MAX_MP_BUSSES];extern int quad_local_to_mp_bus_id [NR_CPUS /4 ][4 ];#endif -#define MAX_APICID 256 -#else /* CONFIG_X86_64: */ #define MAX_MP_BUSSES 256
arch/x86/kernel/smpboot.c +1 -1
@@ -72,7 +72,7 @@#include <asm/i8259.h> #ifdef CONFIG_X86_32 -u8 apicid_2_node[MAX_APICID ]; +u8 apicid_2_node[MAX_LOCAL_APIC ];#endif /* State of each CPU */
arch/x86/mm/srat_32.c +2 -2
@@ -57,7 +57,7 @@ struct node_memory_chunk_s {static struct node_memory_chunk_s __initdata node_memory_chunk[MAXCHUNKS ];static int __initdata num_memory_chunks;/* total number of memory chunks */ -static u8 __initdata apicid_to_pxm[MAX_APICID ]; +static u8 __initdata apicid_to_pxm[MAX_LOCAL_APIC ];int acpi_numa__initdata ;
@@ -254,7 +254,7 @@ int __init get_memcfg_from_srat(void)printk (KERN_DEBUG "Number of memory chunks in system = %d\n" , num_memory_chunks); -for (i =0 ; i <MAX_APICID ; i++) +for (i =0 ; i <MAX_LOCAL_APIC ; i++) apicid_2_node[i] =pxm_to_node (apicid_to_pxm[i]);for (j =0 ; j < num_memory_chunks; j++){
PATCH 3/16 x86: Make default_send_IPI_mask_sequence/allbutself_logical() 32bit only
In reply to Tejun HeoBoth functions are used only in 32bit. Put them inside CONFIG_X86_32. This is to prepare for logical apicid handling update.
- Cyrill Gorcunov spotted that I forgot to move declarations in ipi.h under CONFIG_X86_32. Fixed.
--- arch/x86/include/asm/ipi.h | 8 ++++---- arch/x86/kernel/apic/ipi.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-)
arch/x86/include/asm/ipi.h +4 -4
@@ -123,10 +123,6 @@ extern void default_send_IPI_mask_sequence_phys(const struct cpumask *mask, int vector);extern void default_send_IPI_mask_allbutself_phys (const struct cpumask *mask,int vector); -extern void default_send_IPI_mask_sequence_logical (const struct cpumask *mask, -int vector); -extern void default_send_IPI_mask_allbutself_logical (const struct cpumask *mask, -int vector);/* Avoid include hell */ #define NMI_VECTOR 0x02
@@ -150,6 +146,10 @@ static inline void __default_local_send_IPI_all(int vector) }#ifdef CONFIG_X86_32 +extern void default_send_IPI_mask_sequence_logical (const struct cpumask *mask, +int vector); +extern void default_send_IPI_mask_allbutself_logical (const struct cpumask *mask, +int vector);extern void default_send_IPI_mask_logical (const struct cpumask *mask,int vector);extern void default_send_IPI_allbutself (int vector);
arch/x86/kernel/apic/ipi.c +2 -2
@@ -56,6 +56,8 @@ void default_send_IPI_mask_allbutself_phys(const struct cpumask *mask,local_irq_restore (flags); } +#ifdef CONFIG_X86_32 +void default_send_IPI_mask_sequence_logical (const struct cpumask *mask,int vector) {
@@ -96,8 +98,6 @@ void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask,local_irq_restore (flags); } -#ifdef CONFIG_X86_32 -/* * This is only used on smaller machines. */
Signature · 1 line
1.7.1
Re: [PATCH 03/16] x86: Make default_send_IPI_mask_sequence/allbutself_logical() 32bit only
Quoted 54 lines · Tejun Heo
Both functions are used only in 32bit. Put them inside
CONFIG_X86_32. This is to prepare for logical apicid handling update.- Cyrill Gorcunov spotted that I forgot to move declarations in
ipi.hunderCONFIG_X86_32. Fixed.Signed-off-by Tejun Heo <[email protected]>Reviewed-by Pekka Enberg <[email protected]>Reviewed-by Cyrill Gorcunov <[email protected]>---
arch/x86/include/asm/ipi.h | 8 ++++----
arch/x86/kernel/apic/ipi.c | 4 ++--2 files changed, 6 insertions(+), 6 deletions(-)arch/x86/include/asm/ipi.h +4
-4@@ -123,10 +123,6 @@ extern void default_send_IPI_mask_sequence_phys(const struct cpumask *mask, int vector); extern void default_send_IPI_mask_allbutself_phys(const struct cpumask *mask, int vector); -extern void default_send_IPI_mask_sequence_logical (const struct cpumask *mask, - int vector); -extern void default_send_IPI_mask_allbutself_logical (const struct cpumask *mask, - int vector); /* Avoid include hell */ #define NMI_VECTOR 0x02@@ -150,6 +146,10 @@ static inline void __default_local_send_IPI_all(int vector) } #ifdef CONFIG_X86_32 +extern void default_send_IPI_mask_sequence_logical (const struct cpumask *mask, + int vector); +extern void default_send_IPI_mask_allbutself_logical (const struct cpumask *mask, + int vector); extern void default_send_IPI_mask_logical(const struct cpumask *mask, int vector); extern void default_send_IPI_allbutself(int vector);arch/x86/kernel/apic/ipi.c +2
-0@@ -56,6 +56,8 @@ void default_send_IPI_mask_allbutself_phys(const struct cpumask *mask, local_irq_restore(flags); } +#ifdef CONFIG_X86_32 + void default_send_IPI_mask_sequence_logical(const struct cpumask *mask, int vector) {
arch/x86/kernel/apic/ipi.c void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask, · line 103
Quoted 8 lines
arch/x86/kernel/apic/ipi.c +0
-2@@ -96,8 +98,6 @@ void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask, local_irq_restore(flags); } -#ifdef CONFIG_X86_32 - /** This is only used on smaller machines. */
[tip:x86/numa] x86: Make default_send_IPI_mask_sequence/allbutself_logical() 32bit only
In reply to Tejun HeoCommit-ID: 1245e1668c6e52bee76a423f8fab3bfcdd6226ae Gitweb: http://git.kernel.org/tip/1245e1668c6e52bee76a423f8fab3bfcdd6226ae Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:29 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:05 +0100
x86: Make default_send_IPI_mask_sequence/allbutself_logical() 32bit only
Both functions are used only in 32bit. Put them inside CONFIG_X86_32. This is to prepare for logical apicid handling update.
- Cyrill Gorcunov spotted that I forgot to move declarations inipi.h under CONFIG_X86_32. Fixed.
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/ipi.h | 8 ++++---- arch/x86/kernel/apic/ipi.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-)
arch/x86/include/asm/ipi.h +4 -4
@@ -123,10 +123,6 @@ extern void default_send_IPI_mask_sequence_phys(const struct cpumask *mask, int vector);extern void default_send_IPI_mask_allbutself_phys (const struct cpumask *mask,int vector); -extern void default_send_IPI_mask_sequence_logical (const struct cpumask *mask, -int vector); -extern void default_send_IPI_mask_allbutself_logical (const struct cpumask *mask, -int vector);/* Avoid include hell */ #define NMI_VECTOR 0x02
@@ -150,6 +146,10 @@ static inline void __default_local_send_IPI_all(int vector) }#ifdef CONFIG_X86_32 +extern void default_send_IPI_mask_sequence_logical (const struct cpumask *mask, +int vector); +extern void default_send_IPI_mask_allbutself_logical (const struct cpumask *mask, +int vector);extern void default_send_IPI_mask_logical (const struct cpumask *mask,int vector);extern void default_send_IPI_allbutself (int vector);
arch/x86/kernel/apic/ipi.c +2 -2
@@ -56,6 +56,8 @@ void default_send_IPI_mask_allbutself_phys(const struct cpumask *mask,local_irq_restore (flags); } +#ifdef CONFIG_X86_32 +void default_send_IPI_mask_sequence_logical (const struct cpumask *mask,int vector) {
@@ -96,8 +98,6 @@ void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask,local_irq_restore (flags); } -#ifdef CONFIG_X86_32 -/* * This is only used on smaller machines. */
PATCH 4/16 x86: Replace cpu_2_logical_apicid[] with early percpu variable
In reply to Tejun HeoUnlike x86_64, on x86_32, the mapping from cpu to logical apicid may vary depending on apic in use. cpu_2_logical_apicid[] array is used for this mapping. Replace it with early percpu variable x86_cpu_to_logical_apicid to make it better aligned with other mappings.
--- arch/x86/include/asm/apic.h | 4 ---- arch/x86/include/asm/smp.h | 3 +++ arch/x86/kernel/apic/apic.c | 11 +++++++++++ arch/x86/kernel/apic/es7000_32.c | 2 +- arch/x86/kernel/apic/numaq_32.c | 2 +- arch/x86/kernel/apic/summit_32.c | 4 ++-- arch/x86/kernel/setup_percpu.c | 7 +++++++ arch/x86/kernel/smpboot.c | 7 ++----- 8 files changed, 27 insertions(+), 13 deletions(-)
arch/x86/include/asm/apic.h +0 -4
@@ -595,8 +595,4 @@ extern int default_check_phys_apicid_present(int phys_apicid);#endif /* CONFIG_X86_LOCAL_APIC */ -#ifdef CONFIG_X86_32 -extern u8 cpu_2_logical_apicid[NR_CPUS ]; -#endif -#endif /* _ASM_X86_APIC_H */
arch/x86/include/asm/smp.h +3 -0
@@ -38,6 +38,9 @@ static inline struct cpumask *cpu_core_mask(int cpu)DECLARE_EARLY_PER_CPU (u16, x86_cpu_to_apicid);DECLARE_EARLY_PER_CPU (u16, x86_bios_cpu_apicid); +#if defined(CONFIG_SMP ) && defined(CONFIG_X86_32 ) +DECLARE_EARLY_PER_CPU (int, x86_cpu_to_logical_apicid); +#endif /* Static state in head.S used to set up a CPU */ extern struct {
arch/x86/kernel/apic/apic.c +11 -0
@@ -78,6 +78,17 @@ EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_apicid);EXPORT_EARLY_PER_CPU_SYMBOL (x86_bios_cpu_apicid);#ifdef CONFIG_X86_32 + +#ifdef CONFIG_SMP +/* +* On x86_32, the mapping between cpu and logical apicid may vary +* depending on apic in use. The following early percpu variable is +* used for the mapping. This is where the behaviors of x86_64 and 32 +* actually diverge. Let's keep it ugly for now. +*/ +DEFINE_EARLY_PER_CPU (int, x86_cpu_to_logical_apicid,BAD_APICID ); +#endif +/* * Knob to control our willingness to enable the local APIC. *
arch/x86/kernel/apic/es7000_32.c +1 -1
@@ -534,7 +534,7 @@ static int es7000_cpu_to_logical_apicid(int cpu)#ifdef CONFIG_SMP if (cpu >= nr_cpu_ids)return BAD_APICID ; -return cpu_2_logical_apicid[cpu]; +return early_per_cpu (x86_cpu_to_logical_apicid, cpu);#else return logical_smp_processor_id ();#endif
arch/x86/kernel/apic/numaq_32.c +1 -1
@@ -377,7 +377,7 @@ static inline int numaq_cpu_to_logical_apicid(int cpu) {if (cpu >= nr_cpu_ids)return BAD_APICID ; -return cpu_2_logical_apicid[cpu]; +return early_per_cpu (x86_cpu_to_logical_apicid, cpu); }/*
arch/x86/kernel/apic/summit_32.c +2 -2
@@ -206,7 +206,7 @@ static void summit_init_apic_ldr(void)/* Create logical APIC IDs by counting CPUs already in cluster. */ for (count =0 , i = nr_cpu_ids; --i >=0 ; ) { - lid = cpu_2_logical_apicid[i]; + lid =early_per_cpu (x86_cpu_to_logical_apicid, i);if (lid !=BAD_APICID &&APIC_CLUSTER (lid) == my_cluster) ++count; }
@@ -247,7 +247,7 @@ static inline int summit_cpu_to_logical_apicid(int cpu)#ifdef CONFIG_SMP if (cpu >= nr_cpu_ids)return BAD_APICID ; -return cpu_2_logical_apicid[cpu]; +return early_per_cpu (x86_cpu_to_logical_apicid, cpu);#else return logical_smp_processor_id ();#endif
arch/x86/kernel/setup_percpu.c +7 -0
@@ -225,6 +225,10 @@ void __init setup_per_cpu_areas(void)per_cpu (x86_bios_cpu_apicid, cpu) =early_per_cpu_map (x86_bios_cpu_apicid, cpu);#endif +#ifdef CONFIG_X86_32 +per_cpu (x86_cpu_to_logical_apicid, cpu) = +early_per_cpu_map (x86_cpu_to_logical_apicid, cpu); +#endif #ifdef CONFIG_X86_64 per_cpu (irq_stack_ptr, cpu) = per_cpu(irq_stack_union.irq_stack, cpu) +
@@ -256,6 +260,9 @@ void __init setup_per_cpu_areas(void)early_per_cpu_ptr (x86_cpu_to_apicid) =NULL ;early_per_cpu_ptr (x86_bios_cpu_apicid) =NULL ;#endif +#ifdef CONFIG_X86_32 +early_per_cpu_ptr (x86_cpu_to_logical_apicid) =NULL ; +#endif #if defined(CONFIG_X86_64 ) && defined(CONFIG_NUMA )early_per_cpu_ptr (x86_cpu_to_node_map) =NULL ;#endif
arch/x86/kernel/smpboot.c +2 -5
@@ -165,9 +165,6 @@ static void unmap_cpu_to_node(int cpu)#endif #ifdef CONFIG_X86_32 -u8 cpu_2_logical_apicid[NR_CPUS ]__read_mostly = - { [0 ...NR_CPUS -1 ] =BAD_APICID }; -static void map_cpu_to_logical_apicid (void ) {int cpu =smp_processor_id ();
@@ -177,13 +174,13 @@ static void map_cpu_to_logical_apicid(void)if (!node_online (node)) node = first_online_node; - cpu_2_logical_apicid[cpu] = apicid; +early_per_cpu (x86_cpu_to_logical_apicid, cpu) = apicid; map_cpu_to_node(cpu, node); }void numa_remove_cpu (int cpu) { - cpu_2_logical_apicid[cpu] =BAD_APICID ; +early_per_cpu (x86_cpu_to_logical_apicid, cpu) =BAD_APICID ;unmap_cpu_to_node (cpu); }#else
Signature · 1 line
1.7.1
Re: [PATCH 04/16] x86: Replace cpu_2_logical_apicid[] with early percpu variable
Quoted 36 lines · Tejun Heo
Unlike
x86_64, onx86_32, the mapping from cpu to logical apicid may vary depending on apic in use. cpu_2_logical_apicid[] array is used for this mapping. Replace it with early percpu variablex86_cpu_to_logical_apicidto make it better aligned with other mappings.Signed-off-by Tejun Heo <[email protected]>---
arch/x86/include/asm/apic.h | 4 ---- arch/x86/include/asm/smp.h | 3 +++ arch/x86/kernel/apic/apic.c | 11 +++++++++++arch/x86/kernel/apic/es7000_32.c | 2 +-
arch/x86/kernel/apic/numaq_32.c | 2 +-
arch/x86/kernel/apic/summit_32.c | 4 ++--
arch/x86/kernel/setup_percpu.c | 7 +++++++
arch/x86/kernel/smpboot.c | 7 ++-----8 files changed, 27 insertions(+), 13 deletions(-)arch/x86/include/asm/apic.h +0
-4@@ -595,8 +595,4 @@ extern int default_check_phys_apicid_present(int phys_apicid); #endif /* CONFIG_X86_LOCAL_APIC */ -#ifdef CONFIG_X86_32 -extern u8 cpu_2_logical_apicid[NR_CPUS ]; -#endif - #endif /* _ASM_X86_APIC_H */arch/x86/include/asm/smp.h +0
-0
arch/x86/include/asm/smp.h static inline struct cpumask *cpu_core_mask(int cpu) · line 43
Quoted 6 lines
arch/x86/include/asm/smp.h +3
-0@@ -38,6 +38,9 @@ static inline struct cpumask *cpu_core_mask(int cpu) DECLARE_EARLY_PER_CPU(u16, x86_cpu_to_apicid); DECLARE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid); +#if defined(CONFIG_SMP ) && defined(CONFIG_X86_32 ) +DECLARE_EARLY_PER_CPU (int, x86_cpu_to_logical_apicid); +#endif
why changing it from u8 to int?
Thanks
Yinghai
Re: [PATCH 04/16] x86: Replace cpu_2_logical_apicid[] with early percpu variable
Quoted 7 lines · Yinghai Lu
arch/x86/include/asm/smp.h static inline struct cpumask *cpu_core_mask(int cpu) · line 43
Quoted 5 lines
DECLARE_EARLY_PER_CPU(u16,
x86_cpu_to_apicid);
DECLARE_EARLY_PER_CPU(u16,x86_bios_cpu_apicid);arch/x86/include/asm/smp.h +3
-0+#if defined(CONFIG_SMP ) && defined(CONFIG_X86_32 ) +DECLARE_EARLY_PER_CPU (int, x86_cpu_to_logical_apicid); +#endif why changing it from u8 to int?
Because all other apic ids are int. The phys ones are shared with 64bit, so they can't be u8. I thought it would be more consistent to have int for logicals too.
Thanks.
--
tejun
[tip:x86/numa] x86: Replace cpu_2_logical_apicid[] with early percpu variable
In reply to Tejun HeoCommit-ID: 4c321ff8a01a95badf5d5403d80ca4e0ab07fce7 Gitweb: http://git.kernel.org/tip/4c321ff8a01a95badf5d5403d80ca4e0ab07fce7 Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:30 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:05 +0100
x86: Replace cpu_2_logical_apicid[] with early percpu variable
Unlike x86_64, on x86_32, the mapping from cpu to logical apicid may vary depending on apic in use. cpu_2_logical_apicid[] array is used for this mapping. Replace it with early percpu variable x86_cpu_to_logical_apicid to make it better aligned with other mappings.
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/apic.h | 4 ---- arch/x86/include/asm/smp.h | 3 +++ arch/x86/kernel/apic/apic.c | 11 +++++++++++ arch/x86/kernel/apic/es7000_32.c | 2 +- arch/x86/kernel/apic/numaq_32.c | 2 +- arch/x86/kernel/apic/summit_32.c | 4 ++-- arch/x86/kernel/setup_percpu.c | 7 +++++++ arch/x86/kernel/smpboot.c | 7 ++----- 8 files changed, 27 insertions(+), 13 deletions(-)
arch/x86/include/asm/apic.h +0 -4
@@ -595,8 +595,4 @@ extern int default_check_phys_apicid_present(int phys_apicid);#endif /* CONFIG_X86_LOCAL_APIC */ -#ifdef CONFIG_X86_32 -extern u8 cpu_2_logical_apicid[NR_CPUS ]; -#endif -#endif /* _ASM_X86_APIC_H */
arch/x86/include/asm/smp.h +3 -0
@@ -38,6 +38,9 @@ static inline struct cpumask *cpu_core_mask(int cpu)DECLARE_EARLY_PER_CPU (u16, x86_cpu_to_apicid);DECLARE_EARLY_PER_CPU (u16, x86_bios_cpu_apicid); +#if defined(CONFIG_SMP ) && defined(CONFIG_X86_32 ) +DECLARE_EARLY_PER_CPU (int, x86_cpu_to_logical_apicid); +#endif /* Static state in head.S used to set up a CPU */ extern struct {
arch/x86/kernel/apic/apic.c +11 -0
@@ -78,6 +78,17 @@ EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_apicid);EXPORT_EARLY_PER_CPU_SYMBOL (x86_bios_cpu_apicid);#ifdef CONFIG_X86_32 + +#ifdef CONFIG_SMP +/* +* On x86_32, the mapping between cpu and logical apicid may vary +* depending on apic in use. The following early percpu variable is +* used for the mapping. This is where the behaviors of x86_64 and 32 +* actually diverge. Let's keep it ugly for now. +*/ +DEFINE_EARLY_PER_CPU (int, x86_cpu_to_logical_apicid,BAD_APICID ); +#endif +/* * Knob to control our willingness to enable the local APIC. *
arch/x86/kernel/apic/es7000_32.c +1 -1
@@ -534,7 +534,7 @@ static int es7000_cpu_to_logical_apicid(int cpu)#ifdef CONFIG_SMP if (cpu >= nr_cpu_ids)return BAD_APICID ; -return cpu_2_logical_apicid[cpu]; +return early_per_cpu (x86_cpu_to_logical_apicid, cpu);#else return logical_smp_processor_id ();#endif
arch/x86/kernel/apic/numaq_32.c +1 -1
@@ -377,7 +377,7 @@ static inline int numaq_cpu_to_logical_apicid(int cpu) {if (cpu >= nr_cpu_ids)return BAD_APICID ; -return cpu_2_logical_apicid[cpu]; +return early_per_cpu (x86_cpu_to_logical_apicid, cpu); }/*
arch/x86/kernel/apic/summit_32.c +2 -2
@@ -206,7 +206,7 @@ static void summit_init_apic_ldr(void)/* Create logical APIC IDs by counting CPUs already in cluster. */ for (count =0 , i = nr_cpu_ids; --i >=0 ; ) { - lid = cpu_2_logical_apicid[i]; + lid =early_per_cpu (x86_cpu_to_logical_apicid, i);if (lid !=BAD_APICID &&APIC_CLUSTER (lid) == my_cluster) ++count; }
@@ -247,7 +247,7 @@ static inline int summit_cpu_to_logical_apicid(int cpu)#ifdef CONFIG_SMP if (cpu >= nr_cpu_ids)return BAD_APICID ; -return cpu_2_logical_apicid[cpu]; +return early_per_cpu (x86_cpu_to_logical_apicid, cpu);#else return logical_smp_processor_id ();#endif
arch/x86/kernel/setup_percpu.c +7 -0
@@ -225,6 +225,10 @@ void __init setup_per_cpu_areas(void)per_cpu (x86_bios_cpu_apicid, cpu) =early_per_cpu_map (x86_bios_cpu_apicid, cpu);#endif +#ifdef CONFIG_X86_32 +per_cpu (x86_cpu_to_logical_apicid, cpu) = +early_per_cpu_map (x86_cpu_to_logical_apicid, cpu); +#endif #ifdef CONFIG_X86_64 per_cpu (irq_stack_ptr, cpu) = per_cpu(irq_stack_union.irq_stack, cpu) +
@@ -256,6 +260,9 @@ void __init setup_per_cpu_areas(void)early_per_cpu_ptr (x86_cpu_to_apicid) =NULL ;early_per_cpu_ptr (x86_bios_cpu_apicid) =NULL ;#endif +#ifdef CONFIG_X86_32 +early_per_cpu_ptr (x86_cpu_to_logical_apicid) =NULL ; +#endif #if defined(CONFIG_X86_64 ) && defined(CONFIG_NUMA )early_per_cpu_ptr (x86_cpu_to_node_map) =NULL ;#endif
arch/x86/kernel/smpboot.c +2 -5
@@ -165,9 +165,6 @@ static void unmap_cpu_to_node(int cpu)#endif #ifdef CONFIG_X86_32 -u8 cpu_2_logical_apicid[NR_CPUS ]__read_mostly = - { [0 ...NR_CPUS -1 ] =BAD_APICID }; -static void map_cpu_to_logical_apicid (void ) {int cpu =smp_processor_id ();
@@ -177,13 +174,13 @@ static void map_cpu_to_logical_apicid(void)if (!node_online (node)) node = first_online_node; - cpu_2_logical_apicid[cpu] = apicid; +early_per_cpu (x86_cpu_to_logical_apicid, cpu) = apicid; map_cpu_to_node(cpu, node); }void numa_remove_cpu (int cpu) { - cpu_2_logical_apicid[cpu] =BAD_APICID ; +early_per_cpu (x86_cpu_to_logical_apicid, cpu) =BAD_APICID ;unmap_cpu_to_node (cpu); }#else
PATCH 5/16 x86: Always use x86_cpu_to_logical_apicid for cpu -> logical apic id
In reply to Tejun HeoCurrently, cpu -> logical apic id translation is done by apic->cpu_to_logical_apicid() callback which may or may not use x86_cpu_to_logical_apicid. This is unnecessary as it should always equal logical_smp_processor_id() which is known early during CPU bring up.
Initialize x86_cpu_to_logical_apicid after apic->init_apic_ldr() in setup_local_APIC() and always use x86_cpu_to_logical_apicid for cpu -> logical apic id mapping.
--- arch/x86/kernel/apic/apic.c | 8 ++++++++ arch/x86/kernel/apic/ipi.c | 8 ++++---- arch/x86/kernel/smpboot.c | 7 +++---- 3 files changed, 15 insertions(+), 8 deletions(-)
arch/x86/kernel/apic/apic.c +8 -0
@@ -1248,6 +1248,14 @@ void __cpuinit setup_local_APIC(void)*/ apic->init_apic_ldr (); +#ifdef CONFIG_X86_32 +/* +* APIC LDR is initialized. Fetch and store logical_apic_id. +*/ +early_per_cpu (x86_cpu_to_logical_apicid, cpu) = +logical_smp_processor_id (); +#endif +/* * Set Task Priority to 'accept all'. We never change this * later on.
arch/x86/kernel/apic/ipi.c +4 -4
@@ -73,8 +73,8 @@ void default_send_IPI_mask_sequence_logical(const struct cpumask *mask,local_irq_save (flags);for_each_cpu (query_cpu, mask)__default_send_IPI_dest_field ( - apic->cpu_to_logical_apicid (query_cpu), vector, - apic->dest_logical); +early_per_cpu (x86_cpu_to_logical_apicid, query_cpu), + vector, apic->dest_logical);local_irq_restore (flags); }
@@ -92,8 +92,8 @@ void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask,if (query_cpu == this_cpu)continue ;__default_send_IPI_dest_field ( - apic->cpu_to_logical_apicid (query_cpu), vector, - apic->dest_logical); +early_per_cpu (x86_cpu_to_logical_apicid, query_cpu), + vector, apic->dest_logical); }local_irq_restore (flags); }
arch/x86/kernel/smpboot.c +3 -4
@@ -168,19 +168,18 @@ static void unmap_cpu_to_node(int cpu)static void map_cpu_to_logical_apicid (void ) {int cpu =smp_processor_id (); -int apicid =logical_smp_processor_id (); -int node = apic->apicid_to_node (apicid); +int logical_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu); +int node; + node = apic->apicid_to_node (logical_apicid);if (!node_online (node)) node = first_online_node; -early_per_cpu (x86_cpu_to_logical_apicid, cpu) = apicid;map_cpu_to_node (cpu, node); }void numa_remove_cpu (int cpu) { -early_per_cpu (x86_cpu_to_logical_apicid, cpu) =BAD_APICID ;unmap_cpu_to_node (cpu); }#else
Signature · 1 line
1.7.1
[tip:x86/numa] x86: Always use x86_cpu_to_logical_apicid for cpu -> logical apic id
Commit-ID: 6f802c4bfa2acf1bffa8341fe9084da0205d581d Gitweb: http://git.kernel.org/tip/6f802c4bfa2acf1bffa8341fe9084da0205d581d Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:31 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:05 +0100
x86: Always use x86_cpu_to_logical_apicid for cpu -> logical apic id
Currently, cpu -> logical apic id translation is done by apic->cpu_to_logical_apicid() callback which may or may not use x86_cpu_to_logical_apicid. This is unnecessary as it should always equal logical_smp_processor_id() which is known early during CPU bring up.
Initialize x86_cpu_to_logical_apicid after apic->init_apic_ldr() in setup_local_APIC() and always use x86_cpu_to_logical_apicid for cpu -> logical apic id mapping.
LKML-Reference: <[email protected]>
--- arch/x86/kernel/apic/apic.c | 8 ++++++++ arch/x86/kernel/apic/ipi.c | 8 ++++---- arch/x86/kernel/smpboot.c | 7 +++---- 3 files changed, 15 insertions(+), 8 deletions(-)
arch/x86/kernel/apic/apic.c +8 -0
@@ -1248,6 +1248,14 @@ void __cpuinit setup_local_APIC(void)*/ apic->init_apic_ldr (); +#ifdef CONFIG_X86_32 +/* +* APIC LDR is initialized. Fetch and store logical_apic_id. +*/ +early_per_cpu (x86_cpu_to_logical_apicid, cpu) = +logical_smp_processor_id (); +#endif +/* * Set Task Priority to 'accept all'. We never change this * later on.
arch/x86/kernel/apic/ipi.c +4 -4
@@ -73,8 +73,8 @@ void default_send_IPI_mask_sequence_logical(const struct cpumask *mask,local_irq_save (flags);for_each_cpu (query_cpu, mask)__default_send_IPI_dest_field ( - apic->cpu_to_logical_apicid (query_cpu), vector, - apic->dest_logical); +early_per_cpu (x86_cpu_to_logical_apicid, query_cpu), + vector, apic->dest_logical);local_irq_restore (flags); }
@@ -92,8 +92,8 @@ void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask,if (query_cpu == this_cpu)continue ;__default_send_IPI_dest_field ( - apic->cpu_to_logical_apicid (query_cpu), vector, - apic->dest_logical); +early_per_cpu (x86_cpu_to_logical_apicid, query_cpu), + vector, apic->dest_logical); }local_irq_restore (flags); }
arch/x86/kernel/smpboot.c +3 -4
@@ -168,19 +168,18 @@ static void unmap_cpu_to_node(int cpu)static void map_cpu_to_logical_apicid (void ) {int cpu =smp_processor_id (); -int apicid =logical_smp_processor_id (); -int node = apic->apicid_to_node (apicid); +int logical_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu); +int node; + node = apic->apicid_to_node (logical_apicid);if (!node_online (node)) node = first_online_node; -early_per_cpu (x86_cpu_to_logical_apicid, cpu) = apicid;map_cpu_to_node (cpu, node); }void numa_remove_cpu (int cpu) { -early_per_cpu (x86_cpu_to_logical_apicid, cpu) =BAD_APICID ;unmap_cpu_to_node (cpu); }#else
PATCH 6/16 x86: Kill apic->cpu_to_logical_apicid()
In reply to Tejun HeoAfter the previous patch, apic->cpu_to_logical_apicid() is no longer used. Kill it.
For apic types with custom cpu_to_logical_apicid() which is also used for other purposes, remove the function and modify its users to do the mapping directly.
#ifdef's on CONFIG_SMP in es7000_32 and summit_32 are ignored during conversion as they are not used for UP kernels.
--- arch/x86/include/asm/apic.h | 7 ------- arch/x86/kernel/apic/apic_flat_64.c | 2 -- arch/x86/kernel/apic/apic_noop.c | 6 ------ arch/x86/kernel/apic/bigsmp_32.c | 19 +++++++------------ arch/x86/kernel/apic/es7000_32.c | 18 ++---------------- arch/x86/kernel/apic/numaq_32.c | 8 -------- arch/x86/kernel/apic/probe_32.c | 1 - arch/x86/kernel/apic/summit_32.c | 17 ++--------------- arch/x86/kernel/apic/x2apic_cluster.c | 1 - arch/x86/kernel/apic/x2apic_phys.c | 1 - arch/x86/kernel/apic/x2apic_uv_x.c | 1 - 11 files changed, 11 insertions(+), 70 deletions(-)
arch/x86/include/asm/apic.h +0 -7
@@ -307,7 +307,6 @@ struct apic {void (*setup_apic_routing)(void );int (*multi_timer_check)(int apic,int irq);int (*apicid_to_node)(int logical_apicid); -int (*cpu_to_logical_apicid)(int cpu);int (*cpu_present_to_apicid)(int mps_cpu);void (*apicid_to_cpu_present)(int phys_apicid,physid_mask_t *retmap);void (*setup_portio_remap)(void );
@@ -557,12 +556,6 @@ static inline void default_ioapic_phys_id_map(physid_mask_t *phys_map, physid_ma *retmap = *phys_map; } -/* Mapping from cpu number to logical apicid */ -static inline int default_cpu_to_logical_apicid (int cpu) -{ -return 1 << cpu; -} -static inline int __default_cpu_present_to_apicid (int mps_cpu) {if (mps_cpu < nr_cpu_ids &&cpu_present (mps_cpu))
arch/x86/kernel/apic/apic_flat_64.c +0 -2
@@ -186,7 +186,6 @@ struct apic apic_flat = { .setup_apic_routing = NULL, .multi_timer_check = NULL, .apicid_to_node = NULL, - .cpu_to_logical_apicid = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
@@ -338,7 +337,6 @@ struct apic apic_physflat = { .setup_apic_routing = NULL, .multi_timer_check = NULL, .apicid_to_node = NULL, - .cpu_to_logical_apicid = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/apic/apic_noop.c +0 -6
@@ -54,11 +54,6 @@ static u64 noop_apic_icr_read(void)return 0 ; } -static int noop_cpu_to_logical_apicid (int cpu) -{ -return 0 ; -} -static int noop_phys_pkg_id (int cpuid_apic,int index_msb) {return 0 ;
@@ -155,7 +150,6 @@ struct apic apic_noop = { .multi_timer_check = NULL, .apicid_to_node = noop_apicid_to_node, - .cpu_to_logical_apicid = noop_cpu_to_logical_apicid, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = physid_set_mask_of_physid,
arch/x86/kernel/apic/bigsmp_32.c +7 -12
@@ -93,14 +93,6 @@ static int bigsmp_cpu_present_to_apicid(int mps_cpu)return BAD_APICID ; } -/* Mapping from cpu number to logical apicid */ -static inline int bigsmp_cpu_to_logical_apicid (int cpu) -{ -if (cpu >= nr_cpu_ids) -return BAD_APICID ; -return cpu_physical_id (cpu); -} -static void bigsmp_ioapic_phys_id_map (physid_mask_t *phys_map,physid_mask_t *retmap) {/* For clustered we don't have a good way to do this yet - hack */
@@ -115,7 +107,11 @@ static int bigsmp_check_phys_apicid_present(int phys_apicid)/* As we are using single CPU as destination, pick only one CPU here */ static unsigned int bigsmp_cpu_mask_to_apicid (const struct cpumask *cpumask) { -return bigsmp_cpu_to_logical_apicid (cpumask_first (cpumask)); +int cpu =cpumask_first (cpumask); + +if (cpu < nr_cpu_ids) +return cpu_physical_id (cpu); +return BAD_APICID ; } static unsigned int bigsmp_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
@@ -129,9 +125,9 @@ static unsigned int bigsmp_cpu_mask_to_apicid_and(const struct cpumask *cpumask,*/ for_each_cpu_and (cpu, cpumask, andmask) {if (cpumask_test_cpu (cpu, cpu_online_mask)) -break ; +return cpu_physical_id (cpu); } -return bigsmp_cpu_to_logical_apicid (cpu); +return BAD_APICID ; }static int bigsmp_phys_pkg_id (int cpuid_apic,int index_msb)
@@ -220,7 +216,6 @@ struct apic apic_bigsmp = { .setup_apic_routing = bigsmp_setup_apic_routing, .multi_timer_check = NULL, .apicid_to_node = bigsmp_apicid_to_node, - .cpu_to_logical_apicid = bigsmp_cpu_to_logical_apicid, .cpu_present_to_apicid = bigsmp_cpu_present_to_apicid, .apicid_to_cpu_present = physid_set_mask_of_physid, .setup_portio_remap = NULL,
arch/x86/kernel/apic/es7000_32.c +2 -16
@@ -528,18 +528,6 @@ static void es7000_apicid_to_cpu_present(int phys_apicid, physid_mask_t *retmap) ++cpu_id; } -/* Mapping from cpu number to logical apicid */ -static int es7000_cpu_to_logical_apicid (int cpu) -{ -#ifdef CONFIG_SMP -if (cpu >= nr_cpu_ids) -return BAD_APICID ; -return early_per_cpu (x86_cpu_to_logical_apicid, cpu); -#else -return logical_smp_processor_id (); -#endif -} -static void es7000_ioapic_phys_id_map (physid_mask_t *phys_map,physid_mask_t *retmap) {/* For clustered we don't have a good way to do this yet - hack */
@@ -561,7 +549,7 @@ static unsigned int es7000_cpu_mask_to_apicid(const struct cpumask *cpumask)* The cpus in the mask must all be on the apic cluster. */ for_each_cpu (cpu, cpumask) { -int new_apicid =es7000_cpu_to_logical_apicid (cpu); +int new_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu);if (round &&APIC_CLUSTER (apicid) !=APIC_CLUSTER (new_apicid)) {WARN (1 ,"Not a valid mask!" );
@@ -578,7 +566,7 @@ static unsigned int es7000_cpu_mask_to_apicid_and(const struct cpumask *inmask, const struct cpumask *andmask) { - int apicid = es7000_cpu_to_logical_apicid(0); + int apicid = early_per_cpu(x86_cpu_to_logical_apicid, 0);cpumask_var_t cpumask;if (!alloc_cpumask_var (&cpumask,GFP_ATOMIC ))
@@ -656,7 +644,6 @@ struct apic __refdata apic_es7000_cluster = { .setup_apic_routing = es7000_setup_apic_routing, .multi_timer_check = NULL, .apicid_to_node = es7000_apicid_to_node, - .cpu_to_logical_apicid = es7000_cpu_to_logical_apicid, .cpu_present_to_apicid = es7000_cpu_present_to_apicid, .apicid_to_cpu_present = es7000_apicid_to_cpu_present, .setup_portio_remap = NULL,
@@ -721,7 +708,6 @@ struct apic __refdata apic_es7000 = { .setup_apic_routing = es7000_setup_apic_routing, .multi_timer_check = NULL, .apicid_to_node = es7000_apicid_to_node, - .cpu_to_logical_apicid = es7000_cpu_to_logical_apicid, .cpu_present_to_apicid = es7000_cpu_present_to_apicid, .apicid_to_cpu_present = es7000_apicid_to_cpu_present, .setup_portio_remap = NULL,
arch/x86/kernel/apic/numaq_32.c +0 -8
@@ -373,13 +373,6 @@ static inline void numaq_ioapic_phys_id_map(physid_mask_t *phys_map, physid_maskreturn physids_promote (0xFUL , retmap); } -static inline int numaq_cpu_to_logical_apicid (int cpu) -{ -if (cpu >= nr_cpu_ids) -return BAD_APICID ; -return early_per_cpu (x86_cpu_to_logical_apicid, cpu); -} -/* * Supporting over 60 cpus on NUMA-Q requires a locality-dependent * cpu to APIC ID relation to properly interact with the intelligent
@@ -509,7 +502,6 @@ struct apic __refdata apic_numaq = { .setup_apic_routing = numaq_setup_apic_routing, .multi_timer_check = numaq_multi_timer_check, .apicid_to_node = numaq_apicid_to_node, - .cpu_to_logical_apicid = numaq_cpu_to_logical_apicid, .cpu_present_to_apicid = numaq_cpu_present_to_apicid, .apicid_to_cpu_present = numaq_apicid_to_cpu_present, .setup_portio_remap = numaq_setup_portio_remap,
arch/x86/kernel/apic/probe_32.c +0 -1
@@ -131,7 +131,6 @@ struct apic apic_default = { .setup_apic_routing = setup_apic_flat_routing, .multi_timer_check = NULL, .apicid_to_node = default_apicid_to_node, - .cpu_to_logical_apicid = default_cpu_to_logical_apicid, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = physid_set_mask_of_physid, .setup_portio_remap = NULL,
arch/x86/kernel/apic/summit_32.c +2 -15
@@ -241,18 +241,6 @@ static int summit_apicid_to_node(int logical_apicid)#endif } -/* Mapping from cpu number to logical apicid */ -static inline int summit_cpu_to_logical_apicid (int cpu) -{ -#ifdef CONFIG_SMP -if (cpu >= nr_cpu_ids) -return BAD_APICID ; -return early_per_cpu (x86_cpu_to_logical_apicid, cpu); -#else -return logical_smp_processor_id (); -#endif -} -static int summit_cpu_present_to_apicid (int mps_cpu) {if (mps_cpu < nr_cpu_ids)
@@ -286,7 +274,7 @@ static unsigned int summit_cpu_mask_to_apicid(const struct cpumask *cpumask)* The cpus in the mask must all be on the apic cluster. */ for_each_cpu (cpu, cpumask) { -int new_apicid =summit_cpu_to_logical_apicid (cpu); +int new_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu);if (round &&APIC_CLUSTER (apicid) !=APIC_CLUSTER (new_apicid)) {printk ("%s: Not a valid mask!\n" , __func__);
@@ -301,7 +289,7 @@ static unsigned int summit_cpu_mask_to_apicid(const struct cpumask *cpumask)static unsigned int summit_cpu_mask_to_apicid_and (const struct cpumask *inmask,const struct cpumask *andmask) { -int apicid =summit_cpu_to_logical_apicid (0 ); +int apicid =early_per_cpu (x86_cpu_to_logical_apicid,0 );cpumask_var_t cpumask;if (!alloc_cpumask_var (&cpumask,GFP_ATOMIC ))
@@ -529,7 +517,6 @@ struct apic apic_summit = { .setup_apic_routing = summit_setup_apic_routing, .multi_timer_check = NULL, .apicid_to_node = summit_apicid_to_node, - .cpu_to_logical_apicid = summit_cpu_to_logical_apicid, .cpu_present_to_apicid = summit_cpu_present_to_apicid, .apicid_to_cpu_present = summit_apicid_to_cpu_present, .setup_portio_remap = NULL,
arch/x86/kernel/apic/x2apic_cluster.c +0 -1
@@ -207,7 +207,6 @@ struct apic apic_x2apic_cluster = { .setup_apic_routing = NULL, .multi_timer_check = NULL, .apicid_to_node = NULL, - .cpu_to_logical_apicid = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/apic/x2apic_phys.c +0 -1
@@ -196,7 +196,6 @@ struct apic apic_x2apic_phys = { .setup_apic_routing = NULL, .multi_timer_check = NULL, .apicid_to_node = NULL, - .cpu_to_logical_apicid = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/apic/x2apic_uv_x.c +0 -1
@@ -339,7 +339,6 @@ struct apic __refdata apic_x2apic_uv_x = { .setup_apic_routing = NULL, .multi_timer_check = NULL, .apicid_to_node = NULL, - .cpu_to_logical_apicid = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
Signature · 1 line
1.7.1
[tip:x86/numa] x86: Kill apic->cpu_to_logical_apicid()
Commit-ID: 7632611f534340182c832d2b139cb19676f24e1a Gitweb: http://git.kernel.org/tip/7632611f534340182c832d2b139cb19676f24e1a Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:32 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:06 +0100
x86: Kill apic->cpu_to_logical_apicid()
After the previous patch, apic->cpu_to_logical_apicid() is no longer used. Kill it.
For apic types with custom cpu_to_logical_apicid() which is also used for other purposes, remove the function and modify its users to do the mapping directly.
#ifdef's on CONFIG_SMP in es7000_32 and summit_32 are ignored during conversion as they are not used for UP kernels.
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/apic.h | 7 ------- arch/x86/kernel/apic/apic_flat_64.c | 2 -- arch/x86/kernel/apic/apic_noop.c | 6 ------ arch/x86/kernel/apic/bigsmp_32.c | 19 +++++++------------ arch/x86/kernel/apic/es7000_32.c | 18 ++---------------- arch/x86/kernel/apic/numaq_32.c | 8 -------- arch/x86/kernel/apic/probe_32.c | 1 - arch/x86/kernel/apic/summit_32.c | 17 ++--------------- arch/x86/kernel/apic/x2apic_cluster.c | 1 - arch/x86/kernel/apic/x2apic_phys.c | 1 - arch/x86/kernel/apic/x2apic_uv_x.c | 1 - 11 files changed, 11 insertions(+), 70 deletions(-)
arch/x86/include/asm/apic.h +0 -7
@@ -307,7 +307,6 @@ struct apic {void (*setup_apic_routing)(void );int (*multi_timer_check)(int apic,int irq);int (*apicid_to_node)(int logical_apicid); -int (*cpu_to_logical_apicid)(int cpu);int (*cpu_present_to_apicid)(int mps_cpu);void (*apicid_to_cpu_present)(int phys_apicid,physid_mask_t *retmap);void (*setup_portio_remap)(void );
@@ -557,12 +556,6 @@ static inline void default_ioapic_phys_id_map(physid_mask_t *phys_map, physid_ma *retmap = *phys_map; } -/* Mapping from cpu number to logical apicid */ -static inline int default_cpu_to_logical_apicid (int cpu) -{ -return 1 << cpu; -} -static inline int __default_cpu_present_to_apicid (int mps_cpu) {if (mps_cpu < nr_cpu_ids &&cpu_present (mps_cpu))
arch/x86/kernel/apic/apic_flat_64.c +0 -2
@@ -186,7 +186,6 @@ struct apic apic_flat = { .setup_apic_routing = NULL, .multi_timer_check = NULL, .apicid_to_node = NULL, - .cpu_to_logical_apicid = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
@@ -338,7 +337,6 @@ struct apic apic_physflat = { .setup_apic_routing = NULL, .multi_timer_check = NULL, .apicid_to_node = NULL, - .cpu_to_logical_apicid = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/apic/apic_noop.c +0 -6
@@ -54,11 +54,6 @@ static u64 noop_apic_icr_read(void)return 0 ; } -static int noop_cpu_to_logical_apicid (int cpu) -{ -return 0 ; -} -static int noop_phys_pkg_id (int cpuid_apic,int index_msb) {return 0 ;
@@ -155,7 +150,6 @@ struct apic apic_noop = { .multi_timer_check = NULL, .apicid_to_node = noop_apicid_to_node, - .cpu_to_logical_apicid = noop_cpu_to_logical_apicid, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = physid_set_mask_of_physid,
arch/x86/kernel/apic/bigsmp_32.c +7 -12
@@ -93,14 +93,6 @@ static int bigsmp_cpu_present_to_apicid(int mps_cpu)return BAD_APICID ; } -/* Mapping from cpu number to logical apicid */ -static inline int bigsmp_cpu_to_logical_apicid (int cpu) -{ -if (cpu >= nr_cpu_ids) -return BAD_APICID ; -return cpu_physical_id (cpu); -} -static void bigsmp_ioapic_phys_id_map (physid_mask_t *phys_map,physid_mask_t *retmap) {/* For clustered we don't have a good way to do this yet - hack */
@@ -115,7 +107,11 @@ static int bigsmp_check_phys_apicid_present(int phys_apicid)/* As we are using single CPU as destination, pick only one CPU here */ static unsigned int bigsmp_cpu_mask_to_apicid (const struct cpumask *cpumask) { -return bigsmp_cpu_to_logical_apicid (cpumask_first (cpumask)); +int cpu =cpumask_first (cpumask); + +if (cpu < nr_cpu_ids) +return cpu_physical_id (cpu); +return BAD_APICID ; } static unsigned int bigsmp_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
@@ -129,9 +125,9 @@ static unsigned int bigsmp_cpu_mask_to_apicid_and(const struct cpumask *cpumask,*/ for_each_cpu_and (cpu, cpumask, andmask) {if (cpumask_test_cpu (cpu, cpu_online_mask)) -break ; +return cpu_physical_id (cpu); } -return bigsmp_cpu_to_logical_apicid (cpu); +return BAD_APICID ; }static int bigsmp_phys_pkg_id (int cpuid_apic,int index_msb)
@@ -220,7 +216,6 @@ struct apic apic_bigsmp = { .setup_apic_routing = bigsmp_setup_apic_routing, .multi_timer_check = NULL, .apicid_to_node = bigsmp_apicid_to_node, - .cpu_to_logical_apicid = bigsmp_cpu_to_logical_apicid, .cpu_present_to_apicid = bigsmp_cpu_present_to_apicid, .apicid_to_cpu_present = physid_set_mask_of_physid, .setup_portio_remap = NULL,
arch/x86/kernel/apic/es7000_32.c +2 -16
@@ -528,18 +528,6 @@ static void es7000_apicid_to_cpu_present(int phys_apicid, physid_mask_t *retmap) ++cpu_id; } -/* Mapping from cpu number to logical apicid */ -static int es7000_cpu_to_logical_apicid (int cpu) -{ -#ifdef CONFIG_SMP -if (cpu >= nr_cpu_ids) -return BAD_APICID ; -return early_per_cpu (x86_cpu_to_logical_apicid, cpu); -#else -return logical_smp_processor_id (); -#endif -} -static void es7000_ioapic_phys_id_map (physid_mask_t *phys_map,physid_mask_t *retmap) {/* For clustered we don't have a good way to do this yet - hack */
@@ -561,7 +549,7 @@ static unsigned int es7000_cpu_mask_to_apicid(const struct cpumask *cpumask)* The cpus in the mask must all be on the apic cluster. */ for_each_cpu (cpu, cpumask) { -int new_apicid =es7000_cpu_to_logical_apicid (cpu); +int new_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu);if (round &&APIC_CLUSTER (apicid) !=APIC_CLUSTER (new_apicid)) {WARN (1 ,"Not a valid mask!" );
@@ -578,7 +566,7 @@ static unsigned int es7000_cpu_mask_to_apicid_and(const struct cpumask *inmask, const struct cpumask *andmask) { - int apicid = es7000_cpu_to_logical_apicid(0); + int apicid = early_per_cpu(x86_cpu_to_logical_apicid, 0);cpumask_var_t cpumask;if (!alloc_cpumask_var (&cpumask,GFP_ATOMIC ))
@@ -656,7 +644,6 @@ struct apic __refdata apic_es7000_cluster = { .setup_apic_routing = es7000_setup_apic_routing, .multi_timer_check = NULL, .apicid_to_node = es7000_apicid_to_node, - .cpu_to_logical_apicid = es7000_cpu_to_logical_apicid, .cpu_present_to_apicid = es7000_cpu_present_to_apicid, .apicid_to_cpu_present = es7000_apicid_to_cpu_present, .setup_portio_remap = NULL,
@@ -721,7 +708,6 @@ struct apic __refdata apic_es7000 = { .setup_apic_routing = es7000_setup_apic_routing, .multi_timer_check = NULL, .apicid_to_node = es7000_apicid_to_node, - .cpu_to_logical_apicid = es7000_cpu_to_logical_apicid, .cpu_present_to_apicid = es7000_cpu_present_to_apicid, .apicid_to_cpu_present = es7000_apicid_to_cpu_present, .setup_portio_remap = NULL,
arch/x86/kernel/apic/numaq_32.c +0 -8
@@ -373,13 +373,6 @@ static inline void numaq_ioapic_phys_id_map(physid_mask_t *phys_map, physid_maskreturn physids_promote (0xFUL , retmap); } -static inline int numaq_cpu_to_logical_apicid (int cpu) -{ -if (cpu >= nr_cpu_ids) -return BAD_APICID ; -return early_per_cpu (x86_cpu_to_logical_apicid, cpu); -} -/* * Supporting over 60 cpus on NUMA-Q requires a locality-dependent * cpu to APIC ID relation to properly interact with the intelligent
@@ -509,7 +502,6 @@ struct apic __refdata apic_numaq = { .setup_apic_routing = numaq_setup_apic_routing, .multi_timer_check = numaq_multi_timer_check, .apicid_to_node = numaq_apicid_to_node, - .cpu_to_logical_apicid = numaq_cpu_to_logical_apicid, .cpu_present_to_apicid = numaq_cpu_present_to_apicid, .apicid_to_cpu_present = numaq_apicid_to_cpu_present, .setup_portio_remap = numaq_setup_portio_remap,
arch/x86/kernel/apic/probe_32.c +0 -1
@@ -131,7 +131,6 @@ struct apic apic_default = { .setup_apic_routing = setup_apic_flat_routing, .multi_timer_check = NULL, .apicid_to_node = default_apicid_to_node, - .cpu_to_logical_apicid = default_cpu_to_logical_apicid, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = physid_set_mask_of_physid, .setup_portio_remap = NULL,
arch/x86/kernel/apic/summit_32.c +2 -15
@@ -241,18 +241,6 @@ static int summit_apicid_to_node(int logical_apicid)#endif } -/* Mapping from cpu number to logical apicid */ -static inline int summit_cpu_to_logical_apicid (int cpu) -{ -#ifdef CONFIG_SMP -if (cpu >= nr_cpu_ids) -return BAD_APICID ; -return early_per_cpu (x86_cpu_to_logical_apicid, cpu); -#else -return logical_smp_processor_id (); -#endif -} -static int summit_cpu_present_to_apicid (int mps_cpu) {if (mps_cpu < nr_cpu_ids)
@@ -286,7 +274,7 @@ static unsigned int summit_cpu_mask_to_apicid(const struct cpumask *cpumask)* The cpus in the mask must all be on the apic cluster. */ for_each_cpu (cpu, cpumask) { -int new_apicid =summit_cpu_to_logical_apicid (cpu); +int new_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu);if (round &&APIC_CLUSTER (apicid) !=APIC_CLUSTER (new_apicid)) {printk ("%s: Not a valid mask!\n" , __func__);
@@ -301,7 +289,7 @@ static unsigned int summit_cpu_mask_to_apicid(const struct cpumask *cpumask)static unsigned int summit_cpu_mask_to_apicid_and (const struct cpumask *inmask,const struct cpumask *andmask) { -int apicid =summit_cpu_to_logical_apicid (0 ); +int apicid =early_per_cpu (x86_cpu_to_logical_apicid,0 );cpumask_var_t cpumask;if (!alloc_cpumask_var (&cpumask,GFP_ATOMIC ))
@@ -529,7 +517,6 @@ struct apic apic_summit = { .setup_apic_routing = summit_setup_apic_routing, .multi_timer_check = NULL, .apicid_to_node = summit_apicid_to_node, - .cpu_to_logical_apicid = summit_cpu_to_logical_apicid, .cpu_present_to_apicid = summit_cpu_present_to_apicid, .apicid_to_cpu_present = summit_apicid_to_cpu_present, .setup_portio_remap = NULL,
arch/x86/kernel/apic/x2apic_cluster.c +0 -1
@@ -207,7 +207,6 @@ struct apic apic_x2apic_cluster = { .setup_apic_routing = NULL, .multi_timer_check = NULL, .apicid_to_node = NULL, - .cpu_to_logical_apicid = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/apic/x2apic_phys.c +0 -1
@@ -196,7 +196,6 @@ struct apic apic_x2apic_phys = { .setup_apic_routing = NULL, .multi_timer_check = NULL, .apicid_to_node = NULL, - .cpu_to_logical_apicid = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/apic/x2apic_uv_x.c +0 -1
@@ -339,7 +339,6 @@ struct apic __refdata apic_x2apic_uv_x = { .setup_apic_routing = NULL, .multi_timer_check = NULL, .apicid_to_node = NULL, - .cpu_to_logical_apicid = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
PATCH 7/16 x86: Add apic->x86_32_early_logical_apicid()
In reply to Tejun HeoOn x86_32, the mapping between cpu and logical apic ID differs depending on the specific apic implementation in use. The mapping is initialized while bringing up CPUs; however, this makes early inits ignore memory topology.
Add a x86_32 specific apic->x86_32_early_logical_apicid() which is called early during boot to query the mapping. The mapping is later verified against the result of init_apic_ldr(). The method is allowed to return BAD_APICID if it can't be determined early.
noop variant which always returns BAD_APICID is implemented and added to all x86_32 apic implementations.
--- arch/x86/include/asm/apic.h | 19 +++++++++++++++++++ arch/x86/kernel/apic/apic.c | 12 ++++++++++-- arch/x86/kernel/apic/apic_noop.c | 4 ++++ arch/x86/kernel/apic/bigsmp_32.c | 2 ++ arch/x86/kernel/apic/es7000_32.c | 4 ++++ arch/x86/kernel/apic/numaq_32.c | 2 ++ arch/x86/kernel/apic/probe_32.c | 2 ++ arch/x86/kernel/apic/summit_32.c | 2 ++ 8 files changed, 45 insertions(+), 2 deletions(-)
arch/x86/include/asm/apic.h +19 -0
@@ -354,6 +354,20 @@ struct apic {void (*icr_write)(u32 low,u32 high);void (*wait_icr_idle)(void );u32 (*safe_wait_icr_idle)(void); + +#ifdef CONFIG_X86_32 +/* +* Called very early during boot from get_smp_config(). It should +* return the logical apicid. x86_[bios]_cpu_to_apicid is +* initialized before this function is called. +* +* If logical apicid can't be determined that early, the function +* may return BAD_APICID. Logical apicid will be configured after +* init_apic_ldr() while bringing up CPUs. Note that NUMA affinity +* won't be applied properly during early boot in this case. +*/ +int (*x86_32_early_logical_apicid)(int cpu); +#endif };/*
@@ -501,6 +515,11 @@ extern struct apic apic_noop;extern struct apic apic_default; +static inline int noop_x86_32_early_logical_apicid (int cpu) +{ +return BAD_APICID ; +} +/* * Set up the logical destination ID. *
arch/x86/kernel/apic/apic.c +10 -2
@@ -1250,8 +1250,13 @@ void __cpuinit setup_local_APIC(void)#ifdef CONFIG_X86_32 /* -* APIC LDR is initialized. Fetch and store logical_apic_id. +* APIC LDR is initialized. If logical_apicid mapping was +* initialized during get_smp_config(), make sure it matches the +* actual value. */ + i =early_per_cpu (x86_cpu_to_logical_apicid, cpu); +WARN_ON (i !=BAD_APICID && i !=logical_smp_processor_id ()); +/* always use the value from LDR */ early_per_cpu (x86_cpu_to_logical_apicid, cpu) =logical_smp_processor_id ();#endif
@@ -1991,7 +1996,10 @@ void __cpuinit generic_processor_info(int apicid, int version)early_per_cpu (x86_cpu_to_apicid, cpu) = apicid;early_per_cpu (x86_bios_cpu_apicid, cpu) = apicid;#endif - +#ifdef CONFIG_X86_32 +early_per_cpu (x86_cpu_to_logical_apicid, cpu) = + apic->x86_32_early_logical_apicid (cpu); +#endif set_cpu_possible (cpu, true);set_cpu_present (cpu, true); }
arch/x86/kernel/apic/apic_noop.c +4 -0
@@ -191,4 +191,8 @@ struct apic apic_noop = { .icr_write = noop_apic_icr_write, .wait_icr_idle = noop_apic_wait_icr_idle, .safe_wait_icr_idle = noop_safe_apic_wait_icr_idle, + +#ifdef CONFIG_X86_32 + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, +#endif };
arch/x86/kernel/apic/bigsmp_32.c +2 -0
@@ -251,4 +251,6 @@ struct apic apic_bigsmp = { .icr_write = native_apic_icr_write, .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, + + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, };
arch/x86/kernel/apic/es7000_32.c +4 -0
@@ -682,6 +682,8 @@ struct apic __refdata apic_es7000_cluster = { .icr_write = native_apic_icr_write, .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, + + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, };struct apic __refdata apic_es7000 = {
@@ -744,4 +746,6 @@ struct apic __refdata apic_es7000 = { .icr_write = native_apic_icr_write, .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, + + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, };
arch/x86/kernel/apic/numaq_32.c +2 -0
@@ -539,4 +539,6 @@ struct apic __refdata apic_numaq = { .icr_write = native_apic_icr_write, .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, + + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, };
arch/x86/kernel/apic/probe_32.c +2 -0
@@ -166,6 +166,8 @@ struct apic apic_default = { .icr_write = native_apic_icr_write, .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, + + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, };extern struct apic apic_numaq;
arch/x86/kernel/apic/summit_32.c +2 -0
@@ -552,4 +552,6 @@ struct apic apic_summit = { .icr_write = native_apic_icr_write, .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, + + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, };
Signature · 1 line
1.7.1
[tip:x86/numa] x86: Add apic->x86_32_early_logical_apicid()
Commit-ID: acb8bc09c6185e4d3d582d0076aaa6a89f19d8c5 Gitweb: http://git.kernel.org/tip/acb8bc09c6185e4d3d582d0076aaa6a89f19d8c5 Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:33 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:06 +0100
x86: Add apic->x86_32_early_logical_apicid()
On x86_32, the mapping between cpu and logical apic ID differs depending on the specific apic implementation in use. The mapping is initialized while bringing up CPUs; however, this makes early inits ignore memory topology.
Add a x86_32 specific apic->x86_32_early_logical_apicid() which is called early during boot to query the mapping. The mapping is later verified against the result of init_apic_ldr(). The method is allowed to return BAD_APICID if it can't be determined early.
noop variant which always returns BAD_APICID is implemented and added to all x86_32 apic implementations.
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/apic.h | 19 +++++++++++++++++++ arch/x86/kernel/apic/apic.c | 12 ++++++++++-- arch/x86/kernel/apic/apic_noop.c | 4 ++++ arch/x86/kernel/apic/bigsmp_32.c | 2 ++ arch/x86/kernel/apic/es7000_32.c | 4 ++++ arch/x86/kernel/apic/numaq_32.c | 2 ++ arch/x86/kernel/apic/probe_32.c | 2 ++ arch/x86/kernel/apic/summit_32.c | 2 ++ 8 files changed, 45 insertions(+), 2 deletions(-)
arch/x86/include/asm/apic.h +19 -0
@@ -354,6 +354,20 @@ struct apic {void (*icr_write)(u32 low,u32 high);void (*wait_icr_idle)(void );u32 (*safe_wait_icr_idle)(void); + +#ifdef CONFIG_X86_32 +/* +* Called very early during boot from get_smp_config(). It should +* return the logical apicid. x86_[bios]_cpu_to_apicid is +* initialized before this function is called. +* +* If logical apicid can't be determined that early, the function +* may return BAD_APICID. Logical apicid will be configured after +* init_apic_ldr() while bringing up CPUs. Note that NUMA affinity +* won't be applied properly during early boot in this case. +*/ +int (*x86_32_early_logical_apicid)(int cpu); +#endif };/*
@@ -501,6 +515,11 @@ extern struct apic apic_noop;extern struct apic apic_default; +static inline int noop_x86_32_early_logical_apicid (int cpu) +{ +return BAD_APICID ; +} +/* * Set up the logical destination ID. *
arch/x86/kernel/apic/apic.c +10 -2
@@ -1250,8 +1250,13 @@ void __cpuinit setup_local_APIC(void)#ifdef CONFIG_X86_32 /* -* APIC LDR is initialized. Fetch and store logical_apic_id. +* APIC LDR is initialized. If logical_apicid mapping was +* initialized during get_smp_config(), make sure it matches the +* actual value. */ + i =early_per_cpu (x86_cpu_to_logical_apicid, cpu); +WARN_ON (i !=BAD_APICID && i !=logical_smp_processor_id ()); +/* always use the value from LDR */ early_per_cpu (x86_cpu_to_logical_apicid, cpu) =logical_smp_processor_id ();#endif
@@ -1991,7 +1996,10 @@ void __cpuinit generic_processor_info(int apicid, int version)early_per_cpu (x86_cpu_to_apicid, cpu) = apicid;early_per_cpu (x86_bios_cpu_apicid, cpu) = apicid;#endif - +#ifdef CONFIG_X86_32 +early_per_cpu (x86_cpu_to_logical_apicid, cpu) = + apic->x86_32_early_logical_apicid (cpu); +#endif set_cpu_possible (cpu, true);set_cpu_present (cpu, true); }
arch/x86/kernel/apic/apic_noop.c +4 -0
@@ -191,4 +191,8 @@ struct apic apic_noop = { .icr_write = noop_apic_icr_write, .wait_icr_idle = noop_apic_wait_icr_idle, .safe_wait_icr_idle = noop_safe_apic_wait_icr_idle, + +#ifdef CONFIG_X86_32 + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, +#endif };
arch/x86/kernel/apic/bigsmp_32.c +2 -0
@@ -251,4 +251,6 @@ struct apic apic_bigsmp = { .icr_write = native_apic_icr_write, .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, + + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, };
arch/x86/kernel/apic/es7000_32.c +4 -0
@@ -682,6 +682,8 @@ struct apic __refdata apic_es7000_cluster = { .icr_write = native_apic_icr_write, .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, + + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, };struct apic __refdata apic_es7000 = {
@@ -744,4 +746,6 @@ struct apic __refdata apic_es7000 = { .icr_write = native_apic_icr_write, .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, + + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, };
arch/x86/kernel/apic/numaq_32.c +2 -0
@@ -539,4 +539,6 @@ struct apic __refdata apic_numaq = { .icr_write = native_apic_icr_write, .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, + + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, };
arch/x86/kernel/apic/probe_32.c +2 -0
@@ -166,6 +166,8 @@ struct apic apic_default = { .icr_write = native_apic_icr_write, .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, + + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, };extern struct apic apic_numaq;
arch/x86/kernel/apic/summit_32.c +2 -0
@@ -552,4 +552,6 @@ struct apic apic_summit = { .icr_write = native_apic_icr_write, .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, + + .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, };
PATCH 8/16 x86: Implement the default x86_32_early_logical_apicid()
In reply to Tejun HeoImplement x86_32_early_logical_apicid() for the default apic flat routing.
--- arch/x86/kernel/apic/probe_32.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-)
arch/x86/kernel/apic/probe_32.c +6 -1
@@ -77,6 +77,11 @@ void __init default_setup_apic_routing(void) apic->setup_apic_routing (); } +static int default_x86_32_early_logical_apicid (int cpu) +{ +return 1 << cpu; +} +static void setup_apic_flat_routing (void ) {#ifdef CONFIG_X86_IO_APIC
@@ -167,7 +172,7 @@ struct apic apic_default = { .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, - .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_early_logical_apicid = default_x86_32_early_logical_apicid, };extern struct apic apic_numaq;
Signature · 1 line
1.7.1
[tip:x86/numa] x86: Implement the default x86_32_early_logical_apicid()
Commit-ID: 3f6f6798889d50ec7ca8eef1d100cda37dc658ea Gitweb: http://git.kernel.org/tip/3f6f6798889d50ec7ca8eef1d100cda37dc658ea Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:34 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:07 +0100
x86: Implement the default x86_32_early_logical_apicid()
Implement x86_32_early_logical_apicid() for the default apic flat routing.
LKML-Reference: <[email protected]>
--- arch/x86/kernel/apic/probe_32.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-)
arch/x86/kernel/apic/probe_32.c +6 -1
@@ -77,6 +77,11 @@ void __init default_setup_apic_routing(void) apic->setup_apic_routing (); } +static int default_x86_32_early_logical_apicid (int cpu) +{ +return 1 << cpu; +} +static void setup_apic_flat_routing (void ) {#ifdef CONFIG_X86_IO_APIC
@@ -167,7 +172,7 @@ struct apic apic_default = { .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, - .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_early_logical_apicid = default_x86_32_early_logical_apicid, };extern struct apic apic_numaq;
PATCH 9/16 x86: Implement x86_32_early_logical_apicid() for bigsmp_32
In reply to Tejun Heo--- arch/x86/kernel/apic/bigsmp_32.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-)
arch/x86/kernel/apic/bigsmp_32.c +7 -1
@@ -45,6 +45,12 @@ static unsigned long bigsmp_check_apicid_present(int bit)return 1 ; } +static int bigsmp_early_logical_apicid (int cpu) +{ +/* on bigsmp, logical apicid is the same as physical */ +return early_per_cpu (x86_cpu_to_apicid, cpu); +} +static inline unsigned long calculate_ldr (int cpu) {unsigned long val, id;
@@ -252,5 +258,5 @@ struct apic apic_bigsmp = { .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, - .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_early_logical_apicid = bigsmp_early_logical_apicid, };
Signature · 1 line
1.7.1
[tip:x86/numa] x86: Implement x86_32_early_logical_apicid() for bigsmp_32
Commit-ID: 12bf24a47c1a095233cc8a8b863b509a0d8e0f2c Gitweb: http://git.kernel.org/tip/12bf24a47c1a095233cc8a8b863b509a0d8e0f2c Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:35 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:07 +0100
x86: Implement x86_32_early_logical_apicid() for bigsmp_32
LKML-Reference: <[email protected]>
--- arch/x86/kernel/apic/bigsmp_32.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-)
arch/x86/kernel/apic/bigsmp_32.c +7 -1
@@ -45,6 +45,12 @@ static unsigned long bigsmp_check_apicid_present(int bit)return 1 ; } +static int bigsmp_early_logical_apicid (int cpu) +{ +/* on bigsmp, logical apicid is the same as physical */ +return early_per_cpu (x86_cpu_to_apicid, cpu); +} +static inline unsigned long calculate_ldr (int cpu) {unsigned long val, id;
@@ -252,5 +258,5 @@ struct apic apic_bigsmp = { .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, - .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_early_logical_apicid = bigsmp_early_logical_apicid, };
PATCH 10/16 x86: Implement x86_32_early_logical_apicid() for summit_32
In reply to Tejun HeoFactor out logical apic id calculation from summit_init_apic_ldr() and use it for the x86_32_early_logical_apicid() callback.
--- arch/x86/kernel/apic/summit_32.c | 17 ++++++++++++----- 1 files changed, 12 insertions(+), 5 deletions(-)
arch/x86/kernel/apic/summit_32.c +12 -5
@@ -194,11 +194,10 @@ static unsigned long summit_check_apicid_present(int bit)return 1 ; } -static void summit_init_apic_ldr (void ) +static int summit_early_logical_apicid (int cpu) { -unsigned long val, id;int count =0 ; -u8 my_id = (u8 )hard_smp_processor_id (); +u8 my_id =early_per_cpu (x86_cpu_to_apicid, cpu);u8 my_cluster =APIC_CLUSTER (my_id);#ifdef CONFIG_SMP u8 lid;
@@ -214,7 +213,15 @@ static void summit_init_apic_ldr(void)/* We only have a 4 wide bitmap in cluster mode. If a deranged * BIOS puts 5 CPUs in one APIC cluster, we're hosed. */ BUG_ON (count >=XAPIC_DEST_CPUS_SHIFT ); - id = my_cluster | (1UL << count); +return my_cluster | (1UL << count); +} + +static void summit_init_apic_ldr (void ) +{ +int cpu =smp_processor_id (); +unsigned long id =early_per_cpu (x86_cpu_to_logical_apicid, cpu); +unsigned long val; +apic_write (APIC_DFR ,SUMMIT_APIC_DFR_VALUE ); val =apic_read (APIC_LDR ) & ~APIC_LDR_MASK ; val |=SET_APIC_LOGICAL_ID (id);
@@ -553,5 +560,5 @@ struct apic apic_summit = { .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, - .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_early_logical_apicid = summit_early_logical_apicid, };
Signature · 1 line
1.7.1
[tip:x86/numa] x86: Implement x86_32_early_logical_apicid() for summit_32
Commit-ID: 3b39d937843e071c59b3aeecbf7de4750f095b12 Gitweb: http://git.kernel.org/tip/3b39d937843e071c59b3aeecbf7de4750f095b12 Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:36 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:07 +0100
x86: Implement x86_32_early_logical_apicid() for summit_32
Factor out logical apic id calculation from summit_init_apic_ldr() and use it for the x86_32_early_logical_apicid() callback.
LKML-Reference: <[email protected]>
--- arch/x86/kernel/apic/summit_32.c | 17 ++++++++++++----- 1 files changed, 12 insertions(+), 5 deletions(-)
arch/x86/kernel/apic/summit_32.c +12 -5
@@ -194,11 +194,10 @@ static unsigned long summit_check_apicid_present(int bit)return 1 ; } -static void summit_init_apic_ldr (void ) +static int summit_early_logical_apicid (int cpu) { -unsigned long val, id;int count =0 ; -u8 my_id = (u8 )hard_smp_processor_id (); +u8 my_id =early_per_cpu (x86_cpu_to_apicid, cpu);u8 my_cluster =APIC_CLUSTER (my_id);#ifdef CONFIG_SMP u8 lid;
@@ -214,7 +213,15 @@ static void summit_init_apic_ldr(void)/* We only have a 4 wide bitmap in cluster mode. If a deranged * BIOS puts 5 CPUs in one APIC cluster, we're hosed. */ BUG_ON (count >=XAPIC_DEST_CPUS_SHIFT ); - id = my_cluster | (1UL << count); +return my_cluster | (1UL << count); +} + +static void summit_init_apic_ldr (void ) +{ +int cpu =smp_processor_id (); +unsigned long id =early_per_cpu (x86_cpu_to_logical_apicid, cpu); +unsigned long val; +apic_write (APIC_DFR ,SUMMIT_APIC_DFR_VALUE ); val =apic_read (APIC_LDR ) & ~APIC_LDR_MASK ; val |=SET_APIC_LOGICAL_ID (id);
@@ -553,5 +560,5 @@ struct apic apic_summit = { .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, - .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_early_logical_apicid = summit_early_logical_apicid, };
PATCH 11/16 x86: Implement x86_32_early_logical_apicid() for numaq_32
In reply to Tejun Heo--- arch/x86/kernel/apic/es7000_32.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-)
arch/x86/kernel/apic/es7000_32.c +8 -2
@@ -460,6 +460,12 @@ static unsigned long es7000_check_apicid_present(int bit)return physid_isset (bit, phys_cpu_present_map); } +static int es7000_early_logical_apicid (int cpu) +{ +/* on es7000, logical apicid is the same as physical */ +return early_per_cpu (x86_bios_cpu_apicid, cpu); +} +static unsigned long calculate_ldr (int cpu) {unsigned long id =per_cpu (x86_bios_cpu_apicid, cpu);
@@ -683,7 +689,7 @@ struct apic __refdata apic_es7000_cluster = { .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, - .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_early_logical_apicid = es7000_early_logical_apicid, };struct apic __refdata apic_es7000 = {
@@ -747,5 +753,5 @@ struct apic __refdata apic_es7000 = { .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, - .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_early_logical_apicid = es7000_early_logical_apicid, };
Signature · 1 line
1.7.1
[tip:x86/numa] x86: Implement x86_32_early_logical_apicid() for numaq_32
Commit-ID: df04cf011b0657ddc782b48d455f7e232b9be41c Gitweb: http://git.kernel.org/tip/df04cf011b0657ddc782b48d455f7e232b9be41c Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:37 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:08 +0100
x86: Implement x86_32_early_logical_apicid() for numaq_32
LKML-Reference: <[email protected]>
--- arch/x86/kernel/apic/es7000_32.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-)
arch/x86/kernel/apic/es7000_32.c +8 -2
@@ -460,6 +460,12 @@ static unsigned long es7000_check_apicid_present(int bit)return physid_isset (bit, phys_cpu_present_map); } +static int es7000_early_logical_apicid (int cpu) +{ +/* on es7000, logical apicid is the same as physical */ +return early_per_cpu (x86_bios_cpu_apicid, cpu); +} +static unsigned long calculate_ldr (int cpu) {unsigned long id =per_cpu (x86_bios_cpu_apicid, cpu);
@@ -683,7 +689,7 @@ struct apic __refdata apic_es7000_cluster = { .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, - .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_early_logical_apicid = es7000_early_logical_apicid, };struct apic __refdata apic_es7000 = {
@@ -747,5 +753,5 @@ struct apic __refdata apic_es7000 = { .wait_icr_idle = native_apic_wait_icr_idle, .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, - .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_early_logical_apicid = es7000_early_logical_apicid, };
PATCH 12/16 x86: Replace apic->apicid_to_node() with ->x86_32_numa_cpu_node()
In reply to Tejun Heoapic->apicid_to_node() is 32bit specific apic operation which determines NUMA node for a CPU. Depending on the APIC implementation, it can be easier to determine NUMA node from either physical or logical apicid. Currently, ->apicid_to_node() takes @logical_apicid and calls hard_smp_processor_id() if the physical apicid is needed.
This prevents NUMA mapping from being queried from a different CPU, which in turn makes it impossible to initialize NUMA mapping before SMP bringup.
This patch replaces apic->apicid_to_node() with ->x86_32_numa_cpu_node() which takes @cpu, from which both logical and physical apicids can easily be determined. While at it, drop duplicate implementations from bigsmp_32 and summit_32, and use the default one.
--- arch/x86/include/asm/apic.h | 6 ++++-- arch/x86/kernel/apic/apic.c | 10 +++++++--- arch/x86/kernel/apic/apic_flat_64.c | 2 -- arch/x86/kernel/apic/apic_noop.c | 16 +++++++++------- arch/x86/kernel/apic/bigsmp_32.c | 7 +------ arch/x86/kernel/apic/es7000_32.c | 7 +++---- arch/x86/kernel/apic/numaq_32.c | 11 ++++++++++- arch/x86/kernel/apic/probe_32.c | 2 +- arch/x86/kernel/apic/summit_32.c | 11 +---------- arch/x86/kernel/apic/x2apic_cluster.c | 1 - arch/x86/kernel/apic/x2apic_phys.c | 1 - arch/x86/kernel/apic/x2apic_uv_x.c | 1 - arch/x86/kernel/smpboot.c | 3 +-- 13 files changed, 37 insertions(+), 41 deletions(-)
arch/x86/include/asm/apic.h +4 -2
@@ -306,7 +306,6 @@ struct apic {void (*setup_apic_routing)(void );int (*multi_timer_check)(int apic,int irq); -int (*apicid_to_node)(int logical_apicid);int (*cpu_present_to_apicid)(int mps_cpu);void (*apicid_to_cpu_present)(int phys_apicid,physid_mask_t *retmap);void (*setup_portio_remap)(void );
@@ -367,6 +366,9 @@ struct apic {* won't be applied properly during early boot in this case. */ int (*x86_32_early_logical_apicid)(int cpu); + +/* determine CPU -> NUMA node mapping */ +int (*x86_32_numa_cpu_node)(int cpu);#endif };
@@ -539,7 +541,7 @@ static inline int default_phys_pkg_id(int cpuid_apic, int index_msb) return cpuid_apic >> index_msb; } -extern int default_apicid_to_node (int logical_apicid); +extern int default_x86_32_numa_cpu_node (int cpu);#endif
arch/x86/kernel/apic/apic.c +7 -3
@@ -2020,10 +2020,14 @@ void default_init_apic_ldr(void) }#ifdef CONFIG_X86_32 -int default_apicid_to_node (int logical_apicid) +int default_x86_32_numa_cpu_node (int cpu) { -#ifdef CONFIG_SMP -return apicid_2_node[hard_smp_processor_id ()]; +#ifdef CONFIG_NUMA +int apicid =early_per_cpu (x86_cpu_to_apicid, cpu); + +if (apicid !=BAD_APICID ) +return apicid_2_node[apicid]; +return NUMA_NO_NODE ;#else return 0 ;#endif
arch/x86/kernel/apic/apic_flat_64.c +0 -2
@@ -185,7 +185,6 @@ struct apic apic_flat = { .ioapic_phys_id_map = NULL, .setup_apic_routing = NULL, .multi_timer_check = NULL, - .apicid_to_node = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
@@ -336,7 +335,6 @@ struct apic apic_physflat = { .ioapic_phys_id_map = NULL, .setup_apic_routing = NULL, .multi_timer_check = NULL, - .apicid_to_node = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/apic/apic_noop.c +9 -7
@@ -108,12 +108,6 @@ static void noop_vector_allocation_domain(int cpu, struct cpumask *retmask)cpumask_set_cpu (cpu, retmask); } -int noop_apicid_to_node (int logical_apicid) -{ -/* we're always on node 0 */ -return 0 ; -} -static u32 noop_apic_read (u32 reg) {WARN_ON_ONCE ((cpu_has_apic && !disable_apic));
@@ -125,6 +119,14 @@ static void noop_apic_write(u32 reg, u32 v)WARN_ON_ONCE (cpu_has_apic && !disable_apic); } +#ifdef CONFIG_X86_32 +static int noop_x86_32_numa_cpu_node (int cpu) +{ +/* we're always on node 0 */ +return 0 ; +} +#endif +struct apic apic_noop = { .name ="noop" , .probe = noop_probe,
@@ -148,7 +150,6 @@ struct apic apic_noop = { .ioapic_phys_id_map = default_ioapic_phys_id_map, .setup_apic_routing = NULL, .multi_timer_check = NULL, - .apicid_to_node = noop_apicid_to_node, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = physid_set_mask_of_physid,
@@ -194,5 +195,6 @@ struct apic apic_noop = {#ifdef CONFIG_X86_32 .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_numa_cpu_node = noop_x86_32_numa_cpu_node,#endif };
arch/x86/kernel/apic/bigsmp_32.c +1 -6
@@ -86,11 +86,6 @@ static void bigsmp_setup_apic_routing(void) nr_ioapics); } -static int bigsmp_apicid_to_node (int logical_apicid) -{ -return apicid_2_node[hard_smp_processor_id ()]; -} -static int bigsmp_cpu_present_to_apicid (int mps_cpu) {if (mps_cpu < nr_cpu_ids)
@@ -221,7 +216,6 @@ struct apic apic_bigsmp = { .ioapic_phys_id_map = bigsmp_ioapic_phys_id_map, .setup_apic_routing = bigsmp_setup_apic_routing, .multi_timer_check = NULL, - .apicid_to_node = bigsmp_apicid_to_node, .cpu_present_to_apicid = bigsmp_cpu_present_to_apicid, .apicid_to_cpu_present = physid_set_mask_of_physid, .setup_portio_remap = NULL,
@@ -259,4 +253,5 @@ struct apic apic_bigsmp = { .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, .x86_32_early_logical_apicid = bigsmp_early_logical_apicid, + .x86_32_numa_cpu_node = default_x86_32_numa_cpu_node, };
arch/x86/kernel/apic/es7000_32.c +3 -4
@@ -510,12 +510,11 @@ static void es7000_setup_apic_routing(void) nr_ioapics, cpumask_bits(es7000_target_cpus())[0]); } -static int es7000_apicid_to_node (int logical_apicid) +static int es7000_numa_cpu_node (int cpu) {return 0 ; } -static int es7000_cpu_present_to_apicid (int mps_cpu) {if (!mps_cpu)
@@ -649,7 +648,6 @@ struct apic __refdata apic_es7000_cluster = { .ioapic_phys_id_map = es7000_ioapic_phys_id_map, .setup_apic_routing = es7000_setup_apic_routing, .multi_timer_check = NULL, - .apicid_to_node = es7000_apicid_to_node, .cpu_present_to_apicid = es7000_cpu_present_to_apicid, .apicid_to_cpu_present = es7000_apicid_to_cpu_present, .setup_portio_remap = NULL,
@@ -690,6 +688,7 @@ struct apic __refdata apic_es7000_cluster = { .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, .x86_32_early_logical_apicid = es7000_early_logical_apicid, + .x86_32_numa_cpu_node = es7000_numa_cpu_node, };struct apic __refdata apic_es7000 = {
@@ -715,7 +714,6 @@ struct apic __refdata apic_es7000 = { .ioapic_phys_id_map = es7000_ioapic_phys_id_map, .setup_apic_routing = es7000_setup_apic_routing, .multi_timer_check = NULL, - .apicid_to_node = es7000_apicid_to_node, .cpu_present_to_apicid = es7000_cpu_present_to_apicid, .apicid_to_cpu_present = es7000_apicid_to_cpu_present, .setup_portio_remap = NULL,
@@ -754,4 +752,5 @@ struct apic __refdata apic_es7000 = { .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, .x86_32_early_logical_apicid = es7000_early_logical_apicid, + .x86_32_numa_cpu_node = es7000_numa_cpu_node, };
arch/x86/kernel/apic/numaq_32.c +10 -1
@@ -391,6 +391,15 @@ static inline int numaq_apicid_to_node(int logical_apicid)return logical_apicid >>4 ; } +static int numaq_numa_cpu_node (int cpu) +{ +int logical_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu); + +if (logical_apicid !=BAD_APICID ) +return numaq_apicid_to_node (logical_apicid); +return NUMA_NO_NODE ; +} +static void numaq_apicid_to_cpu_present (int logical_apicid,physid_mask_t *retmap) {int node =numaq_apicid_to_node (logical_apicid);
@@ -501,7 +510,6 @@ struct apic __refdata apic_numaq = { .ioapic_phys_id_map = numaq_ioapic_phys_id_map, .setup_apic_routing = numaq_setup_apic_routing, .multi_timer_check = numaq_multi_timer_check, - .apicid_to_node = numaq_apicid_to_node, .cpu_present_to_apicid = numaq_cpu_present_to_apicid, .apicid_to_cpu_present = numaq_apicid_to_cpu_present, .setup_portio_remap = numaq_setup_portio_remap,
@@ -541,4 +549,5 @@ struct apic __refdata apic_numaq = { .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_numa_cpu_node = numaq_numa_cpu_node, };
arch/x86/kernel/apic/probe_32.c +1 -1
@@ -135,7 +135,6 @@ struct apic apic_default = { .ioapic_phys_id_map = default_ioapic_phys_id_map, .setup_apic_routing = setup_apic_flat_routing, .multi_timer_check = NULL, - .apicid_to_node = default_apicid_to_node, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = physid_set_mask_of_physid, .setup_portio_remap = NULL,
@@ -173,6 +172,7 @@ struct apic apic_default = { .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, .x86_32_early_logical_apicid = default_x86_32_early_logical_apicid, + .x86_32_numa_cpu_node = default_x86_32_numa_cpu_node, };extern struct apic apic_numaq;
arch/x86/kernel/apic/summit_32.c +1 -10
@@ -239,15 +239,6 @@ static void summit_setup_apic_routing(void) nr_ioapics); } -static int summit_apicid_to_node (int logical_apicid) -{ -#ifdef CONFIG_SMP -return apicid_2_node[hard_smp_processor_id ()]; -#else -return 0 ; -#endif -} -static int summit_cpu_present_to_apicid (int mps_cpu) {if (mps_cpu < nr_cpu_ids)
@@ -523,7 +514,6 @@ struct apic apic_summit = { .ioapic_phys_id_map = summit_ioapic_phys_id_map, .setup_apic_routing = summit_setup_apic_routing, .multi_timer_check = NULL, - .apicid_to_node = summit_apicid_to_node, .cpu_present_to_apicid = summit_cpu_present_to_apicid, .apicid_to_cpu_present = summit_apicid_to_cpu_present, .setup_portio_remap = NULL,
@@ -561,4 +551,5 @@ struct apic apic_summit = { .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, .x86_32_early_logical_apicid = summit_early_logical_apicid, + .x86_32_numa_cpu_node = default_x86_32_numa_cpu_node, };
arch/x86/kernel/apic/x2apic_cluster.c +0 -1
@@ -206,7 +206,6 @@ struct apic apic_x2apic_cluster = { .ioapic_phys_id_map = NULL, .setup_apic_routing = NULL, .multi_timer_check = NULL, - .apicid_to_node = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/apic/x2apic_phys.c +0 -1
@@ -195,7 +195,6 @@ struct apic apic_x2apic_phys = { .ioapic_phys_id_map = NULL, .setup_apic_routing = NULL, .multi_timer_check = NULL, - .apicid_to_node = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/apic/x2apic_uv_x.c +0 -1
@@ -338,7 +338,6 @@ struct apic __refdata apic_x2apic_uv_x = { .ioapic_phys_id_map = NULL, .setup_apic_routing = NULL, .multi_timer_check = NULL, - .apicid_to_node = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/smpboot.c +1 -2
@@ -168,10 +168,9 @@ static void unmap_cpu_to_node(int cpu)static void map_cpu_to_logical_apicid (void ) {int cpu =smp_processor_id (); -int logical_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu);int node; - node = apic->apicid_to_node (logical_apicid); + node = apic->x86_32_numa_cpu_node (cpu);if (!node_online (node)) node = first_online_node;
Signature · 1 line
1.7.1
[tip:x86/numa] x86: Replace apic->apicid_to_node() with ->x86_32_numa_cpu_node()
Commit-ID: 89e5dc218e084e13a3996db6693b01478912f4ee Gitweb: http://git.kernel.org/tip/89e5dc218e084e13a3996db6693b01478912f4ee Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:38 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:08 +0100
x86: Replace apic->apicid_to_node() with ->x86_32_numa_cpu_node()
apic->apicid_to_node() is 32bit specific apic operation which determines NUMA node for a CPU. Depending on the APIC implementation, it can be easier to determine NUMA node from either physical or logical apicid. Currently, ->apicid_to_node() takes @logical_apicid and calls hard_smp_processor_id() if the physical apicid is needed.
This prevents NUMA mapping from being queried from a different CPU, which in turn makes it impossible to initialize NUMA mapping before SMP bringup.
This patch replaces apic->apicid_to_node() with ->x86_32_numa_cpu_node() which takes @cpu, from which both logical and physical apicids can easily be determined. While at it, drop duplicate implementations from bigsmp_32 and summit_32, and use the default one.
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/apic.h | 6 ++++-- arch/x86/kernel/apic/apic.c | 10 +++++++--- arch/x86/kernel/apic/apic_flat_64.c | 2 -- arch/x86/kernel/apic/apic_noop.c | 16 +++++++++------- arch/x86/kernel/apic/bigsmp_32.c | 7 +------ arch/x86/kernel/apic/es7000_32.c | 7 +++---- arch/x86/kernel/apic/numaq_32.c | 11 ++++++++++- arch/x86/kernel/apic/probe_32.c | 2 +- arch/x86/kernel/apic/summit_32.c | 11 +---------- arch/x86/kernel/apic/x2apic_cluster.c | 1 - arch/x86/kernel/apic/x2apic_phys.c | 1 - arch/x86/kernel/apic/x2apic_uv_x.c | 1 - arch/x86/kernel/smpboot.c | 3 +-- 13 files changed, 37 insertions(+), 41 deletions(-)
arch/x86/include/asm/apic.h +4 -2
@@ -306,7 +306,6 @@ struct apic {void (*setup_apic_routing)(void );int (*multi_timer_check)(int apic,int irq); -int (*apicid_to_node)(int logical_apicid);int (*cpu_present_to_apicid)(int mps_cpu);void (*apicid_to_cpu_present)(int phys_apicid,physid_mask_t *retmap);void (*setup_portio_remap)(void );
@@ -367,6 +366,9 @@ struct apic {* won't be applied properly during early boot in this case. */ int (*x86_32_early_logical_apicid)(int cpu); + +/* determine CPU -> NUMA node mapping */ +int (*x86_32_numa_cpu_node)(int cpu);#endif };
@@ -539,7 +541,7 @@ static inline int default_phys_pkg_id(int cpuid_apic, int index_msb) return cpuid_apic >> index_msb; } -extern int default_apicid_to_node (int logical_apicid); +extern int default_x86_32_numa_cpu_node (int cpu);#endif
arch/x86/kernel/apic/apic.c +7 -3
@@ -2020,10 +2020,14 @@ void default_init_apic_ldr(void) }#ifdef CONFIG_X86_32 -int default_apicid_to_node (int logical_apicid) +int default_x86_32_numa_cpu_node (int cpu) { -#ifdef CONFIG_SMP -return apicid_2_node[hard_smp_processor_id ()]; +#ifdef CONFIG_NUMA +int apicid =early_per_cpu (x86_cpu_to_apicid, cpu); + +if (apicid !=BAD_APICID ) +return apicid_2_node[apicid]; +return NUMA_NO_NODE ;#else return 0 ;#endif
arch/x86/kernel/apic/apic_flat_64.c +0 -2
@@ -185,7 +185,6 @@ struct apic apic_flat = { .ioapic_phys_id_map = NULL, .setup_apic_routing = NULL, .multi_timer_check = NULL, - .apicid_to_node = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
@@ -336,7 +335,6 @@ struct apic apic_physflat = { .ioapic_phys_id_map = NULL, .setup_apic_routing = NULL, .multi_timer_check = NULL, - .apicid_to_node = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/apic/apic_noop.c +9 -7
@@ -108,12 +108,6 @@ static void noop_vector_allocation_domain(int cpu, struct cpumask *retmask)cpumask_set_cpu (cpu, retmask); } -int noop_apicid_to_node (int logical_apicid) -{ -/* we're always on node 0 */ -return 0 ; -} -static u32 noop_apic_read (u32 reg) {WARN_ON_ONCE ((cpu_has_apic && !disable_apic));
@@ -125,6 +119,14 @@ static void noop_apic_write(u32 reg, u32 v)WARN_ON_ONCE (cpu_has_apic && !disable_apic); } +#ifdef CONFIG_X86_32 +static int noop_x86_32_numa_cpu_node (int cpu) +{ +/* we're always on node 0 */ +return 0 ; +} +#endif +struct apic apic_noop = { .name ="noop" , .probe = noop_probe,
@@ -148,7 +150,6 @@ struct apic apic_noop = { .ioapic_phys_id_map = default_ioapic_phys_id_map, .setup_apic_routing = NULL, .multi_timer_check = NULL, - .apicid_to_node = noop_apicid_to_node, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = physid_set_mask_of_physid,
@@ -194,5 +195,6 @@ struct apic apic_noop = {#ifdef CONFIG_X86_32 .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_numa_cpu_node = noop_x86_32_numa_cpu_node,#endif };
arch/x86/kernel/apic/bigsmp_32.c +1 -6
@@ -86,11 +86,6 @@ static void bigsmp_setup_apic_routing(void) nr_ioapics); } -static int bigsmp_apicid_to_node (int logical_apicid) -{ -return apicid_2_node[hard_smp_processor_id ()]; -} -static int bigsmp_cpu_present_to_apicid (int mps_cpu) {if (mps_cpu < nr_cpu_ids)
@@ -221,7 +216,6 @@ struct apic apic_bigsmp = { .ioapic_phys_id_map = bigsmp_ioapic_phys_id_map, .setup_apic_routing = bigsmp_setup_apic_routing, .multi_timer_check = NULL, - .apicid_to_node = bigsmp_apicid_to_node, .cpu_present_to_apicid = bigsmp_cpu_present_to_apicid, .apicid_to_cpu_present = physid_set_mask_of_physid, .setup_portio_remap = NULL,
@@ -259,4 +253,5 @@ struct apic apic_bigsmp = { .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, .x86_32_early_logical_apicid = bigsmp_early_logical_apicid, + .x86_32_numa_cpu_node = default_x86_32_numa_cpu_node, };
arch/x86/kernel/apic/es7000_32.c +3 -4
@@ -510,12 +510,11 @@ static void es7000_setup_apic_routing(void) nr_ioapics, cpumask_bits(es7000_target_cpus())[0]); } -static int es7000_apicid_to_node (int logical_apicid) +static int es7000_numa_cpu_node (int cpu) {return 0 ; } -static int es7000_cpu_present_to_apicid (int mps_cpu) {if (!mps_cpu)
@@ -649,7 +648,6 @@ struct apic __refdata apic_es7000_cluster = { .ioapic_phys_id_map = es7000_ioapic_phys_id_map, .setup_apic_routing = es7000_setup_apic_routing, .multi_timer_check = NULL, - .apicid_to_node = es7000_apicid_to_node, .cpu_present_to_apicid = es7000_cpu_present_to_apicid, .apicid_to_cpu_present = es7000_apicid_to_cpu_present, .setup_portio_remap = NULL,
@@ -690,6 +688,7 @@ struct apic __refdata apic_es7000_cluster = { .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, .x86_32_early_logical_apicid = es7000_early_logical_apicid, + .x86_32_numa_cpu_node = es7000_numa_cpu_node, };struct apic __refdata apic_es7000 = {
@@ -715,7 +714,6 @@ struct apic __refdata apic_es7000 = { .ioapic_phys_id_map = es7000_ioapic_phys_id_map, .setup_apic_routing = es7000_setup_apic_routing, .multi_timer_check = NULL, - .apicid_to_node = es7000_apicid_to_node, .cpu_present_to_apicid = es7000_cpu_present_to_apicid, .apicid_to_cpu_present = es7000_apicid_to_cpu_present, .setup_portio_remap = NULL,
@@ -754,4 +752,5 @@ struct apic __refdata apic_es7000 = { .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, .x86_32_early_logical_apicid = es7000_early_logical_apicid, + .x86_32_numa_cpu_node = es7000_numa_cpu_node, };
arch/x86/kernel/apic/numaq_32.c +10 -1
@@ -391,6 +391,15 @@ static inline int numaq_apicid_to_node(int logical_apicid)return logical_apicid >>4 ; } +static int numaq_numa_cpu_node (int cpu) +{ +int logical_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu); + +if (logical_apicid !=BAD_APICID ) +return numaq_apicid_to_node (logical_apicid); +return NUMA_NO_NODE ; +} +static void numaq_apicid_to_cpu_present (int logical_apicid,physid_mask_t *retmap) {int node =numaq_apicid_to_node (logical_apicid);
@@ -501,7 +510,6 @@ struct apic __refdata apic_numaq = { .ioapic_phys_id_map = numaq_ioapic_phys_id_map, .setup_apic_routing = numaq_setup_apic_routing, .multi_timer_check = numaq_multi_timer_check, - .apicid_to_node = numaq_apicid_to_node, .cpu_present_to_apicid = numaq_cpu_present_to_apicid, .apicid_to_cpu_present = numaq_apicid_to_cpu_present, .setup_portio_remap = numaq_setup_portio_remap,
@@ -541,4 +549,5 @@ struct apic __refdata apic_numaq = { .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, + .x86_32_numa_cpu_node = numaq_numa_cpu_node, };
arch/x86/kernel/apic/probe_32.c +1 -1
@@ -135,7 +135,6 @@ struct apic apic_default = { .ioapic_phys_id_map = default_ioapic_phys_id_map, .setup_apic_routing = setup_apic_flat_routing, .multi_timer_check = NULL, - .apicid_to_node = default_apicid_to_node, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = physid_set_mask_of_physid, .setup_portio_remap = NULL,
@@ -173,6 +172,7 @@ struct apic apic_default = { .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, .x86_32_early_logical_apicid = default_x86_32_early_logical_apicid, + .x86_32_numa_cpu_node = default_x86_32_numa_cpu_node, };extern struct apic apic_numaq;
arch/x86/kernel/apic/summit_32.c +1 -10
@@ -239,15 +239,6 @@ static void summit_setup_apic_routing(void) nr_ioapics); } -static int summit_apicid_to_node (int logical_apicid) -{ -#ifdef CONFIG_SMP -return apicid_2_node[hard_smp_processor_id ()]; -#else -return 0 ; -#endif -} -static int summit_cpu_present_to_apicid (int mps_cpu) {if (mps_cpu < nr_cpu_ids)
@@ -523,7 +514,6 @@ struct apic apic_summit = { .ioapic_phys_id_map = summit_ioapic_phys_id_map, .setup_apic_routing = summit_setup_apic_routing, .multi_timer_check = NULL, - .apicid_to_node = summit_apicid_to_node, .cpu_present_to_apicid = summit_cpu_present_to_apicid, .apicid_to_cpu_present = summit_apicid_to_cpu_present, .setup_portio_remap = NULL,
@@ -561,4 +551,5 @@ struct apic apic_summit = { .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, .x86_32_early_logical_apicid = summit_early_logical_apicid, + .x86_32_numa_cpu_node = default_x86_32_numa_cpu_node, };
arch/x86/kernel/apic/x2apic_cluster.c +0 -1
@@ -206,7 +206,6 @@ struct apic apic_x2apic_cluster = { .ioapic_phys_id_map = NULL, .setup_apic_routing = NULL, .multi_timer_check = NULL, - .apicid_to_node = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/apic/x2apic_phys.c +0 -1
@@ -195,7 +195,6 @@ struct apic apic_x2apic_phys = { .ioapic_phys_id_map = NULL, .setup_apic_routing = NULL, .multi_timer_check = NULL, - .apicid_to_node = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/apic/x2apic_uv_x.c +0 -1
@@ -338,7 +338,6 @@ struct apic __refdata apic_x2apic_uv_x = { .ioapic_phys_id_map = NULL, .setup_apic_routing = NULL, .multi_timer_check = NULL, - .apicid_to_node = NULL, .cpu_present_to_apicid = default_cpu_present_to_apicid, .apicid_to_cpu_present = NULL, .setup_portio_remap = NULL,
arch/x86/kernel/smpboot.c +1 -2
@@ -168,10 +168,9 @@ static void unmap_cpu_to_node(int cpu)static void map_cpu_to_logical_apicid (void ) {int cpu =smp_processor_id (); -int logical_apicid =early_per_cpu (x86_cpu_to_logical_apicid, cpu);int node; - node = apic->apicid_to_node (logical_apicid); + node = apic->x86_32_numa_cpu_node (cpu);if (!node_online (node)) node = first_online_node;
PATCH 13/16 x86: Unify cpu/apicid <-> NUMA node mapping between 32 and 64bit
In reply to Tejun HeoThe mapping between cpu/apicid and node is done via apicid_to_node[] on 64bit and apicid_2_node[] + apic->x86_32_numa_cpu_node() on 32bit. This difference makes it difficult to further unify 32 and 64bit NUMA handling.
This patch unifies it by replacing both apicid_to_node[] and apicid_2_node[] with __apicid_to_node[] array, which is accessed by two accessors - set_apicid_to_node() and numa_cpu_node(). On 64bit, numa_cpu_node() always consults __apicid_to_node[] directly while 32bit goes through apic->numa_cpu_node() method to allow apic implementations to override it.
srat_detect_node() for amd cpus contains workaround for broken NUMA configuration which assumes relationship between APIC ID, HT node ID and NUMA topology. Leave it to access __apicid_to_node[] directly as mapping through CPU might result in undesirable behavior change. The comment is reformatted and updated to note the ugliness.
--- arch/x86/include/asm/mpspec.h | 1 - arch/x86/include/asm/numa.h | 28 +++++++++++++++++++++++ arch/x86/include/asm/numa_32.h | 6 +++++ arch/x86/include/asm/numa_64.h | 5 +-- arch/x86/kernel/acpi/boot.c | 3 +- arch/x86/kernel/apic/apic.c | 2 +- arch/x86/kernel/cpu/amd.c | 47 +++++++++++++++++++++++++-------------- arch/x86/kernel/cpu/intel.c | 3 +- arch/x86/kernel/smpboot.c | 6 +---- arch/x86/mm/amdtopology_64.c | 4 +- arch/x86/mm/numa.c | 6 ++++- arch/x86/mm/numa_32.c | 6 +++++ arch/x86/mm/numa_64.c | 26 +++++++++------------ arch/x86/mm/srat_32.c | 2 +- arch/x86/mm/srat_64.c | 12 +++++----- 15 files changed, 101 insertions(+), 56 deletions(-)
arch/x86/include/asm/mpspec.h +0 -1
@@ -25,7 +25,6 @@ extern int pic_mode;#define MAX_IRQ_SOURCES 256extern unsigned int def_to_bigsmp; -extern u8 apicid_2_node[];#ifdef CONFIG_X86_NUMAQ extern int mp_bus_id_to_node[MAX_MP_BUSSES ];
arch/x86/include/asm/numa.h +28 -0
@@ -1,5 +1,33 @@ +#ifndef _ASM_X86_NUMA_H +#define _ASM_X86_NUMA_H + +#include <asm/apicdef.h> + +#ifdef CONFIG_NUMA +/* +* __apicid_to_node[] stores the raw mapping between physical apicid and +* node and is used to initialize cpu_to_node mapping. +* +* The mapping may be overridden by apic->numa_cpu_node() on 32bit and thus +* should be accessed by the accessors - set_apicid_to_node() and +* numa_cpu_node(). +*/ +extern s16 __apicid_to_node[MAX_LOCAL_APIC ]; + +static inline void set_apicid_to_node (int apicid,s16 node) +{ + __apicid_to_node[apicid] = node; +} +#else /* CONFIG_NUMA */ +static inline void set_apicid_to_node (int apicid,s16 node) +{ +} +#endif /* CONFIG_NUMA */ +#ifdef CONFIG_X86_32 # include "numa_32.h" #else # include "numa_64.h" #endif + +#endif /* _ASM_X86_NUMA_H */
arch/x86/include/asm/numa_32.h +6 -0
@@ -6,6 +6,12 @@ extern int numa_off;extern int pxm_to_nid (int pxm);extern void numa_remove_cpu (int cpu); +#ifdef CONFIG_NUMA +extern int __cpuinit numa_cpu_node (int apicid); +#else /* CONFIG_NUMA */ +static inline int numa_cpu_node (int cpu) {return NUMA_NO_NODE ; } +#endif /* CONFIG_NUMA */ +#ifdef CONFIG_HIGHMEM extern void set_highmem_pages_init (void );#else
arch/x86/include/asm/numa_64.h +2 -3
@@ -2,7 +2,6 @@#define _ASM_X86_NUMA_64_H#include <linux/nodemask.h> -#include <asm/apicdef.h> struct bootnode {u64 start;
@@ -17,8 +16,6 @@ extern int compute_hash_shift(struct bootnode *nodes, int numblks,extern void numa_init_array (void );extern int numa_off; -extern s16 apicid_to_node[MAX_LOCAL_APIC ]; -extern unsigned long numa_free_all_bootmem (void );extern void setup_node_bootmem (int nodeid,unsigned long start,unsigned long end);
@@ -32,6 +29,7 @@ extern void setup_node_bootmem(int nodeid, unsigned long start,#define NODE_MIN_SIZE (4*1024*1024)extern void __init init_cpu_to_node (void ); +extern int __cpuinit numa_cpu_node (int cpu);extern void __cpuinit numa_set_node (int cpu,int node);extern void __cpuinit numa_clear_node (int cpu);extern void __cpuinit numa_add_cpu (int cpu);
@@ -44,6 +42,7 @@ void numa_emu_cmdline(char *);#endif /* CONFIG_NUMA_EMU */ #else static inline void init_cpu_to_node (void ) { } +static inline int numa_cpu_node (int cpu) {return NUMA_NO_NODE ; }static inline void numa_set_node (int cpu,int node) { }static inline void numa_clear_node (int cpu) { }static inline void numa_add_cpu (int cpu,int node) { }
arch/x86/kernel/acpi/boot.c +1 -2
@@ -589,11 +589,10 @@ static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) nid =acpi_get_node (handle);if (nid ==-1 || !node_online (nid))return ; +set_apicid_to_node (physid, nid);#ifdef CONFIG_X86_64 - apicid_to_node[physid] = nid;numa_set_node (cpu, nid);#else /* CONFIG_X86_32 */ - apicid_2_node[physid] = nid; cpu_to_node_map[cpu] = nid;#endif
arch/x86/kernel/apic/apic.c +1 -1
@@ -2026,7 +2026,7 @@ int default_x86_32_numa_cpu_node(int cpu)int apicid =early_per_cpu (x86_cpu_to_apicid, cpu);if (apicid !=BAD_APICID ) -return apicid_2_node[apicid]; +return __apicid_to_node[apicid];return NUMA_NO_NODE ;#else return 0 ;
arch/x86/kernel/cpu/amd.c +30 -17
73 lines not on this page · raw message
arch/x86/kernel/cpu/intel.c +1 -2
@@ -279,11 +279,10 @@ static void __cpuinit srat_detect_node(struct cpuinfo_x86 *c)#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_64 )unsigned node;int cpu =smp_processor_id (); -int apicid = cpu_has_apic ?hard_smp_processor_id () : c->apicid;/* Don't do the funky fallback heuristics the AMD version employs for now. */ - node = apicid_to_node[apicid]; + node =numa_cpu_node (cpu);if (node ==NUMA_NO_NODE || !node_online (node)) {/* reuse the value from init_cpu_to_node() */ node =cpu_to_node (cpu);
arch/x86/kernel/smpboot.c +1 -5
@@ -71,10 +71,6 @@#include <asm/smpboot_hooks.h> #include <asm/i8259.h> -#ifdef CONFIG_X86_32 -u8 apicid_2_node[MAX_LOCAL_APIC ]; -#endif -/* State of each CPU */ DEFINE_PER_CPU(int, cpu_state) = { 0 };
@@ -170,7 +166,7 @@ static void map_cpu_to_logical_apicid(void)int cpu =smp_processor_id ();int node; - node = apic->x86_32_numa_cpu_node (cpu); + node =numa_cpu_node (cpu);if (!node_online (node)) node = first_online_node;
arch/x86/mm/amdtopology_64.c +2 -2
@@ -247,7 +247,7 @@ void __init amd_fake_nodes(const struct bootnode *nodes, int nr_nodes)__acpi_map_pxm_to_node (nid, i); #endif } -memcpy (apicid_to_node, fake_apicid_to_node,sizeof (apicid_to_node)); +memcpy (__apicid_to_node, fake_apicid_to_node,sizeof (__apicid_to_node)); }#endif /* CONFIG_NUMA_EMU */
@@ -285,7 +285,7 @@ int __init amd_scan_nodes(void) nodes[i].start >>PAGE_SHIFT , nodes[i].end >> PAGE_SHIFT);for (j = apicid_base; j < cores + apicid_base; j++) - apicid_to_node[(i << bits) + j] = i; +set_apicid_to_node ((i << bits) + j, i);setup_node_bootmem (i, nodes[i].start, nodes[i].end); }
arch/x86/mm/numa.c +5 -1
@@ -26,8 +26,12 @@ static __init int numa_setup(char *opt)early_param ("numa" , numa_setup);/* -* Which logical CPUs are on which nodes +* apicid, cpu, node mappings */ +s16 __apicid_to_node[MAX_LOCAL_APIC ]__cpuinitdata = { + [0 ...MAX_LOCAL_APIC -1 ] =NUMA_NO_NODE +}; +cpumask_var_t node_to_cpumask_map[MAX_NUMNODES ];EXPORT_SYMBOL (node_to_cpumask_map);
arch/x86/mm/numa_32.c +6 -0
@@ -110,6 +110,12 @@ void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags);static unsigned long kva_start_pfn;static unsigned long kva_pages; + +int __cpuinit numa_cpu_node (int cpu) +{ +return apic->x86_32_numa_cpu_node (cpu); +} +/* * FLAT - support for basic PC memory model with discontig enabled, essentially * a single node with all available processors in it with a flat
arch/x86/mm/numa_64.c +11 -15
@@ -26,10 +26,6 @@ EXPORT_SYMBOL(node_data);struct memnode memnode; -s16 apicid_to_node[MAX_LOCAL_APIC ]__cpuinitdata = { - [0 ...MAX_LOCAL_APIC -1 ] =NUMA_NO_NODE -}; -static unsigned long __initdata nodemap_addr;static unsigned long __initdata nodemap_size;
@@ -716,12 +712,8 @@ void __init init_cpu_to_node(void)BUG_ON (cpu_to_apicid ==NULL );for_each_possible_cpu (cpu) { -int node; -u16 apicid = cpu_to_apicid[cpu]; +int node =numa_cpu_node (cpu); -if (apicid ==BAD_APICID ) -continue ; - node = apicid_to_node[apicid];if (node ==NUMA_NO_NODE )continue ;if (!node_online (node))
@@ -731,6 +723,14 @@ void __init init_cpu_to_node(void) }#endif +int __cpuinit numa_cpu_node (int cpu) +{ +int apicid =early_per_cpu (x86_cpu_to_apicid, cpu); + +if (apicid !=BAD_APICID ) +return __apicid_to_node[apicid]; +return NUMA_NO_NODE ; +}void __cpuinit numa_set_node (int cpu,int node) {
@@ -776,13 +776,9 @@ void __cpuinit numa_remove_cpu(int cpu)void __cpuinit numa_add_cpu (int cpu) {unsigned long addr; -u16 apicid; -int physnid; -int nid =NUMA_NO_NODE ; +int physnid, nid; - apicid =early_per_cpu (x86_cpu_to_apicid, cpu); -if (apicid !=BAD_APICID ) - nid = apicid_to_node[apicid]; + nid =numa_cpu_node (cpu);if (nid ==NUMA_NO_NODE ) nid =early_cpu_to_node (cpu);BUG_ON (nid ==NUMA_NO_NODE || !node_online (nid));
arch/x86/mm/srat_32.c +1 -1
@@ -255,7 +255,7 @@ int __init get_memcfg_from_srat(void) num_memory_chunks);for (i =0 ; i <MAX_LOCAL_APIC ; i++) - apicid_2_node[i] =pxm_to_node (apicid_to_pxm[i]); +set_apicid_to_node (i,pxm_to_node (apicid_to_pxm[i]));for (j =0 ; j < num_memory_chunks; j++){struct node_memory_chunk_s * chunk = &node_memory_chunk[j];
arch/x86/mm/srat_64.c +6 -6
@@ -79,7 +79,7 @@ static __init void bad_srat(void)printk (KERN_ERR "SRAT: SRAT not used.\n" ); acpi_numa =-1 ;for (i =0 ; i <MAX_LOCAL_APIC ; i++) - apicid_to_node[i] =NUMA_NO_NODE ; +set_apicid_to_node (i,NUMA_NO_NODE );for (i =0 ; i <MAX_NUMNODES ; i++) { nodes[i].start = nodes[i].end =0 ; nodes_add[i].start = nodes_add[i].end =0 ;
@@ -138,7 +138,7 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)printk (KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u skipped apicid that is too big\n" , pxm, apic_id, node);return ; } - apicid_to_node[apic_id] = node; +set_apicid_to_node (apic_id, node);node_set (node, cpu_nodes_parsed); acpi_numa =1 ; printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u\n",
@@ -178,7 +178,7 @@ acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)return ; } - apicid_to_node[apic_id] = node; +set_apicid_to_node (apic_id, node);node_set (node, cpu_nodes_parsed); acpi_numa =1 ; printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%02x -> Node %u\n",
@@ -521,7 +521,7 @@ void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes)* node, it must now point to the fake node ID. */ for (j =0 ; j <MAX_LOCAL_APIC ; j++) -if (apicid_to_node[j] == nid && +if (__apicid_to_node[j] == nid && fake_apicid_to_node[j] ==NUMA_NO_NODE ) fake_apicid_to_node[j] = i; }
@@ -532,13 +532,13 @@ void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes)* value. */ for (i =0 ; i <MAX_LOCAL_APIC ; i++) -if (apicid_to_node[i] !=NUMA_NO_NODE && +if (__apicid_to_node[i] !=NUMA_NO_NODE && fake_apicid_to_node[i] ==NUMA_NO_NODE ) fake_apicid_to_node[i] =0 ;for (i =0 ; i < num_nodes; i++)__acpi_map_pxm_to_node (fake_node_to_pxm_map[i], i); -memcpy (apicid_to_node, fake_apicid_to_node,sizeof (apicid_to_node)); +memcpy (__apicid_to_node, fake_apicid_to_node,sizeof (__apicid_to_node));nodes_clear (nodes_parsed);for (i =0 ; i < num_nodes; i++)
Signature · 1 line
1.7.1
[tip:x86/numa] x86: Unify cpu/apicid <-> NUMA node mapping between 32 and 64bit
Commit-ID: bbc9e2f452d9c4b166d1f9a78d941d80173312fe Gitweb: http://git.kernel.org/tip/bbc9e2f452d9c4b166d1f9a78d941d80173312fe Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:39 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:09 +0100
x86: Unify cpu/apicid <-> NUMA node mapping between 32 and 64bit
The mapping between cpu/apicid and node is done via apicid_to_node[] on 64bit and apicid_2_node[] + apic->x86_32_numa_cpu_node() on 32bit. This difference makes it difficult to further unify 32 and 64bit NUMA handling.
This patch unifies it by replacing both apicid_to_node[] and apicid_2_node[] with __apicid_to_node[] array, which is accessed by two accessors - set_apicid_to_node() and numa_cpu_node(). On 64bit, numa_cpu_node() always consults __apicid_to_node[] directly while 32bit goes through apic->numa_cpu_node() method to allow apic implementations to override it.
srat_detect_node() for amd cpus contains workaround for broken NUMA configuration which assumes relationship between APIC ID, HT node ID and NUMA topology. Leave it to access __apicid_to_node[] directly as mapping through CPU might result in undesirable behavior change. The comment is reformatted and updated to note the ugliness.
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/mpspec.h | 1 - arch/x86/include/asm/numa.h | 28 +++++++++++++++++++++++ arch/x86/include/asm/numa_32.h | 6 +++++ arch/x86/include/asm/numa_64.h | 5 +-- arch/x86/kernel/acpi/boot.c | 3 +- arch/x86/kernel/apic/apic.c | 2 +- arch/x86/kernel/cpu/amd.c | 47 +++++++++++++++++++++++++-------------- arch/x86/kernel/cpu/intel.c | 3 +- arch/x86/kernel/smpboot.c | 6 +---- arch/x86/mm/amdtopology_64.c | 4 +- arch/x86/mm/numa.c | 6 ++++- arch/x86/mm/numa_32.c | 6 +++++ arch/x86/mm/numa_64.c | 26 +++++++++------------ arch/x86/mm/srat_32.c | 2 +- arch/x86/mm/srat_64.c | 12 +++++----- 15 files changed, 101 insertions(+), 56 deletions(-)
arch/x86/include/asm/mpspec.h +0 -1
@@ -25,7 +25,6 @@ extern int pic_mode;#define MAX_IRQ_SOURCES 256extern unsigned int def_to_bigsmp; -extern u8 apicid_2_node[];#ifdef CONFIG_X86_NUMAQ extern int mp_bus_id_to_node[MAX_MP_BUSSES ];
arch/x86/include/asm/numa.h +28 -0
@@ -1,5 +1,33 @@ +#ifndef _ASM_X86_NUMA_H +#define _ASM_X86_NUMA_H + +#include <asm/apicdef.h> + +#ifdef CONFIG_NUMA +/* +* __apicid_to_node[] stores the raw mapping between physical apicid and +* node and is used to initialize cpu_to_node mapping. +* +* The mapping may be overridden by apic->numa_cpu_node() on 32bit and thus +* should be accessed by the accessors - set_apicid_to_node() and +* numa_cpu_node(). +*/ +extern s16 __apicid_to_node[MAX_LOCAL_APIC ]; + +static inline void set_apicid_to_node (int apicid,s16 node) +{ + __apicid_to_node[apicid] = node; +} +#else /* CONFIG_NUMA */ +static inline void set_apicid_to_node (int apicid,s16 node) +{ +} +#endif /* CONFIG_NUMA */ +#ifdef CONFIG_X86_32 # include "numa_32.h" #else # include "numa_64.h" #endif + +#endif /* _ASM_X86_NUMA_H */
arch/x86/include/asm/numa_32.h +6 -0
@@ -6,6 +6,12 @@ extern int numa_off;extern int pxm_to_nid (int pxm);extern void numa_remove_cpu (int cpu); +#ifdef CONFIG_NUMA +extern int __cpuinit numa_cpu_node (int apicid); +#else /* CONFIG_NUMA */ +static inline int numa_cpu_node (int cpu) {return NUMA_NO_NODE ; } +#endif /* CONFIG_NUMA */ +#ifdef CONFIG_HIGHMEM extern void set_highmem_pages_init (void );#else
arch/x86/include/asm/numa_64.h +2 -3
@@ -2,7 +2,6 @@#define _ASM_X86_NUMA_64_H#include <linux/nodemask.h> -#include <asm/apicdef.h> struct bootnode {u64 start;
@@ -17,8 +16,6 @@ extern int compute_hash_shift(struct bootnode *nodes, int numblks,extern void numa_init_array (void );extern int numa_off; -extern s16 apicid_to_node[MAX_LOCAL_APIC ]; -extern unsigned long numa_free_all_bootmem (void );extern void setup_node_bootmem (int nodeid,unsigned long start,unsigned long end);
@@ -32,6 +29,7 @@ extern void setup_node_bootmem(int nodeid, unsigned long start,#define NODE_MIN_SIZE (4*1024*1024)extern void __init init_cpu_to_node (void ); +extern int __cpuinit numa_cpu_node (int cpu);extern void __cpuinit numa_set_node (int cpu,int node);extern void __cpuinit numa_clear_node (int cpu);extern void __cpuinit numa_add_cpu (int cpu);
@@ -44,6 +42,7 @@ void numa_emu_cmdline(char *);#endif /* CONFIG_NUMA_EMU */ #else static inline void init_cpu_to_node (void ) { } +static inline int numa_cpu_node (int cpu) {return NUMA_NO_NODE ; }static inline void numa_set_node (int cpu,int node) { }static inline void numa_clear_node (int cpu) { }static inline void numa_add_cpu (int cpu,int node) { }
arch/x86/kernel/acpi/boot.c +1 -2
@@ -589,11 +589,10 @@ static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) nid =acpi_get_node (handle);if (nid ==-1 || !node_online (nid))return ; +set_apicid_to_node (physid, nid);#ifdef CONFIG_X86_64 - apicid_to_node[physid] = nid;numa_set_node (cpu, nid);#else /* CONFIG_X86_32 */ - apicid_2_node[physid] = nid; cpu_to_node_map[cpu] = nid;#endif
arch/x86/kernel/apic/apic.c +1 -1
@@ -2026,7 +2026,7 @@ int default_x86_32_numa_cpu_node(int cpu)int apicid =early_per_cpu (x86_cpu_to_apicid, cpu);if (apicid !=BAD_APICID ) -return apicid_2_node[apicid]; +return __apicid_to_node[apicid];return NUMA_NO_NODE ;#else return 0 ;
arch/x86/kernel/cpu/amd.c +30 -17
73 lines not on this page · raw message
arch/x86/kernel/cpu/intel.c +1 -2
@@ -279,11 +279,10 @@ static void __cpuinit srat_detect_node(struct cpuinfo_x86 *c)#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_64 )unsigned node;int cpu =smp_processor_id (); -int apicid = cpu_has_apic ?hard_smp_processor_id () : c->apicid;/* Don't do the funky fallback heuristics the AMD version employs for now. */ - node = apicid_to_node[apicid]; + node =numa_cpu_node (cpu);if (node ==NUMA_NO_NODE || !node_online (node)) {/* reuse the value from init_cpu_to_node() */ node =cpu_to_node (cpu);
arch/x86/kernel/smpboot.c +1 -5
@@ -71,10 +71,6 @@#include <asm/smpboot_hooks.h> #include <asm/i8259.h> -#ifdef CONFIG_X86_32 -u8 apicid_2_node[MAX_LOCAL_APIC ]; -#endif -/* State of each CPU */ DEFINE_PER_CPU(int, cpu_state) = { 0 };
@@ -170,7 +166,7 @@ static void map_cpu_to_logical_apicid(void)int cpu =smp_processor_id ();int node; - node = apic->x86_32_numa_cpu_node (cpu); + node =numa_cpu_node (cpu);if (!node_online (node)) node = first_online_node;
arch/x86/mm/amdtopology_64.c +2 -2
@@ -247,7 +247,7 @@ void __init amd_fake_nodes(const struct bootnode *nodes, int nr_nodes)__acpi_map_pxm_to_node (nid, i); #endif } -memcpy (apicid_to_node, fake_apicid_to_node,sizeof (apicid_to_node)); +memcpy (__apicid_to_node, fake_apicid_to_node,sizeof (__apicid_to_node)); }#endif /* CONFIG_NUMA_EMU */
@@ -285,7 +285,7 @@ int __init amd_scan_nodes(void) nodes[i].start >>PAGE_SHIFT , nodes[i].end >> PAGE_SHIFT);for (j = apicid_base; j < cores + apicid_base; j++) - apicid_to_node[(i << bits) + j] = i; +set_apicid_to_node ((i << bits) + j, i);setup_node_bootmem (i, nodes[i].start, nodes[i].end); }
arch/x86/mm/numa.c +5 -1
@@ -26,8 +26,12 @@ static __init int numa_setup(char *opt)early_param ("numa" , numa_setup);/* -* Which logical CPUs are on which nodes +* apicid, cpu, node mappings */ +s16 __apicid_to_node[MAX_LOCAL_APIC ]__cpuinitdata = { + [0 ...MAX_LOCAL_APIC -1 ] =NUMA_NO_NODE +}; +cpumask_var_t node_to_cpumask_map[MAX_NUMNODES ];EXPORT_SYMBOL (node_to_cpumask_map);
arch/x86/mm/numa_32.c +6 -0
@@ -110,6 +110,12 @@ void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags);static unsigned long kva_start_pfn;static unsigned long kva_pages; + +int __cpuinit numa_cpu_node (int cpu) +{ +return apic->x86_32_numa_cpu_node (cpu); +} +/* * FLAT - support for basic PC memory model with discontig enabled, essentially * a single node with all available processors in it with a flat
arch/x86/mm/numa_64.c +11 -15
@@ -26,10 +26,6 @@ EXPORT_SYMBOL(node_data);struct memnode memnode; -s16 apicid_to_node[MAX_LOCAL_APIC ]__cpuinitdata = { - [0 ...MAX_LOCAL_APIC -1 ] =NUMA_NO_NODE -}; -static unsigned long __initdata nodemap_addr;static unsigned long __initdata nodemap_size;
@@ -716,12 +712,8 @@ void __init init_cpu_to_node(void)BUG_ON (cpu_to_apicid ==NULL );for_each_possible_cpu (cpu) { -int node; -u16 apicid = cpu_to_apicid[cpu]; +int node =numa_cpu_node (cpu); -if (apicid ==BAD_APICID ) -continue ; - node = apicid_to_node[apicid];if (node ==NUMA_NO_NODE )continue ;if (!node_online (node))
@@ -731,6 +723,14 @@ void __init init_cpu_to_node(void) }#endif +int __cpuinit numa_cpu_node (int cpu) +{ +int apicid =early_per_cpu (x86_cpu_to_apicid, cpu); + +if (apicid !=BAD_APICID ) +return __apicid_to_node[apicid]; +return NUMA_NO_NODE ; +}void __cpuinit numa_set_node (int cpu,int node) {
@@ -776,13 +776,9 @@ void __cpuinit numa_remove_cpu(int cpu)void __cpuinit numa_add_cpu (int cpu) {unsigned long addr; -u16 apicid; -int physnid; -int nid =NUMA_NO_NODE ; +int physnid, nid; - apicid =early_per_cpu (x86_cpu_to_apicid, cpu); -if (apicid !=BAD_APICID ) - nid = apicid_to_node[apicid]; + nid =numa_cpu_node (cpu);if (nid ==NUMA_NO_NODE ) nid =early_cpu_to_node (cpu);BUG_ON (nid ==NUMA_NO_NODE || !node_online (nid));
arch/x86/mm/srat_32.c +1 -1
@@ -255,7 +255,7 @@ int __init get_memcfg_from_srat(void) num_memory_chunks);for (i =0 ; i <MAX_LOCAL_APIC ; i++) - apicid_2_node[i] =pxm_to_node (apicid_to_pxm[i]); +set_apicid_to_node (i,pxm_to_node (apicid_to_pxm[i]));for (j =0 ; j < num_memory_chunks; j++){struct node_memory_chunk_s * chunk = &node_memory_chunk[j];
arch/x86/mm/srat_64.c +6 -6
@@ -79,7 +79,7 @@ static __init void bad_srat(void)printk (KERN_ERR "SRAT: SRAT not used.\n" ); acpi_numa =-1 ;for (i =0 ; i <MAX_LOCAL_APIC ; i++) - apicid_to_node[i] =NUMA_NO_NODE ; +set_apicid_to_node (i,NUMA_NO_NODE );for (i =0 ; i <MAX_NUMNODES ; i++) { nodes[i].start = nodes[i].end =0 ; nodes_add[i].start = nodes_add[i].end =0 ;
@@ -138,7 +138,7 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)printk (KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u skipped apicid that is too big\n" , pxm, apic_id, node);return ; } - apicid_to_node[apic_id] = node; +set_apicid_to_node (apic_id, node);node_set (node, cpu_nodes_parsed); acpi_numa =1 ; printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u\n",
@@ -178,7 +178,7 @@ acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)return ; } - apicid_to_node[apic_id] = node; +set_apicid_to_node (apic_id, node);node_set (node, cpu_nodes_parsed); acpi_numa =1 ; printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%02x -> Node %u\n",
@@ -521,7 +521,7 @@ void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes)* node, it must now point to the fake node ID. */ for (j =0 ; j <MAX_LOCAL_APIC ; j++) -if (apicid_to_node[j] == nid && +if (__apicid_to_node[j] == nid && fake_apicid_to_node[j] ==NUMA_NO_NODE ) fake_apicid_to_node[j] = i; }
@@ -532,13 +532,13 @@ void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes)* value. */ for (i =0 ; i <MAX_LOCAL_APIC ; i++) -if (apicid_to_node[i] !=NUMA_NO_NODE && +if (__apicid_to_node[i] !=NUMA_NO_NODE && fake_apicid_to_node[i] ==NUMA_NO_NODE ) fake_apicid_to_node[i] =0 ;for (i =0 ; i < num_nodes; i++)__acpi_map_pxm_to_node (fake_node_to_pxm_map[i], i); -memcpy (apicid_to_node, fake_apicid_to_node,sizeof (apicid_to_node)); +memcpy (__apicid_to_node, fake_apicid_to_node,sizeof (__apicid_to_node));nodes_clear (nodes_parsed);for (i =0 ; i < num_nodes; i++)
Re: [tip:x86/numa] x86: Unify cpu/apicid <-> NUMA node mapping between 32 and 64bit
Quoted 112 lines · tip-bot for Tejun Heo
Commit-ID: bbc9e2f452d9c4b166d1f9a78d941d80173312fe Gitweb: http://git.kernel.org/tip/bbc9e2f452d9c4b166d1f9a78d941d80173312fe Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:39 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:09 +0100x86: Unify cpu/apicid <-> NUMA node mapping between 32 and 64bit
The mapping between cpu/apicid and node is done via apicid_to_node[] on 64bit and apicid_2_node[] +
apic->x86_32_numa_cpu_node()on 32bit. This difference makes it difficult to further unify 32 and 64bit NUMA handling.This patch unifies it by replacing both apicid_to_node[] and apicid_2_node[] with __apicid_to_node[] array, which is accessed by two accessors -
set_apicid_to_node()andnuma_cpu_node(). On 64bit,numa_cpu_node()always consults __apicid_to_node[] directly while 32bit goes throughapic->numa_cpu_node()method to allow apic implementations to override it.
srat_detect_node()for amd cpus contains workaround for broken NUMA configuration which assumes relationship between APIC ID, HT node ID and NUMA topology. Leave it to access __apicid_to_node[] directly as mapping through CPU might result in undesirable behavior change. The comment is reformatted and updated to note the ugliness.Signed-off-by Tejun Heo <[email protected]>Reviewed-by Pekka Enberg <[email protected]>LKML-Reference: <[email protected]>
Signed-off-by Ingo Molnar <[email protected]>Cc David Rientjes <[email protected]>--- arch/x86/include/asm/mpspec.h | 1 - arch/x86/include/asm/numa.h | 28 +++++++++++++++++++++++ arch/x86/include/asm/numa_32.h | 6 +++++ arch/x86/include/asm/numa_64.h | 5 +-- arch/x86/kernel/acpi/boot.c | 3 +- arch/x86/kernel/apic/apic.c | 2 +- arch/x86/kernel/cpu/amd.c | 47 +++++++++++++++++++++++++-------------- arch/x86/kernel/cpu/intel.c | 3 +- arch/x86/kernel/smpboot.c | 6 +---- arch/x86/mm/amdtopology_64.c | 4 +- arch/x86/mm/numa.c | 6 ++++- arch/x86/mm/numa_32.c | 6 +++++ arch/x86/mm/numa_64.c | 26 +++++++++------------ arch/x86/mm/srat_32.c | 2 +- arch/x86/mm/srat_64.c | 12 +++++----- 15 files changed, 101 insertions(+), 56 deletions(-)arch/x86/include/asm/mpspec.h +0
-1@@ -25,7 +25,6 @@ extern int pic_mode;#define MAX_IRQ_SOURCES 256extern unsigned int def_to_bigsmp; -extern u8 apicid_2_node[];#ifdef CONFIG_X86_NUMAQ extern int mp_bus_id_to_node[MAX_MP_BUSSES ];arch/x86/include/asm/numa.h +28
-0@@ -1,5 +1,33 @@ +#ifndef _ASM_X86_NUMA_H +#define _ASM_X86_NUMA_H + +#include <asm/apicdef.h> + +#ifdef CONFIG_NUMA +/* +* __apicid_to_node[] stores the raw mapping between physical apicid and +* node and is used to initialize cpu_to_node mapping. +* +* The mapping may be overridden by apic->numa_cpu_node() on 32bit and thus +* should be accessed by the accessors - set_apicid_to_node() and +* numa_cpu_node(). +*/ +extern s16 __apicid_to_node[MAX_LOCAL_APIC ]; + +static inline void set_apicid_to_node (int apicid,s16 node) +{ + __apicid_to_node[apicid] = node; +} +#else /* CONFIG_NUMA */ +static inline void set_apicid_to_node (int apicid,s16 node) +{ +} +#endif /* CONFIG_NUMA */ +#ifdef CONFIG_X86_32 # include "numa_32.h" #else # include "numa_64.h" #endif + +#endif /* _ASM_X86_NUMA_H */ arch/x86/include/asm/numa_32.h +0
-0
arch/x86/include/asm/numa_32.h extern int numa_off; · line 10
Quoted 5 lines
arch/x86/include/asm/numa_32.h +2
-0@@ -6,6 +6,12 @@ extern int numa_off;extern int pxm_to_nid (int pxm);extern void numa_remove_cpu (int cpu); +#ifdef CONFIG_NUMA +extern int __cpuinit numa_cpu_node (int apicid);
cpu or apicid?
Quoted 282 lines
arch/x86/include/asm/numa_32.h +4
-0+#else /* CONFIG_NUMA */ +static inline int numa_cpu_node (int cpu) {return NUMA_NO_NODE ; } +#endif /* CONFIG_NUMA */ +#ifdef CONFIG_HIGHMEM extern void set_highmem_pages_init (void );#else arch/x86/include/asm/numa_64.h +2
-3@@ -2,7 +2,6 @@#define _ASM_X86_NUMA_64_H#include <linux/nodemask.h> -#include <asm/apicdef.h> struct bootnode {u64 start;@@ -17,8 +16,6 @@ extern int compute_hash_shift(struct bootnode *nodes, int numblks,extern void numa_init_array (void );extern int numa_off; -extern s16 apicid_to_node[MAX_LOCAL_APIC ]; -extern unsigned long numa_free_all_bootmem (void );extern void setup_node_bootmem (int nodeid,unsigned long start,unsigned long end);@@ -32,6 +29,7 @@ extern void setup_node_bootmem(int nodeid, unsigned long start,#define NODE_MIN_SIZE (4*1024*1024)extern void __init init_cpu_to_node (void ); +extern int __cpuinit numa_cpu_node (int cpu);extern void __cpuinit numa_set_node (int cpu,int node);extern void __cpuinit numa_clear_node (int cpu);extern void __cpuinit numa_add_cpu (int cpu);@@ -44,6 +42,7 @@ void numa_emu_cmdline(char *);#endif /* CONFIG_NUMA_EMU */ #else static inline void init_cpu_to_node (void ) { } +static inline int numa_cpu_node (int cpu) {return NUMA_NO_NODE ; }static inline void numa_set_node (int cpu,int node) { }static inline void numa_clear_node (int cpu) { }static inline void numa_add_cpu (int cpu,int node) { }arch/x86/kernel/acpi/boot.c +1
-2@@ -589,11 +589,10 @@ static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) nid =acpi_get_node (handle);if (nid ==-1 || !node_online (nid))return ; +set_apicid_to_node (physid, nid);#ifdef CONFIG_X86_64 - apicid_to_node[physid] = nid;numa_set_node (cpu, nid);#else /* CONFIG_X86_32 */ - apicid_2_node[physid] = nid; cpu_to_node_map[cpu] = nid;#endif arch/x86/kernel/apic/apic.c +1
-1@@ -2026,7 +2026,7 @@ int default_x86_32_numa_cpu_node(int cpu)int apicid =early_per_cpu (x86_cpu_to_apicid, cpu);if (apicid !=BAD_APICID ) -return apicid_2_node[apicid]; +return __apicid_to_node[apicid];return NUMA_NO_NODE ;#else return 0 ;arch/x86/kernel/cpu/amd.c +30
-17@@ -234,17 +234,21 @@ static void __cpuinit init_amd_k7(struct cpuinfo_x86 *c)#endif #if defined(CONFIG_NUMA ) && defined(CONFIG_X86_64 ) +/* +* To workaround broken NUMA config. Read the comment in +* srat_detect_node(). +*/ static int __cpuinit nearby_node (int apicid) {int i, node;for (i = apicid -1 ; i >=0 ; i--) { - node = apicid_to_node[i]; + node = __apicid_to_node[i];if (node !=NUMA_NO_NODE &&node_online (node))return node; }for (i = apicid +1 ; i <MAX_LOCAL_APIC ; i++) { - node = apicid_to_node[i]; + node = __apicid_to_node[i];if (node !=NUMA_NO_NODE &&node_online (node))return node; }@@ -339,26 +343,35 @@ static void __cpuinit srat_detect_node(struct cpuinfo_x86 *c)int node;unsigned apicid = c->apicid; - node =per_cpu (cpu_llc_id, cpu); + node =numa_cpu_node (cpu); +if (node ==NUMA_NO_NODE ) + node =per_cpu (cpu_llc_id, cpu); -if (apicid_to_node[apicid] !=NUMA_NO_NODE ) - node = apicid_to_node[apicid];if (!node_online (node)) { -/* Two possibilities here: -- The CPU is missing memory and no node was created. -In that case try picking one from a nearby CPU -- The APIC IDs differ from the HyperTransport node IDs -which the K8 northbridge parsing fills in. -Assume they are all increased by a constant offset, -but in the same order as the HT nodeids. -If that doesn't result in a usable node fall back to the -path for the previous case. */ - +/* +* Two possibilities here: +* +* - The CPU is missing memory and no node was created. In +* that case try picking one from a nearby CPU. +* +* - The APIC IDs differ from the HyperTransport node IDs +* which the K8 northbridge parsing fills in. Assume +* they are all increased by a constant offset, but in +* the same order as the HT nodeids. If that doesn't +* result in a usable node fall back to the path for the +* previous case. +* +* This workaround operates directly on the mapping between +* APIC ID and NUMA node, assuming certain relationship +* between APIC ID, HT node ID and NUMA topology. As going +* through CPU mapping may alter the outcome, directly +* access __apicid_to_node[]. +*/ int ht_nodeid = c->initial_apicid;if (ht_nodeid >=0 && - apicid_to_node[ht_nodeid] !=NUMA_NO_NODE ) - node = apicid_to_node[ht_nodeid]; + __apicid_to_node[ht_nodeid] !=NUMA_NO_NODE ) + node = __apicid_to_node[ht_nodeid];/* Pick a nearby node */ if (!node_online (node)) node =nearby_node (apicid);arch/x86/kernel/cpu/intel.c +1
-2@@ -279,11 +279,10 @@ static void __cpuinit srat_detect_node(struct cpuinfo_x86 *c)#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_64 )unsigned node;int cpu =smp_processor_id (); -int apicid = cpu_has_apic ?hard_smp_processor_id () : c->apicid;/* Don't do the funky fallback heuristics the AMD version employs for now. */ - node = apicid_to_node[apicid]; + node =numa_cpu_node (cpu);if (node ==NUMA_NO_NODE || !node_online (node)) {/* reuse the value from init_cpu_to_node() */ node =cpu_to_node (cpu);arch/x86/kernel/smpboot.c +1
-5@@ -71,10 +71,6 @@#include <asm/smpboot_hooks.h> #include <asm/i8259.h> -#ifdef CONFIG_X86_32 -u8 apicid_2_node[MAX_LOCAL_APIC ]; -#endif -/* State of each CPU */ DEFINE_PER_CPU(int, cpu_state) = { 0 };@@ -170,7 +166,7 @@ static void map_cpu_to_logical_apicid(void)int cpu =smp_processor_id ();int node; - node = apic->x86_32_numa_cpu_node (cpu); + node =numa_cpu_node (cpu);if (!node_online (node)) node = first_online_node;arch/x86/mm/amdtopology_64.c +2
-2@@ -247,7 +247,7 @@ void __init amd_fake_nodes(const struct bootnode *nodes, int nr_nodes)__acpi_map_pxm_to_node (nid, i); #endif } -memcpy (apicid_to_node, fake_apicid_to_node,sizeof (apicid_to_node)); +memcpy (__apicid_to_node, fake_apicid_to_node,sizeof (__apicid_to_node)); }#endif /* CONFIG_NUMA_EMU */ @@ -285,7 +285,7 @@ int __init amd_scan_nodes(void) nodes[i].start >>PAGE_SHIFT , nodes[i].end >> PAGE_SHIFT);for (j = apicid_base; j < cores + apicid_base; j++) - apicid_to_node[(i << bits) + j] = i; +set_apicid_to_node ((i << bits) + j, i);setup_node_bootmem (i, nodes[i].start, nodes[i].end); }arch/x86/mm/numa.c +5
-1@@ -26,8 +26,12 @@ static __init int numa_setup(char *opt)early_param ("numa" , numa_setup);/* -* Which logical CPUs are on which nodes +* apicid, cpu, node mappings */ +s16 __apicid_to_node[MAX_LOCAL_APIC ]__cpuinitdata = { + [0 ...MAX_LOCAL_APIC -1 ] =NUMA_NO_NODE +}; +cpumask_var_t node_to_cpumask_map[MAX_NUMNODES ];EXPORT_SYMBOL (node_to_cpumask_map);arch/x86/mm/numa_32.c +6
-0@@ -110,6 +110,12 @@ void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags);static unsigned long kva_start_pfn;static unsigned long kva_pages; + +int __cpuinit numa_cpu_node (int cpu) +{ +return apic->x86_32_numa_cpu_node (cpu); +} +/* * FLAT - support for basic PC memory model with discontig enabled, essentially * a single node with all available processors in it with a flat arch/x86/mm/numa_64.c +1
-9@@ -26,10 +26,6 @@ EXPORT_SYMBOL(node_data);struct memnode memnode; -s16 apicid_to_node[MAX_LOCAL_APIC ]__cpuinitdata = { - [0 ...MAX_LOCAL_APIC -1 ] =NUMA_NO_NODE -}; -static unsigned long __initdata nodemap_addr;static unsigned long __initdata nodemap_size;@@ -716,12 +712,8 @@ void __init init_cpu_to_node(void)BUG_ON (cpu_to_apicid ==NULL );for_each_possible_cpu (cpu) { -int node; -u16 apicid = cpu_to_apicid[cpu]; +int node =numa_cpu_node (cpu); -if (apicid ==BAD_APICID ) -continue ; - node = apicid_to_node[apicid];if (node ==NUMA_NO_NODE )continue ;if (!node_online (node))@@ -731,6 +723,14 @@ void __init init_cpu_to_node(void) }
arch/x86/mm/numa_64.c void __init init_cpu_to_node(void) · line 733
Quoted 10 lines
arch/x86/mm/numa_64.c +8
-0#endif +int __cpuinit numa_cpu_node (int cpu) +{ +int apicid =early_per_cpu (x86_cpu_to_apicid, cpu); + +if (apicid !=BAD_APICID ) +return __apicid_to_node[apicid]; +return NUMA_NO_NODE ; +}
it should be changed to cpu_to_node_via_apicid(), it could return not onlined node, aka node without memory.
So don't mess it up with cpu_to_node()
Yinghai
Quoted 92 lines
arch/x86/mm/numa_64.c +2
-6void __cpuinit numa_set_node (int cpu,int node) {@@ -776,13 +776,9 @@ void __cpuinit numa_remove_cpu(int cpu)void __cpuinit numa_add_cpu (int cpu) {unsigned long addr; -u16 apicid; -int physnid; -int nid =NUMA_NO_NODE ; +int physnid, nid; - apicid =early_per_cpu (x86_cpu_to_apicid, cpu); -if (apicid !=BAD_APICID ) - nid = apicid_to_node[apicid]; + nid =numa_cpu_node (cpu);if (nid ==NUMA_NO_NODE ) nid =early_cpu_to_node (cpu);BUG_ON (nid ==NUMA_NO_NODE || !node_online (nid));arch/x86/mm/srat_32.c +1
-1@@ -255,7 +255,7 @@ int __init get_memcfg_from_srat(void) num_memory_chunks);for (i =0 ; i <MAX_LOCAL_APIC ; i++) - apicid_2_node[i] =pxm_to_node (apicid_to_pxm[i]); +set_apicid_to_node (i,pxm_to_node (apicid_to_pxm[i]));for (j =0 ; j < num_memory_chunks; j++){struct node_memory_chunk_s * chunk = &node_memory_chunk[j];arch/x86/mm/srat_64.c +6
-7@@ -79,7 +79,7 @@ static __init void bad_srat(void)printk (KERN_ERR "SRAT: SRAT not used.\n" ); acpi_numa =-1 ;for (i =0 ; i <MAX_LOCAL_APIC ; i++) - apicid_to_node[i] =NUMA_NO_NODE ; +set_apicid_to_node (i,NUMA_NO_NODE );for (i =0 ; i <MAX_NUMNODES ; i++) { nodes[i].start = nodes[i].end =0 ; nodes_add[i].start = nodes_add[i].end =0 ;@@ -138,7 +138,7 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)printk (KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u skipped apicid that is too big\n" , pxm, apic_id, node);return ; } - apicid_to_node[apic_id] = node; +set_apicid_to_node (apic_id, node);node_set (node, cpu_nodes_parsed); acpi_numa =1 ; printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u\n",@@ -178,7 +178,7 @@ acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)return ; } - apicid_to_node[apic_id] = node; +set_apicid_to_node (apic_id, node);node_set (node, cpu_nodes_parsed); acpi_numa =1 ; printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%02x -> Node %u\n",@@ -521,7 +521,7 @@ void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes)* node, it must now point to the fake node ID. */ for (j =0 ; j <MAX_LOCAL_APIC ; j++) -if (apicid_to_node[j] == nid && +if (__apicid_to_node[j] == nid && fake_apicid_to_node[j] ==NUMA_NO_NODE ) fake_apicid_to_node[j] = i; }@@ -532,13 +532,13 @@ void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes)* value. */ for (i =0 ; i <MAX_LOCAL_APIC ; i++) -if (apicid_to_node[i] !=NUMA_NO_NODE && +if (__apicid_to_node[i] !=NUMA_NO_NODE && fake_apicid_to_node[i] ==NUMA_NO_NODE ) fake_apicid_to_node[i] =0 ;for (i =0 ; i < num_nodes; i++)__acpi_map_pxm_to_node (fake_node_to_pxm_map[i], i); -memcpy (apicid_to_node, fake_apicid_to_node,sizeof (apicid_to_node)); +memcpy (__apicid_to_node, fake_apicid_to_node,sizeof (__apicid_to_node));nodes_clear (nodes_parsed);for (i =0 ; i < num_nodes; i++) --To unsubscribe from this list: send the line "unsubscribe linux-tip-commits" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [tip:x86/numa] x86: Unify cpu/apicid <-> NUMA node mapping between 32 and 64bit
Hello, Yinghai.
Quoted 4 lines · Yinghai Lu
arch/x86/include/asm/numa_32.h extern int numa_off; · line 10
Quoted 2 lines
arch/x86/include/asm/numa_32.h +2
-0+#ifdef CONFIG_NUMA +extern int __cpuinit numa_cpu_node (int apicid);cpu or apicid?
Should have been @cpu. Will send a patch to update it.
Quoted 12 lines
arch/x86/mm/numa_64.c void __init init_cpu_to_node(void) · line 733
Quoted 8 lines
arch/x86/mm/numa_64.c +8
-0+int __cpuinit numa_cpu_node (int cpu) +{ +int apicid =early_per_cpu (x86_cpu_to_apicid, cpu); + +if (apicid !=BAD_APICID ) +return __apicid_to_node[apicid]; +return NUMA_NO_NODE ; +}it should be changed to
cpu_to_node_via_apicid(), it could return not onlined node, aka node without memory.
Quoted 1 line
So don't mess it up with
cpu_to_node()
Hmmm... are you saying that the name is too confusing with cpu_to_node() and should be renamed to cpu_to_node_via_apicid()? In that case, I agree but wish the name were something which represents what it does as _via_apicid postfix doesn't really tell much. Any better idea?
Thanks.
Signature · 1 line
tejun
Re: [tip:x86/numa] x86: Unify cpu/apicid <-> NUMA node mapping between 32 and 64bit
Quoted 22 lines · Tejun Heo
Hello, Yinghai.
Quoted 4 lines · Yinghai Lu
arch/x86/include/asm/numa_32.h extern int numa_off; · line 10
Quoted 2 lines
arch/x86/include/asm/numa_32.h +2
-0+#ifdef CONFIG_NUMA +extern int __cpuinit numa_cpu_node (int apicid);cpu or apicid?
Should have been @cpu. Will send a patch to update it.
Quoted 12 lines
arch/x86/mm/numa_64.c void __init init_cpu_to_node(void) · line 733
Quoted 8 lines
arch/x86/mm/numa_64.c +8
-0+int __cpuinit numa_cpu_node (int cpu) +{ + int apicid = early_per_cpu(x86_cpu_to_apicid, cpu); + + if (apicid != BAD_APICID) + return __apicid_to_node[apicid]; + return NUMA_NO_NODE; +}it should be changed to
cpu_to_node_via_apicid(), it could return not onlined node, aka node without memory.
Quoted 7 lines
Quoted 1 line
So don't mess it up with
cpu_to_node()Hmmm... are you saying that the name is too confusing with
cpu_to_node()and should be renamed tocpu_to_node_via_apicid()? In that case, I agree but wish the name were something which represents what it does as_via_apicidpostfix doesn't really tell much. Any better idea?
yes.
wonder if there is other good name better than cpu_to_node_via_apicid...
Yinghai
PATCH 14/16 x86: Unify CPU -> NUMA node mapping between 32 and 64bit
In reply to Tejun HeoUnlike 64bit, 32bit has been using its own cpu_to_node_map[] for CPU -> NUMA node mapping. Replace it with early_percpu variable x86_cpu_to_node_map and share the mapping code with 64bit.
* USE_PERCPU_NUMA_NODE_ID is now enabled for 32bit too.
* x86_cpu_to_node_map and numa_set/clear_node() are moved from numa_64 to numa. For now, on 32bit, x86_cpu_to_node_map is initialized with 0 instead of NUMA_NO_NODE. This is to avoid introducing unexpected behavior change and will be updated once init path is unified.
* srat_detect_node() is now enabled for x86_32 too. It calls numa_set_node() and initializes the mapping making explicit cpu_to_node_map[] updates from map/unmap_cpu_to_node() unnecessary.
--- arch/x86/Kconfig | 2 +- arch/x86/include/asm/numa.h | 8 ++++ arch/x86/include/asm/numa_64.h | 4 -- arch/x86/include/asm/topology.h | 17 --------- arch/x86/kernel/acpi/boot.c | 5 --- arch/x86/kernel/cpu/amd.c | 4 +- arch/x86/kernel/cpu/intel.c | 2 +- arch/x86/kernel/setup_percpu.c | 4 +- arch/x86/kernel/smpboot.c | 6 --- arch/x86/mm/numa.c | 72 ++++++++++++++++++++++++++++++++++++++- arch/x86/mm/numa_64.c | 65 ----------------------------------- 11 files changed, 85 insertions(+), 104 deletions(-)
arch/x86/Kconfig +1 -1
@@ -1705,7 +1705,7 @@ config HAVE_ARCH_EARLY_PFN_TO_NID depends on NUMA config USE_PERCPU_NUMA_NODE_ID - def_bool X86_64 + def_bool y depends on NUMA menu "Power management and ACPI options"
arch/x86/include/asm/numa.h +8 -0
@@ -30,4 +30,12 @@ static inline void set_apicid_to_node(int apicid, s16 node)# include "numa_64.h" #endif +#ifdef CONFIG_NUMA +extern void __cpuinit numa_set_node (int cpu,int node); +extern void __cpuinit numa_clear_node (int cpu); +#else /* CONFIG_NUMA */ +static inline void numa_set_node (int cpu,int node) { } +static inline void numa_clear_node (int cpu) { } +#endif /* CONFIG_NUMA */ +#endif /* _ASM_X86_NUMA_H */
arch/x86/include/asm/numa_64.h +0 -4
@@ -30,8 +30,6 @@ extern void setup_node_bootmem(int nodeid, unsigned long start,extern void __init init_cpu_to_node (void );extern int __cpuinit numa_cpu_node (int cpu); -extern void __cpuinit numa_set_node (int cpu,int node); -extern void __cpuinit numa_clear_node (int cpu);extern void __cpuinit numa_add_cpu (int cpu);extern void __cpuinit numa_remove_cpu (int cpu);
@@ -43,8 +41,6 @@ void numa_emu_cmdline(char *);#else static inline void init_cpu_to_node (void ) { }static inline int numa_cpu_node (int cpu) {return NUMA_NO_NODE ; } -static inline void numa_set_node (int cpu,int node) { } -static inline void numa_clear_node (int cpu) { }static inline void numa_add_cpu (int cpu,int node) { }static inline void numa_remove_cpu (int cpu) { }#endif
arch/x86/include/asm/topology.h +0 -17
@@ -47,21 +47,6 @@#include <asm/mpspec.h> -#ifdef CONFIG_X86_32 - -/* Mappings between logical cpu number and node number */ -extern int cpu_to_node_map[]; - -/* Returns the number of the node containing CPU 'cpu' */ -static inline int __cpu_to_node (int cpu) -{ -return cpu_to_node_map[cpu]; -} -#define early_cpu_to_node __cpu_to_node -#define cpu_to_node __cpu_to_node - -#else /* CONFIG_X86_64 */ -/* Mappings between logical cpu number and node number */ DECLARE_EARLY_PER_CPU (int, x86_cpu_to_node_map);
@@ -84,8 +69,6 @@ static inline int early_cpu_to_node(int cpu)#endif /* !CONFIG_DEBUG_PER_CPU_MAPS */ -#endif /* CONFIG_X86_64 */ -/* Mappings between node number and cpus on that node. */ extern cpumask_var_t node_to_cpumask_map[MAX_NUMNODES ];
arch/x86/kernel/acpi/boot.c +0 -5
@@ -590,12 +590,7 @@ static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)if (nid ==-1 || !node_online (nid))return ;set_apicid_to_node (physid, nid); -#ifdef CONFIG_X86_64 numa_set_node (cpu, nid); -#else /* CONFIG_X86_32 */ - cpu_to_node_map[cpu] = nid; -#endif -#endif }
arch/x86/kernel/cpu/amd.c +2 -2
@@ -233,7 +233,7 @@ static void __cpuinit init_amd_k7(struct cpuinfo_x86 *c) }#endif -#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_64 ) +#ifdef CONFIG_NUMA /* * To workaround broken NUMA config. Read the comment in * srat_detect_node().
@@ -338,7 +338,7 @@ EXPORT_SYMBOL_GPL(amd_get_nb_id);static void __cpuinit srat_detect_node (struct cpuinfo_x86 *c) { -#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_64 ) +#ifdef CONFIG_NUMA int cpu =smp_processor_id ();int node;unsigned apicid = c->apicid;
arch/x86/kernel/cpu/intel.c +1 -1
@@ -276,7 +276,7 @@ static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c)static void __cpuinit srat_detect_node (struct cpuinfo_x86 *c) { -#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_64 ) +#ifdef CONFIG_NUMA unsigned node;int cpu =smp_processor_id ();
arch/x86/kernel/setup_percpu.c +2 -2
@@ -233,6 +233,7 @@ void __init setup_per_cpu_areas(void)per_cpu (irq_stack_ptr, cpu) =per_cpu (irq_stack_union.irq_stack, cpu) +IRQ_STACK_SIZE -64 ; +#endif #ifdef CONFIG_NUMA per_cpu (x86_cpu_to_node_map, cpu) =early_per_cpu_map (x86_cpu_to_node_map, cpu);
@@ -246,7 +247,6 @@ void __init setup_per_cpu_areas(void)*/ set_cpu_numa_node (cpu,early_cpu_to_node (cpu));#endif -#endif /* * Up to this point, the boot CPU has been using .init.data * area. Reload any changed state for the boot CPU.
@@ -263,7 +263,7 @@ void __init setup_per_cpu_areas(void)#ifdef CONFIG_X86_32 early_per_cpu_ptr (x86_cpu_to_logical_apicid) =NULL ;#endif -#if defined(CONFIG_X86_64 ) && defined(CONFIG_NUMA ) +#ifdef CONFIG_NUMA early_per_cpu_ptr (x86_cpu_to_node_map) =NULL ;#endif
arch/x86/kernel/smpboot.c +0 -6
@@ -133,16 +133,11 @@ EXPORT_PER_CPU_SYMBOL(cpu_info);atomic_t init_deasserted;#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_32 ) -/* which node each logical CPU is on */ -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. */ static void map_cpu_to_node (int cpu,int node) {printk (KERN_INFO "Mapping cpu %d to node %d\n" , cpu, node);cpumask_set_cpu (cpu, node_to_cpumask_map[node]); - cpu_to_node_map[cpu] = node; }/* undo a mapping between cpu and node. */
@@ -153,7 +148,6 @@ static void unmap_cpu_to_node(int cpu)printk (KERN_INFO "Unmapping cpu %d from all nodes\n" , cpu);for (node =0 ; node <MAX_NUMNODES ; node++) cpumask_clear_cpu(cpu, node_to_cpumask_map[node]); - cpu_to_node_map[cpu] = 0; }#else /* !(CONFIG_NUMA && CONFIG_X86_32) */ #define map_cpu_to_node (cpu, node) ({})
arch/x86/mm/numa.c +71 -1
87 lines not on this page · raw message
arch/x86/mm/numa_64.c +0 -65
83 lines not on this page · raw message
Signature · 1 line
1.7.1
[tip:x86/numa] x86: Unify CPU -> NUMA node mapping between 32 and 64bit
Commit-ID: 645a79195f66eb68ef3ab2b21d9829ac3aa085a9 Gitweb: http://git.kernel.org/tip/645a79195f66eb68ef3ab2b21d9829ac3aa085a9 Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:40 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:09 +0100
x86: Unify CPU -> NUMA node mapping between 32 and 64bit
Unlike 64bit, 32bit has been using its own cpu_to_node_map[] for CPU -> NUMA node mapping. Replace it with early_percpu variable x86_cpu_to_node_map and share the mapping code with 64bit.
* USE_PERCPU_NUMA_NODE_ID is now enabled for 32bit too.
* x86_cpu_to_node_map and numa_set/clear_node() are moved from numa_64 to numa. For now, on 32bit, x86_cpu_to_node_map is initialized with 0 instead of NUMA_NO_NODE. This is to avoid introducing unexpected behavior change and will be updated once init path is unified.
* srat_detect_node() is now enabled for x86_32 too. It calls numa_set_node() and initializes the mapping making explicit cpu_to_node_map[] updates from map/unmap_cpu_to_node() unnecessary.
LKML-Reference: <[email protected]>
--- arch/x86/Kconfig | 2 +- arch/x86/include/asm/numa.h | 8 ++++ arch/x86/include/asm/numa_64.h | 4 -- arch/x86/include/asm/topology.h | 17 --------- arch/x86/kernel/acpi/boot.c | 5 --- arch/x86/kernel/cpu/amd.c | 4 +- arch/x86/kernel/cpu/intel.c | 2 +- arch/x86/kernel/setup_percpu.c | 4 +- arch/x86/kernel/smpboot.c | 6 --- arch/x86/mm/numa.c | 72 ++++++++++++++++++++++++++++++++++++++- arch/x86/mm/numa_64.c | 65 ----------------------------------- 11 files changed, 85 insertions(+), 104 deletions(-)
arch/x86/Kconfig +1 -1
@@ -1705,7 +1705,7 @@ config HAVE_ARCH_EARLY_PFN_TO_NID depends on NUMA config USE_PERCPU_NUMA_NODE_ID - def_bool X86_64 + def_bool y depends on NUMA menu "Power management and ACPI options"
arch/x86/include/asm/numa.h +8 -0
@@ -30,4 +30,12 @@ static inline void set_apicid_to_node(int apicid, s16 node)# include "numa_64.h" #endif +#ifdef CONFIG_NUMA +extern void __cpuinit numa_set_node (int cpu,int node); +extern void __cpuinit numa_clear_node (int cpu); +#else /* CONFIG_NUMA */ +static inline void numa_set_node (int cpu,int node) { } +static inline void numa_clear_node (int cpu) { } +#endif /* CONFIG_NUMA */ +#endif /* _ASM_X86_NUMA_H */
arch/x86/include/asm/numa_64.h +0 -4
@@ -30,8 +30,6 @@ extern void setup_node_bootmem(int nodeid, unsigned long start,extern void __init init_cpu_to_node (void );extern int __cpuinit numa_cpu_node (int cpu); -extern void __cpuinit numa_set_node (int cpu,int node); -extern void __cpuinit numa_clear_node (int cpu);extern void __cpuinit numa_add_cpu (int cpu);extern void __cpuinit numa_remove_cpu (int cpu);
@@ -43,8 +41,6 @@ void numa_emu_cmdline(char *);#else static inline void init_cpu_to_node (void ) { }static inline int numa_cpu_node (int cpu) {return NUMA_NO_NODE ; } -static inline void numa_set_node (int cpu,int node) { } -static inline void numa_clear_node (int cpu) { }static inline void numa_add_cpu (int cpu,int node) { }static inline void numa_remove_cpu (int cpu) { }#endif
arch/x86/include/asm/topology.h +0 -17
@@ -47,21 +47,6 @@#include <asm/mpspec.h> -#ifdef CONFIG_X86_32 - -/* Mappings between logical cpu number and node number */ -extern int cpu_to_node_map[]; - -/* Returns the number of the node containing CPU 'cpu' */ -static inline int __cpu_to_node (int cpu) -{ -return cpu_to_node_map[cpu]; -} -#define early_cpu_to_node __cpu_to_node -#define cpu_to_node __cpu_to_node - -#else /* CONFIG_X86_64 */ -/* Mappings between logical cpu number and node number */ DECLARE_EARLY_PER_CPU (int, x86_cpu_to_node_map);
@@ -84,8 +69,6 @@ static inline int early_cpu_to_node(int cpu)#endif /* !CONFIG_DEBUG_PER_CPU_MAPS */ -#endif /* CONFIG_X86_64 */ -/* Mappings between node number and cpus on that node. */ extern cpumask_var_t node_to_cpumask_map[MAX_NUMNODES ];
arch/x86/kernel/acpi/boot.c +0 -5
@@ -590,12 +590,7 @@ static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)if (nid ==-1 || !node_online (nid))return ;set_apicid_to_node (physid, nid); -#ifdef CONFIG_X86_64 numa_set_node (cpu, nid); -#else /* CONFIG_X86_32 */ - cpu_to_node_map[cpu] = nid; -#endif -#endif }
arch/x86/kernel/cpu/amd.c +2 -2
@@ -233,7 +233,7 @@ static void __cpuinit init_amd_k7(struct cpuinfo_x86 *c) }#endif -#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_64 ) +#ifdef CONFIG_NUMA /* * To workaround broken NUMA config. Read the comment in * srat_detect_node().
@@ -338,7 +338,7 @@ EXPORT_SYMBOL_GPL(amd_get_nb_id);static void __cpuinit srat_detect_node (struct cpuinfo_x86 *c) { -#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_64 ) +#ifdef CONFIG_NUMA int cpu =smp_processor_id ();int node;unsigned apicid = c->apicid;
arch/x86/kernel/cpu/intel.c +1 -1
@@ -276,7 +276,7 @@ static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c)static void __cpuinit srat_detect_node (struct cpuinfo_x86 *c) { -#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_64 ) +#ifdef CONFIG_NUMA unsigned node;int cpu =smp_processor_id ();
arch/x86/kernel/setup_percpu.c +2 -2
@@ -233,6 +233,7 @@ void __init setup_per_cpu_areas(void)per_cpu (irq_stack_ptr, cpu) =per_cpu (irq_stack_union.irq_stack, cpu) +IRQ_STACK_SIZE -64 ; +#endif #ifdef CONFIG_NUMA per_cpu (x86_cpu_to_node_map, cpu) =early_per_cpu_map (x86_cpu_to_node_map, cpu);
@@ -246,7 +247,6 @@ void __init setup_per_cpu_areas(void)*/ set_cpu_numa_node (cpu,early_cpu_to_node (cpu));#endif -#endif /* * Up to this point, the boot CPU has been using .init.data * area. Reload any changed state for the boot CPU.
@@ -263,7 +263,7 @@ void __init setup_per_cpu_areas(void)#ifdef CONFIG_X86_32 early_per_cpu_ptr (x86_cpu_to_logical_apicid) =NULL ;#endif -#if defined(CONFIG_X86_64 ) && defined(CONFIG_NUMA ) +#ifdef CONFIG_NUMA early_per_cpu_ptr (x86_cpu_to_node_map) =NULL ;#endif
arch/x86/kernel/smpboot.c +0 -6
@@ -133,16 +133,11 @@ EXPORT_PER_CPU_SYMBOL(cpu_info);atomic_t init_deasserted;#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_32 ) -/* which node each logical CPU is on */ -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. */ static void map_cpu_to_node (int cpu,int node) {printk (KERN_INFO "Mapping cpu %d to node %d\n" , cpu, node);cpumask_set_cpu (cpu, node_to_cpumask_map[node]); - cpu_to_node_map[cpu] = node; }/* undo a mapping between cpu and node. */
@@ -153,7 +148,6 @@ static void unmap_cpu_to_node(int cpu)printk (KERN_INFO "Unmapping cpu %d from all nodes\n" , cpu);for (node =0 ; node <MAX_NUMNODES ; node++) cpumask_clear_cpu(cpu, node_to_cpumask_map[node]); - cpu_to_node_map[cpu] = 0; }#else /* !(CONFIG_NUMA && CONFIG_X86_32) */ #define map_cpu_to_node (cpu, node) ({})
arch/x86/mm/numa.c +71 -1
87 lines not on this page · raw message
arch/x86/mm/numa_64.c +0 -65
83 lines not on this page · raw message
PATCH 15/16 x86: Unify node_to_cpumask_map handling between 32 and 64bit
In reply to Tejun Heox86_32 has been managing node_to_cpumask_map explicitly from map_cpu_to_node() and friends in a rather ugly way. With previous changes, it's now possible to share the code with 64bit.
* When CONFIG_NUMA_EMU is disabled, numa_add/remove_cpu() are implemented in numa.c and shared by 32 and 64bit. CONFIG_NUMA_EMU versions still live in numa_64.c.
NUMA_EMU's dependency on 64bit is planned to be removed and the above should go away together.
* identify_cpu() now calls numa_add_cpu() for 32bit too. This makes the explicit mask management from map_cpu_to_node() unnecessary.
* The whole x86_32 specific map_cpu_to_node() chunk is no longer necessary. Dropped.
--- arch/x86/include/asm/numa.h | 9 +++++ arch/x86/include/asm/numa_32.h | 1 - arch/x86/include/asm/numa_64.h | 4 -- arch/x86/kernel/cpu/common.c | 2 +- arch/x86/kernel/smpboot.c | 47 ------------------------- arch/x86/mm/numa.c | 64 +++++++++++++++++++++++++++++++++- arch/x86/mm/numa_64.c | 75 ++++++++-------------------------------- 7 files changed, 87 insertions(+), 115 deletions(-)
arch/x86/include/asm/numa.h +9 -0
@@ -1,6 +1,7 @@#ifndef _ASM_X86_NUMA_H#define _ASM_X86_NUMA_H +#include <asm/topology.h> #include <asm/apicdef.h> #ifdef CONFIG_NUMA
@@ -33,9 +34,17 @@ static inline void set_apicid_to_node(int apicid, s16 node)#ifdef CONFIG_NUMA extern void __cpuinit numa_set_node (int cpu,int node);extern void __cpuinit numa_clear_node (int cpu); +extern void __cpuinit numa_add_cpu (int cpu); +extern void __cpuinit numa_remove_cpu (int cpu);#else /* CONFIG_NUMA */ static inline void numa_set_node (int cpu,int node) { }static inline void numa_clear_node (int cpu) { } +static inline void numa_add_cpu (int cpu) { } +static inline void numa_remove_cpu (int cpu) { }#endif /* CONFIG_NUMA */ +#ifdef CONFIG_DEBUG_PER_CPU_MAPS +struct cpumask __cpuinit *debug_cpumask_set_cpu (int cpu,int enable); +#endif +#endif /* _ASM_X86_NUMA_H */
arch/x86/include/asm/numa_32.h +0 -1
@@ -4,7 +4,6 @@extern int numa_off;extern int pxm_to_nid (int pxm); -extern void numa_remove_cpu (int cpu);#ifdef CONFIG_NUMA extern int __cpuinit numa_cpu_node (int apicid);
arch/x86/include/asm/numa_64.h +0 -4
@@ -30,8 +30,6 @@ extern void setup_node_bootmem(int nodeid, unsigned long start,extern void __init init_cpu_to_node (void );extern int __cpuinit numa_cpu_node (int cpu); -extern void __cpuinit numa_add_cpu (int cpu); -extern void __cpuinit numa_remove_cpu (int cpu);#ifdef CONFIG_NUMA_EMU #define FAKE_NODE_MIN_SIZE ((u64)32 << 20)
@@ -41,8 +39,6 @@ void numa_emu_cmdline(char *);#else static inline void init_cpu_to_node (void ) { }static inline int numa_cpu_node (int cpu) {return NUMA_NO_NODE ; } -static inline void numa_add_cpu (int cpu,int node) { } -static inline void numa_remove_cpu (int cpu) { }#endif #endif /* _ASM_X86_NUMA_64_H */
arch/x86/kernel/cpu/common.c +1 -1
@@ -869,7 +869,7 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c)select_idle_routine (c); -#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_64 ) +#ifdef CONFIG_NUMA numa_add_cpu (smp_processor_id ());#endif }
arch/x86/kernel/smpboot.c +0 -47
71 lines not on this page · raw message
arch/x86/mm/numa.c +62 -2
79 lines not on this page · raw message
arch/x86/mm/numa_64.c +15 -60
96 lines not on this page · raw message
Signature · 1 line
1.7.1
[tip:x86/numa] x86: Unify node_to_cpumask_map handling between 32 and 64bit
Commit-ID: de2d9445f1627830ed2ebd00ee9d851986c940b5 Gitweb: http://git.kernel.org/tip/de2d9445f1627830ed2ebd00ee9d851986c940b5 Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:41 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:10 +0100
x86: Unify node_to_cpumask_map handling between 32 and 64bit
x86_32 has been managing node_to_cpumask_map explicitly from map_cpu_to_node() and friends in a rather ugly way. With previous changes, it's now possible to share the code with 64bit.
* When CONFIG_NUMA_EMU is disabled, numa_add/remove_cpu() are implemented in numa.c and shared by 32 and 64bit. CONFIG_NUMA_EMU versions still live in numa_64.c.
NUMA_EMU's dependency on 64bit is planned to be removed and the above should go away together.
* identify_cpu() now calls numa_add_cpu() for 32bit too. This makes the explicit mask management from map_cpu_to_node() unnecessary.
* The whole x86_32 specific map_cpu_to_node() chunk is no longer necessary. Dropped.
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/numa.h | 9 +++++ arch/x86/include/asm/numa_32.h | 1 - arch/x86/include/asm/numa_64.h | 4 -- arch/x86/kernel/cpu/common.c | 2 +- arch/x86/kernel/smpboot.c | 47 ------------------------- arch/x86/mm/numa.c | 64 +++++++++++++++++++++++++++++++++- arch/x86/mm/numa_64.c | 75 ++++++++-------------------------------- 7 files changed, 87 insertions(+), 115 deletions(-)
arch/x86/include/asm/numa.h +9 -0
@@ -1,6 +1,7 @@#ifndef _ASM_X86_NUMA_H#define _ASM_X86_NUMA_H +#include <asm/topology.h> #include <asm/apicdef.h> #ifdef CONFIG_NUMA
@@ -33,9 +34,17 @@ static inline void set_apicid_to_node(int apicid, s16 node)#ifdef CONFIG_NUMA extern void __cpuinit numa_set_node (int cpu,int node);extern void __cpuinit numa_clear_node (int cpu); +extern void __cpuinit numa_add_cpu (int cpu); +extern void __cpuinit numa_remove_cpu (int cpu);#else /* CONFIG_NUMA */ static inline void numa_set_node (int cpu,int node) { }static inline void numa_clear_node (int cpu) { } +static inline void numa_add_cpu (int cpu) { } +static inline void numa_remove_cpu (int cpu) { }#endif /* CONFIG_NUMA */ +#ifdef CONFIG_DEBUG_PER_CPU_MAPS +struct cpumask __cpuinit *debug_cpumask_set_cpu (int cpu,int enable); +#endif +#endif /* _ASM_X86_NUMA_H */
arch/x86/include/asm/numa_32.h +0 -1
@@ -4,7 +4,6 @@extern int numa_off;extern int pxm_to_nid (int pxm); -extern void numa_remove_cpu (int cpu);#ifdef CONFIG_NUMA extern int __cpuinit numa_cpu_node (int apicid);
arch/x86/include/asm/numa_64.h +0 -4
@@ -30,8 +30,6 @@ extern void setup_node_bootmem(int nodeid, unsigned long start,extern void __init init_cpu_to_node (void );extern int __cpuinit numa_cpu_node (int cpu); -extern void __cpuinit numa_add_cpu (int cpu); -extern void __cpuinit numa_remove_cpu (int cpu);#ifdef CONFIG_NUMA_EMU #define FAKE_NODE_MIN_SIZE ((u64)32 << 20)
@@ -41,8 +39,6 @@ void numa_emu_cmdline(char *);#else static inline void init_cpu_to_node (void ) { }static inline int numa_cpu_node (int cpu) {return NUMA_NO_NODE ; } -static inline void numa_add_cpu (int cpu,int node) { } -static inline void numa_remove_cpu (int cpu) { }#endif #endif /* _ASM_X86_NUMA_64_H */
arch/x86/kernel/cpu/common.c +1 -1
@@ -869,7 +869,7 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c)select_idle_routine (c); -#if defined(CONFIG_NUMA ) && defined(CONFIG_X86_64 ) +#ifdef CONFIG_NUMA numa_add_cpu (smp_processor_id ());#endif }
arch/x86/kernel/smpboot.c +0 -47
71 lines not on this page · raw message
arch/x86/mm/numa.c +62 -2
79 lines not on this page · raw message
arch/x86/mm/numa_64.c +15 -60
96 lines not on this page · raw message
PATCH 16/16 x86: Unify NUMA initialization between 32 and 64bit
In reply to Tejun HeoNow that everything else is unified, NUMA initialization can be unified too.
* numa_init_array() and init_cpu_to_node() are moved from numa_64 to numa.
* numa_32::initmem_init() is updated to call numa_init_array() and setup_arch() to call init_cpu_to_node() on 32bit too.
* x86_cpu_to_node_map is now initialized to NUMA_NO_NODE on 32bit too. This is safe now as numa_init_array() will initialize it early during boot.
This makes NUMA mapping fully initialized before setup_per_cpu_areas() on 32bit too and thus makes the first percpu chunk which contains all the static variables and some of dynamic area allocated with NUMA affinity correctly considered.
--- arch/x86/include/asm/numa.h | 4 ++ arch/x86/include/asm/numa_64.h | 3 -- arch/x86/kernel/setup.c | 2 - arch/x86/mm/numa.c | 76 +++++++++++++++++++++++++++++++++++++-- arch/x86/mm/numa_32.c | 1 + arch/x86/mm/numa_64.c | 75 --------------------------------------- 6 files changed, 77 insertions(+), 84 deletions(-)
arch/x86/include/asm/numa.h +4 -0
@@ -34,11 +34,15 @@ static inline void set_apicid_to_node(int apicid, s16 node)#ifdef CONFIG_NUMA extern void __cpuinit numa_set_node (int cpu,int node);extern void __cpuinit numa_clear_node (int cpu); +extern void __init numa_init_array (void ); +extern void __init init_cpu_to_node (void );extern void __cpuinit numa_add_cpu (int cpu);extern void __cpuinit numa_remove_cpu (int cpu);#else /* CONFIG_NUMA */ static inline void numa_set_node (int cpu,int node) { }static inline void numa_clear_node (int cpu) { } +static inline void numa_init_array (void ) { } +static inline void init_cpu_to_node (void ) { }static inline void numa_add_cpu (int cpu) { }static inline void numa_remove_cpu (int cpu) { }#endif /* CONFIG_NUMA */
arch/x86/include/asm/numa_64.h +0 -3
@@ -13,7 +13,6 @@ extern int compute_hash_shift(struct bootnode *nodes, int numblks,#define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT)) -extern void numa_init_array (void );extern int numa_off;extern unsigned long numa_free_all_bootmem (void );
@@ -28,7 +27,6 @@ extern void setup_node_bootmem(int nodeid, unsigned long start,*/ #define NODE_MIN_SIZE (4*1024*1024) -extern void __init init_cpu_to_node (void );extern int __cpuinit numa_cpu_node (int cpu);#ifdef CONFIG_NUMA_EMU
@@ -37,7 +35,6 @@ extern int __cpuinit numa_cpu_node(int cpu);void numa_emu_cmdline (char *);#endif /* CONFIG_NUMA_EMU */ #else -static inline void init_cpu_to_node (void ) { }static inline int numa_cpu_node (int cpu) {return NUMA_NO_NODE ; }#endif
arch/x86/kernel/setup.c +0 -2
@@ -1040,9 +1040,7 @@ void __init setup_arch(char **cmdline_p)prefill_possible_map (); -#ifdef CONFIG_X86_64 init_cpu_to_node (); -#endif init_apic_mappings ();ioapic_and_gsi_init ();
arch/x86/mm/numa.c +72 -4
89 lines not on this page · raw message
arch/x86/mm/numa_32.c +1 -0
@@ -367,6 +367,7 @@ void __init initmem_init(unsigned long start_pfn, unsigned long end_pfn,*/ get_memcfg_numa (); +numa_init_array (); kva_pages =roundup (calculate_numa_remap_pages (),PTRS_PER_PTE );
arch/x86/mm/numa_64.c +0 -75
87 lines not on this page · raw message
Signature · 1 line
1.7.1
[tip:x86/numa] x86: Unify NUMA initialization between 32 and 64bit
Commit-ID: 8db78cc4b4048e3add40bca1bc3e55057c319256 Gitweb: http://git.kernel.org/tip/8db78cc4b4048e3add40bca1bc3e55057c319256 Author: Tejun Heo <[email protected]> AuthorDate: Sun, 23 Jan 2011 14:37:42 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 14:54:10 +0100
x86: Unify NUMA initialization between 32 and 64bit
Now that everything else is unified, NUMA initialization can be unified too.
* numa_init_array() and init_cpu_to_node() are moved from numa_64 to numa.
* numa_32::initmem_init() is updated to call numa_init_array() and setup_arch() to call init_cpu_to_node() on 32bit too.
* x86_cpu_to_node_map is now initialized to NUMA_NO_NODE on 32bit too. This is safe now as numa_init_array() will initialize it early during boot.
This makes NUMA mapping fully initialized before setup_per_cpu_areas() on 32bit too and thus makes the first percpu chunk which contains all the static variables and some of dynamic area allocated with NUMA affinity correctly considered.
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/numa.h | 4 ++ arch/x86/include/asm/numa_64.h | 3 -- arch/x86/kernel/setup.c | 2 - arch/x86/mm/numa.c | 76 +++++++++++++++++++++++++++++++++++++-- arch/x86/mm/numa_32.c | 1 + arch/x86/mm/numa_64.c | 75 --------------------------------------- 6 files changed, 77 insertions(+), 84 deletions(-)
arch/x86/include/asm/numa.h +4 -0
@@ -34,11 +34,15 @@ static inline void set_apicid_to_node(int apicid, s16 node)#ifdef CONFIG_NUMA extern void __cpuinit numa_set_node (int cpu,int node);extern void __cpuinit numa_clear_node (int cpu); +extern void __init numa_init_array (void ); +extern void __init init_cpu_to_node (void );extern void __cpuinit numa_add_cpu (int cpu);extern void __cpuinit numa_remove_cpu (int cpu);#else /* CONFIG_NUMA */ static inline void numa_set_node (int cpu,int node) { }static inline void numa_clear_node (int cpu) { } +static inline void numa_init_array (void ) { } +static inline void init_cpu_to_node (void ) { }static inline void numa_add_cpu (int cpu) { }static inline void numa_remove_cpu (int cpu) { }#endif /* CONFIG_NUMA */
arch/x86/include/asm/numa_64.h +0 -3
@@ -13,7 +13,6 @@ extern int compute_hash_shift(struct bootnode *nodes, int numblks,#define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT)) -extern void numa_init_array (void );extern int numa_off;extern unsigned long numa_free_all_bootmem (void );
@@ -28,7 +27,6 @@ extern void setup_node_bootmem(int nodeid, unsigned long start,*/ #define NODE_MIN_SIZE (4*1024*1024) -extern void __init init_cpu_to_node (void );extern int __cpuinit numa_cpu_node (int cpu);#ifdef CONFIG_NUMA_EMU
@@ -37,7 +35,6 @@ extern int __cpuinit numa_cpu_node(int cpu);void numa_emu_cmdline (char *);#endif /* CONFIG_NUMA_EMU */ #else -static inline void init_cpu_to_node (void ) { }static inline int numa_cpu_node (int cpu) {return NUMA_NO_NODE ; }#endif
arch/x86/kernel/setup.c +0 -2
@@ -1040,9 +1040,7 @@ void __init setup_arch(char **cmdline_p)prefill_possible_map (); -#ifdef CONFIG_X86_64 init_cpu_to_node (); -#endif init_apic_mappings ();ioapic_and_gsi_init ();
arch/x86/mm/numa.c +72 -4
89 lines not on this page · raw message
arch/x86/mm/numa_32.c +1 -0
@@ -367,6 +367,7 @@ void __init initmem_init(unsigned long start_pfn, unsigned long end_pfn,*/ get_memcfg_numa (); +numa_init_array (); kva_pages =roundup (calculate_numa_remap_pages (),PTRS_PER_PTE );
arch/x86/mm/numa_64.c +0 -75
87 lines not on this page · raw message
Quoted 2 lines · Tejun Heo
This is the fifth take of unify-x86_32-and-64-NUMA-init-paths patchset.
hpa, ping?
Thanks.
Signature · 1 line
tejun
there's a new build failure caused by this patch-set:
arch/x86/kernel/apic/ipi.c:76: error: 'x86_cpu_to_logical_apicid' undeclared (first use in this function) arch/x86/kernel/apic/ipi.c:76: error: (Each undeclared identifier is reported only once arch/x86/kernel/apic/ipi.c:76: error: for each function it appears in.) arch/x86/kernel/apic/ipi.c:95: error: 'x86_cpu_to_logical_apicid' undeclared (first use in this function)
from include/linux/interrupt.h:13,arch/x86/kernel/apic/apic.c:1257: error: 'x86_cpu_to_logical_apicid' undeclared (first use in this function) arch/x86/kernel/apic/apic.c:1257: error: (Each undeclared identifier is reported only once arch/x86/kernel/apic/apic.c:1257: error: for each function it appears in.) arch/x86/kernel/apic/apic.c:2000: error: 'x86_cpu_to_logical_apicid' undeclared (first use in this function)
from include/linux/interrupt.h:13,
Config attached.
Thanks,
Ingo
#
# Automatically generated make config: don't edit
# Linux/i386 2.6.38-rc2 Kernel Configuration
# Fri Jan 28 17:08:51 2011
#
# CONFIG_64BIT is not setCONFIG_X86_32=y
# CONFIG_X86_64 is not setCONFIG_X86=yCONFIG_INSTRUCTION_DECODER=y CONFIG_OUTPUT_FORMAT="elf32-i386" CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig" CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_CLOCKSOURCE_WATCHDOG=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_LOCKDEP_SUPPORT=yCONFIG_STACKTRACE_SUPPORT=y CONFIG_HAVE_LATENCYTOP_SUPPORT=yCONFIG_MMU=yCONFIG_ZONE_DMA=yCONFIG_NEED_DMA_MAP_STATE=y CONFIG_NEED_SG_DMA_LENGTH=yCONFIG_GENERIC_ISA_DMA=yCONFIG_GENERIC_IOMAP=yCONFIG_GENERIC_HWEIGHT=yCONFIG_GENERIC_GPIO=yCONFIG_ARCH_MAY_HAVE_PC_FDC=y
# CONFIG_RWSEM_GENERIC_SPINLOCK is not set CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y CONFIG_GENERIC_CALIBRATE_DELAY=y
# CONFIG_GENERIC_TIME_VSYSCALL is not set CONFIG_ARCH_HAS_CPU_RELAX=y CONFIG_ARCH_HAS_DEFAULT_IDLE=y CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_HAVE_SETUP_PER_CPU_AREA=y CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
# CONFIG_HAVE_CPUMASK_OF_CPU_MAP is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y
# CONFIG_ZONE_DMA32 is not set CONFIG_ARCH_POPULATES_NODE_MAP=y
# CONFIG_AUDIT_ARCH is not set CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-ecx -fcall-saved-edx" CONFIG_KTIME_SCALAR=y CONFIG_BOOTPARAM_SUPPORT_NOT_WANTED=y CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_CONSTRUCTORS=yCONFIG_HAVE_IRQ_WORK=yCONFIG_IRQ_WORK=y
#
# General setup
#CONFIG_EXPERIMENTAL=yCONFIG_BROKEN_BOOT_ALLOWED4=y
# CONFIG_BROKEN_BOOT_ALLOWED3 is not setCONFIG_BROKEN_BOOT_EUROPE=yCONFIG_BROKEN_BOOT_TITAN=yCONFIG_BROKEN_ON_SMP=yCONFIG_INIT_ENV_ARG_LIMIT=32CONFIG_CROSS_COMPILE=""CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not setCONFIG_HAVE_KERNEL_GZIP=yCONFIG_HAVE_KERNEL_BZIP2=yCONFIG_HAVE_KERNEL_LZMA=yCONFIG_HAVE_KERNEL_XZ=yCONFIG_HAVE_KERNEL_LZO=yCONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
# CONFIG_SWAP is not set
# CONFIG_SYSVIPC is not set
# CONFIG_POSIX_MQUEUE is not setCONFIG_BSD_PROCESS_ACCT=yCONFIG_BSD_PROCESS_ACCT_V3=y
# CONFIG_TASKSTATS is not set
# CONFIG_AUDIT is not setCONFIG_HAVE_GENERIC_HARDIRQS=y
#
# IRQ subsystem
#CONFIG_GENERIC_HARDIRQS=y
# CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED is not set CONFIG_HAVE_SPARSE_IRQ=y CONFIG_GENERIC_IRQ_PROBE=y
# CONFIG_GENERIC_PENDING_IRQ is not set
# CONFIG_AUTO_IRQ_AFFINITY is not set
# CONFIG_IRQ_PER_CPU is not set
# CONFIG_HARDIRQS_SW_RESEND is not set CONFIG_SPARSE_IRQ=y
#
# RCU Subsystem
#CONFIG_TINY_RCU=y
# CONFIG_PREEMPT_RCU is not setCONFIG_RCU_TRACE=y
# CONFIG_TREE_RCU_TRACE is not set
# CONFIG_IKCONFIG is not setCONFIG_LOG_BUF_SHIFT=20CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=yCONFIG_CGROUPS=yCONFIG_CGROUP_DEBUG=y
# CONFIG_CGROUP_NS is not setCONFIG_CGROUP_FREEZER=y
# CONFIG_CGROUP_DEVICE is not set
# CONFIG_CPUSETS is not set
# CONFIG_CGROUP_CPUACCT is not setCONFIG_RESOURCE_COUNTERS=y
# CONFIG_CGROUP_MEM_RES_CTLR is not setCONFIG_CGROUP_SCHED=yCONFIG_FAIR_GROUP_SCHED=yCONFIG_RT_GROUP_SCHED=y
# CONFIG_BLK_CGROUP is not set
# CONFIG_NAMESPACES is not setCONFIG_SCHED_AUTOGROUP=yCONFIG_SYSFS_DEPRECATED=yCONFIG_SYSFS_DEPRECATED_V2=y
# CONFIG_RELAY is not setCONFIG_BLK_DEV_INITRD=yCONFIG_INITRAMFS_SOURCE=""
# CONFIG_RD_GZIP is not set
# CONFIG_RD_BZIP2 is not set
# CONFIG_RD_LZMA is not setCONFIG_RD_XZ=y
# CONFIG_RD_LZO is not set
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not setCONFIG_ANON_INODES=yCONFIG_EXPERT=yCONFIG_EMBEDDED=y
# CONFIG_UID16 is not setCONFIG_KALLSYMS=yCONFIG_KALLSYMS_ALL=yCONFIG_KALLSYMS_EXTRA_PASS=yCONFIG_HOTPLUG=yCONFIG_PRINTK=y
# CONFIG_BUG is not set
# CONFIG_ELF_CORE is not setCONFIG_PCSPKR_PLATFORM=yCONFIG_BASE_FULL=yCONFIG_FUTEX=y
# CONFIG_EPOLL is not setCONFIG_SIGNALFD=y
# CONFIG_TIMERFD is not setCONFIG_EVENTFD=y
# CONFIG_SHMEM is not set
# CONFIG_AIO is not setCONFIG_HAVE_PERF_EVENTS=yCONFIG_PERF_USE_VMALLOC=y
#
# Kernel Performance Events And Counters
#CONFIG_PERF_EVENTS=yCONFIG_PERF_COUNTERS=yCONFIG_DEBUG_PERF_USE_VMALLOC=yCONFIG_VM_EVENT_COUNTERS=y
# CONFIG_PCI_QUIRKS is not setCONFIG_SLUB_DEBUG=yCONFIG_COMPAT_BRK=y
# CONFIG_SLAB is not setCONFIG_SLUB=y
# CONFIG_SLOB is not set
# CONFIG_PROFILING is not setCONFIG_HAVE_OPROFILE=yCONFIG_JUMP_LABEL=yCONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=yCONFIG_HAVE_IOREMAP_PROT=yCONFIG_HAVE_KPROBES=yCONFIG_HAVE_KRETPROBES=yCONFIG_HAVE_OPTPROBES=yCONFIG_HAVE_ARCH_TRACEHOOK=yCONFIG_HAVE_DMA_ATTRS=yCONFIG_HAVE_REGS_AND_STACK_ACCESS_API=yCONFIG_HAVE_DMA_API_DEBUG=yCONFIG_HAVE_HW_BREAKPOINT=yCONFIG_HAVE_MIXED_BREAKPOINTS_REGS=yCONFIG_HAVE_USER_RETURN_NOTIFIER=yCONFIG_HAVE_PERF_EVENTS_NMI=yCONFIG_HAVE_ARCH_JUMP_LABEL=y
#
# GCOV-based kernel profiling
#CONFIG_HAVE_GENERIC_DMA_COHERENT=yCONFIG_SLABINFO=yCONFIG_RT_MUTEXES=yCONFIG_BASE_SMALL=0
# CONFIG_MODULES is not setCONFIG_BLOCK=yCONFIG_LBDAF=yCONFIG_BLK_DEV_BSG=y
# CONFIG_BLK_DEV_INTEGRITY is not set
#
# IO Schedulers
#CONFIG_IOSCHED_NOOP=y
# CONFIG_IOSCHED_DEADLINE is not set
# CONFIG_IOSCHED_CFQ is not set CONFIG_DEFAULT_NOOP=y CONFIG_DEFAULT_IOSCHED="noop"
# CONFIG_INLINE_SPIN_TRYLOCK is not set
# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set # CONFIG_INLINE_SPIN_LOCK is not set
# CONFIG_INLINE_SPIN_LOCK_BH is not set
# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set # CONFIG_INLINE_SPIN_UNLOCK is not set
# CONFIG_INLINE_SPIN_UNLOCK_BH is not set # CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set # CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set # CONFIG_INLINE_READ_TRYLOCK is not set
# CONFIG_INLINE_READ_LOCK is not set
# CONFIG_INLINE_READ_LOCK_BH is not set
# CONFIG_INLINE_READ_LOCK_IRQ is not set
# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set # CONFIG_INLINE_READ_UNLOCK is not set
# CONFIG_INLINE_READ_UNLOCK_BH is not set # CONFIG_INLINE_READ_UNLOCK_IRQ is not set # CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set # CONFIG_INLINE_WRITE_TRYLOCK is not set
# CONFIG_INLINE_WRITE_LOCK is not set
# CONFIG_INLINE_WRITE_LOCK_BH is not set
# CONFIG_INLINE_WRITE_LOCK_IRQ is not set # CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set # CONFIG_INLINE_WRITE_UNLOCK is not set
# CONFIG_INLINE_WRITE_UNLOCK_BH is not set # CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set # CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set # CONFIG_MUTEX_SPIN_ON_OWNER is not set CONFIG_FREEZER=y
#
# Processor type and features
#CONFIG_TICK_ONESHOT=y
# CONFIG_NO_HZ is not set CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
# CONFIG_SMP_SUPPORT is not set CONFIG_X86_MPPARSE=y CONFIG_X86_EXTENDED_PLATFORM=y CONFIG_X86_ELAN=y
# CONFIG_X86_MRST is not set CONFIG_X86_RDC321X=yCONFIG_X86_32_IRIS=y
# CONFIG_SCHED_OMIT_FRAME_POINTER is not set # CONFIG_PARAVIRT_GUEST is not set CONFIG_NO_BOOTMEM=y
# CONFIG_MEMTEST is not setCONFIG_X86_CPU=y CONFIG_X86_INTERNODE_CACHE_SHIFT=4 CONFIG_X86_CMPXCHG=yCONFIG_CMPXCHG_LOCAL=y CONFIG_X86_L1_CACHE_SHIFT=4 CONFIG_X86_XADD=yCONFIG_X86_WP_WORKS_OK=yCONFIG_X86_INVLPG=yCONFIG_X86_BSWAP=yCONFIG_X86_POPAD_OK=y CONFIG_X86_ALIGNMENT_16=y CONFIG_X86_MINIMUM_CPU_FAMILY=4 CONFIG_X86_DEBUGCTLMSR=y CONFIG_PROCESSOR_SELECT=y
# CONFIG_CPU_SUP_INTEL is not set CONFIG_CPU_SUP_CYRIX_32=y CONFIG_CPU_SUP_AMD=y
# CONFIG_CPU_SUP_CENTAUR is not set CONFIG_CPU_SUP_TRANSMETA_32=y CONFIG_CPU_SUP_UMC_32=y
# CONFIG_HPET_TIMER is not setCONFIG_DMI=y
# CONFIG_IOMMU_HELPER is not set
# CONFIG_IOMMU_API is not set CONFIG_NR_CPUS=1 CONFIG_IRQ_TIME_ACCOUNTING=y
# CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set CONFIG_X86_UP_APIC=yCONFIG_X86_UP_IOAPIC=y CONFIG_X86_LOCAL_APIC=yCONFIG_X86_IO_APIC=y
# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set # CONFIG_X86_MCE is not setCONFIG_VM86=yCONFIG_I8K=yCONFIG_X86_REBOOTFIXUPS=y
# CONFIG_MICROCODE is not set
# CONFIG_X86_MSR is not set
# CONFIG_X86_CPUID is not set CONFIG_UP_WANTED_1=yCONFIG_UP_WANTED_2=yCONFIG_UP_WANTED=y
# CONFIG_NOHIGHMEM is not set CONFIG_HIGHMEM4G=y
# CONFIG_HIGHMEM64G is not set
# CONFIG_VMSPLIT_3G is not set
# CONFIG_VMSPLIT_3G_OPT is not set CONFIG_VMSPLIT_2G=y
# CONFIG_VMSPLIT_2G_OPT is not set
# CONFIG_VMSPLIT_1G is not set CONFIG_PAGE_OFFSET=0x80000000 CONFIG_HIGHMEM=y
# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set CONFIG_ARCH_FLATMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0 CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y
# CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=yCONFIG_FLAT_NODE_MEM_MAP=y CONFIG_SPARSEMEM_STATIC=y CONFIG_HAVE_MEMBLOCK=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=999999
# CONFIG_COMPACTION is not set
# CONFIG_PHYS_ADDR_T_64BIT is not set CONFIG_ZONE_DMA_FLAG=1CONFIG_BOUNCE=yCONFIG_VIRT_TO_BUS=y
# CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
# CONFIG_TRANSPARENT_HUGEPAGE is not set CONFIG_NEED_PER_CPU_KM=yCONFIG_HIGHPTE=y
# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set CONFIG_X86_RESERVE_LOW=64
# CONFIG_MATH_EMULATION is not set CONFIG_MTRR=yCONFIG_MTRR_SANITIZER=y CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0 CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 # CONFIG_X86_PAT is not setCONFIG_SECCOMP=yCONFIG_CC_STACKPROTECTOR=yCONFIG_HZ_100=y
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not setCONFIG_HZ=100CONFIG_SCHED_HRTICK=y
# CONFIG_KEXEC is not set
# CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 CONFIG_RELOCATABLE=y CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000
# CONFIG_COMPAT_VDSO is not set
# CONFIG_CMDLINE_BOOL is not set CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
#
# Power management and ACPI options
#
# CONFIG_PM is not set
# CONFIG_SFI is not set
#
# CPU Frequency scaling
#CONFIG_CPU_FREQ=yCONFIG_CPU_FREQ_TABLE=y CONFIG_CPU_FREQ_DEBUG=y CONFIG_CPU_FREQ_STAT=y CONFIG_CPU_FREQ_STAT_DETAILS=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
#
# CPUFreq processor drivers
#
# CONFIG_ELAN_CPUFREQ is not setCONFIG_SC520_CPUFREQ=yCONFIG_X86_POWERNOW_K6=y
# CONFIG_X86_POWERNOW_K7 is not setCONFIG_X86_GX_SUSPMOD=y
# CONFIG_X86_SPEEDSTEP_CENTRINO is not setCONFIG_X86_SPEEDSTEP_ICH=yCONFIG_X86_SPEEDSTEP_SMI=yCONFIG_X86_P4_CLOCKMOD=yCONFIG_X86_CPUFREQ_NFORCE2=yCONFIG_X86_LONGRUN=y
# CONFIG_X86_E_POWERSAVER is not set
#
# shared options # CONFIG_X86_SPEEDSTEP_LIB=y # CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set CONFIG_CPU_IDLE=y CONFIG_CPU_IDLE_GOV_LADDER=y
#
# Bus options (PCI etc.)
#CONFIG_PCI=y
# CONFIG_PCI_GOBIOS is not set
# CONFIG_PCI_GOMMCONFIG is not set
# CONFIG_PCI_GODIRECT is not setCONFIG_PCI_GOANY=yCONFIG_PCI_BIOS=yCONFIG_PCI_DIRECT=yCONFIG_PCI_DOMAINS=yCONFIG_PCI_CNB20LE_QUIRK=yCONFIG_PCIEPORTBUS=yCONFIG_HOTPLUG_PCI_PCIE=y
# CONFIG_PCIEAER is not setCONFIG_PCIEASPM=y
# CONFIG_PCIEASPM_DEBUG is not setCONFIG_ARCH_SUPPORTS_MSI=y
# CONFIG_PCI_MSI is not set
# CONFIG_PCI_DEBUG is not set
# CONFIG_PCI_STUB is not setCONFIG_HT_IRQ=yCONFIG_PCI_IOV=yCONFIG_ISA_DMA_API=y
# CONFIG_ISA is not setCONFIG_MCA=yCONFIG_MCA_LEGACY=y
# CONFIG_MCA_PROC_FS is not set
# CONFIG_SCx200 is not set
# CONFIG_OLPC is not setCONFIG_OLPC_OPENFIRMWARE=yCONFIG_OLPC_OPENFIRMWARE_DT=yCONFIG_AMD_NB=yCONFIG_PCCARD=y
# CONFIG_PCMCIA is not setCONFIG_CARDBUS=y
#
# PC-card bridges
#CONFIG_YENTA=y
# CONFIG_YENTA_O2 is not set
# CONFIG_YENTA_RICOH is not setCONFIG_YENTA_TI=y
# CONFIG_YENTA_ENE_TUNE is not set
# CONFIG_YENTA_TOSHIBA is not setCONFIG_HOTPLUG_PCI=y
# CONFIG_HOTPLUG_PCI_FAKE is not setCONFIG_HOTPLUG_PCI_COMPAQ=yCONFIG_HOTPLUG_PCI_COMPAQ_NVRAM=yCONFIG_HOTPLUG_PCI_IBM=yCONFIG_HOTPLUG_PCI_CPCI=yCONFIG_HOTPLUG_PCI_CPCI_ZT5550=yCONFIG_HOTPLUG_PCI_CPCI_GENERIC=yCONFIG_HOTPLUG_PCI_SHPC=y
#
# Executable file formats / Emulations
#CONFIG_BINFMT_ELF=yCONFIG_HAVE_AOUT=yCONFIG_BINFMT_AOUT=yCONFIG_BINFMT_MISC=yCONFIG_HAVE_ATOMIC_IOMAP=yCONFIG_HAVE_TEXT_POKE_SMP=yCONFIG_NET=y
#
# Networking options
#CONFIG_PACKET=yCONFIG_UNIX=yCONFIG_XFRM=yCONFIG_XFRM_USER=y
# CONFIG_XFRM_SUB_POLICY is not set
# CONFIG_XFRM_MIGRATE is not setCONFIG_XFRM_STATISTICS=yCONFIG_XFRM_IPCOMP=y
# CONFIG_NET_KEY is not setCONFIG_INET=y
# CONFIG_IP_MULTICAST is not set
# CONFIG_IP_ADVANCED_ROUTER is not setCONFIG_IP_FIB_HASH=yCONFIG_IP_PNP=yCONFIG_IP_PNP_DHCP=yCONFIG_IP_PNP_BOOTP=yCONFIG_IP_PNP_RARP=yCONFIG_NET_IPIP=yCONFIG_NET_IPGRE_DEMUX=yCONFIG_NET_IPGRE=y
# CONFIG_ARPD is not setCONFIG_SYN_COOKIES=yCONFIG_INET_AH=y
# CONFIG_INET_ESP is not setCONFIG_INET_IPCOMP=yCONFIG_INET_XFRM_TUNNEL=yCONFIG_INET_TUNNEL=y
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
# CONFIG_INET_XFRM_MODE_BEET is not setCONFIG_INET_LRO=y
# CONFIG_INET_DIAG is not setCONFIG_TCP_CONG_ADVANCED=yCONFIG_TCP_CONG_BIC=yCONFIG_TCP_CONG_CUBIC=y
# CONFIG_TCP_CONG_WESTWOOD is not set
# CONFIG_TCP_CONG_HTCP is not setCONFIG_TCP_CONG_HSTCP=y
# CONFIG_TCP_CONG_HYBLA is not setCONFIG_TCP_CONG_VEGAS=y
# CONFIG_TCP_CONG_SCALABLE is not setCONFIG_TCP_CONG_LP=yCONFIG_TCP_CONG_VENO=yCONFIG_TCP_CONG_YEAH=y
# CONFIG_TCP_CONG_ILLINOIS is not set
# CONFIG_DEFAULT_BIC is not set
# CONFIG_DEFAULT_CUBIC is not setCONFIG_DEFAULT_VEGAS=y
# CONFIG_DEFAULT_VENO is not set
# CONFIG_DEFAULT_RENO is not setCONFIG_DEFAULT_TCP_CONG="vegas"
# CONFIG_TCP_MD5SIG is not set
# CONFIG_IPV6 is not set
# CONFIG_NETLABEL is not setCONFIG_NETWORK_SECMARK=yCONFIG_NETWORK_PHY_TIMESTAMPING=yCONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not setCONFIG_NETFILTER_ADVANCED=y
#
# Core Netfilter Configuration
#CONFIG_NETFILTER_NETLINK=yCONFIG_NETFILTER_NETLINK_QUEUE=yCONFIG_NETFILTER_NETLINK_LOG=y
# CONFIG_NF_CONNTRACK is not setCONFIG_NETFILTER_XTABLES=y
#
# Xtables combined modules
#CONFIG_NETFILTER_XT_MARK=y
#
# Xtables targets
#CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not setCONFIG_NETFILTER_XT_TARGET_MARK=yCONFIG_NETFILTER_XT_TARGET_NFLOG=y
# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not setCONFIG_NETFILTER_XT_TARGET_RATEEST=y
# CONFIG_NETFILTER_XT_TARGET_TEE is not setCONFIG_NETFILTER_XT_TARGET_SECMARK=yCONFIG_NETFILTER_XT_TARGET_TCPMSS=y
#
# Xtables matches
#CONFIG_NETFILTER_XT_MATCH_COMMENT=y
# CONFIG_NETFILTER_XT_MATCH_CPU is not set
# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
# CONFIG_NETFILTER_XT_MATCH_DSCP is not setCONFIG_NETFILTER_XT_MATCH_ESP=y
# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not setCONFIG_NETFILTER_XT_MATCH_HL=y
# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
# CONFIG_NETFILTER_XT_MATCH_LIMIT is not setCONFIG_NETFILTER_XT_MATCH_MAC=y
# CONFIG_NETFILTER_XT_MATCH_MARK is not set
# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
# CONFIG_NETFILTER_XT_MATCH_OSF is not set
# CONFIG_NETFILTER_XT_MATCH_OWNER is not setCONFIG_NETFILTER_XT_MATCH_POLICY=yCONFIG_NETFILTER_XT_MATCH_PKTTYPE=yCONFIG_NETFILTER_XT_MATCH_QUOTA=y
# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
# CONFIG_NETFILTER_XT_MATCH_REALM is not setCONFIG_NETFILTER_XT_MATCH_RECENT=y
# CONFIG_NETFILTER_XT_MATCH_SCTP is not setCONFIG_NETFILTER_XT_MATCH_STATISTIC=y
# CONFIG_NETFILTER_XT_MATCH_STRING is not set
# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not setCONFIG_NETFILTER_XT_MATCH_TIME=y
# CONFIG_NETFILTER_XT_MATCH_U32 is not setCONFIG_IP_VS=yCONFIG_IP_VS_DEBUG=yCONFIG_IP_VS_TAB_BITS=12
#
# IPVS transport protocol load balancing support
#
# CONFIG_IP_VS_PROTO_TCP is not set
# CONFIG_IP_VS_PROTO_UDP is not setCONFIG_IP_VS_PROTO_AH_ESP=yCONFIG_IP_VS_PROTO_ESP=y
# CONFIG_IP_VS_PROTO_AH is not setCONFIG_IP_VS_PROTO_SCTP=y
#
# IPVS scheduler
#
# CONFIG_IP_VS_RR is not setCONFIG_IP_VS_WRR=yCONFIG_IP_VS_LC=yCONFIG_IP_VS_WLC=yCONFIG_IP_VS_LBLC=yCONFIG_IP_VS_LBLCR=y
# CONFIG_IP_VS_DH is not setCONFIG_IP_VS_SH=y
# CONFIG_IP_VS_SED is not setCONFIG_IP_VS_NQ=y
#
# IPVS application helper
#
#
# IP: Netfilter Configuration
#
# CONFIG_NF_DEFRAG_IPV4 is not set
# CONFIG_IP_NF_QUEUE is not set
# CONFIG_IP_NF_IPTABLES is not set
# CONFIG_IP_NF_ARPTABLES is not set
#
# DECnet: Netfilter Configuration
#
# CONFIG_DECNET_NF_GRABULATOR is not set
# CONFIG_IP_DCCP is not setCONFIG_IP_SCTP=y
# CONFIG_SCTP_DBG_MSG is not set
# CONFIG_SCTP_DBG_OBJCNT is not set
# CONFIG_SCTP_HMAC_NONE is not setCONFIG_SCTP_HMAC_SHA1=y
# CONFIG_SCTP_HMAC_MD5 is not set
# CONFIG_RDS is not setCONFIG_TIPC=yCONFIG_TIPC_ADVANCED=yCONFIG_TIPC_NODES=255CONFIG_TIPC_PORTS=8191CONFIG_TIPC_LOG=0CONFIG_TIPC_DEBUG=yCONFIG_ATM=yCONFIG_ATM_CLIP=y
# CONFIG_ATM_CLIP_NO_ICMP is not setCONFIG_ATM_LANE=y
# CONFIG_ATM_MPOA is not set
# CONFIG_ATM_BR2684 is not setCONFIG_L2TP=yCONFIG_L2TP_V3=yCONFIG_L2TP_IP=y
# CONFIG_L2TP_ETH is not set
# CONFIG_BRIDGE is not setCONFIG_NET_DSA=y
# CONFIG_NET_DSA_TAG_DSA is not set
# CONFIG_NET_DSA_TAG_EDSA is not setCONFIG_NET_DSA_TAG_TRAILER=y
# CONFIG_NET_DSA_MV88E6XXX is not setCONFIG_NET_DSA_MV88E6060=y
# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
# CONFIG_NET_DSA_MV88E6131 is not set
# CONFIG_NET_DSA_MV88E6123_61_65 is not set
# CONFIG_VLAN_8021Q is not setCONFIG_DECNET=yCONFIG_DECNET_ROUTER=yCONFIG_LLC=y
# CONFIG_LLC2 is not setCONFIG_IPX=yCONFIG_IPX_INTERN=y
# CONFIG_ATALK is not setCONFIG_X25=y
# CONFIG_LAPB is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_PHONET is not set
# CONFIG_IEEE802154 is not set
# CONFIG_NET_SCHED is not setCONFIG_DCB=yCONFIG_DNS_RESOLVER=yCONFIG_BATMAN_ADV=y
# CONFIG_BATMAN_ADV_DEBUG is not set
#
# Network testing
#CONFIG_NET_PKTGEN=y
# CONFIG_HAMRADIO is not setCONFIG_CAN=y
# CONFIG_CAN_RAW is not setCONFIG_CAN_BCM=y
#
# CAN Device Drivers
#
# CONFIG_CAN_VCAN is not set
# CONFIG_CAN_SLCAN is not set
# CONFIG_CAN_DEV is not setCONFIG_CAN_DEBUG_DEVICES=yCONFIG_IRDA=y
#
# IrDA protocols
#CONFIG_IRLAN=y
# CONFIG_IRNET is not set
# CONFIG_IRCOMM is not set
# CONFIG_IRDA_ULTRA is not set
#
# IrDA options
#CONFIG_IRDA_CACHE_LAST_LSAP=yCONFIG_IRDA_FAST_RR=y
# CONFIG_IRDA_DEBUG is not set
#
# Infrared-port device drivers
#
#
# SIR device drivers
#CONFIG_IRTTY_SIR=y
#
# Dongle support
#CONFIG_DONGLE=y
# CONFIG_ESI_DONGLE is not set
# CONFIG_ACTISYS_DONGLE is not setCONFIG_TEKRAM_DONGLE=yCONFIG_TOIM3232_DONGLE=yCONFIG_LITELINK_DONGLE=yCONFIG_MA600_DONGLE=yCONFIG_GIRBIL_DONGLE=y
# CONFIG_MCP2120_DONGLE is not setCONFIG_OLD_BELKIN_DONGLE=yCONFIG_ACT200L_DONGLE=y
# CONFIG_KINGSUN_DONGLE is not set
# CONFIG_KSDAZZLE_DONGLE is not setCONFIG_KS959_DONGLE=y
#
# FIR device drivers
#
# CONFIG_USB_IRDA is not setCONFIG_SIGMATEL_FIR=y
# CONFIG_NSC_FIR is not setCONFIG_WINBOND_FIR=y
# CONFIG_TOSHIBA_FIR is not setCONFIG_SMC_IRCC_FIR=yCONFIG_ALI_FIR=y
# CONFIG_VLSI_FIR is not setCONFIG_VIA_FIR=yCONFIG_MCS_FIR=yCONFIG_BT=y
# CONFIG_BT_L2CAP is not set
# CONFIG_BT_SCO is not set
#
# Bluetooth device drivers
#CONFIG_BT_HCIBTUSB=y
# CONFIG_BT_HCIBTSDIO is not set
# CONFIG_BT_HCIUART is not set
# CONFIG_BT_HCIBCM203X is not set
# CONFIG_BT_HCIBPA10X is not setCONFIG_BT_HCIBFUSB=y
# CONFIG_BT_HCIVHCI is not set
# CONFIG_BT_MRVL is not setCONFIG_BT_ATH3K=yCONFIG_AF_RXRPC=y
# CONFIG_AF_RXRPC_DEBUG is not set
# CONFIG_RXKAD is not setCONFIG_FIB_RULES=y
# CONFIG_WIRELESS is not set
# CONFIG_WIMAX is not setCONFIG_RFKILL=yCONFIG_RFKILL_INPUT=yCONFIG_CAIF=yCONFIG_CAIF_DEBUG=yCONFIG_CAIF_NETDEV=yCONFIG_CEPH_LIB=yCONFIG_CEPH_LIB_PRETTYDEBUG=y
#
# Device Drivers
#
#
# Generic Driver Options
#CONFIG_UEVENT_HELPER_PATH=""CONFIG_DEVTMPFS=yCONFIG_STANDALONE=yCONFIG_PREVENT_FIRMWARE_BUILD=yCONFIG_FW_LOADER=y
# CONFIG_FIRMWARE_IN_KERNEL is not setCONFIG_EXTRA_FIRMWARE=""CONFIG_DEBUG_DRIVER=y
# CONFIG_DEBUG_DEVRES is not set
# CONFIG_SYS_HYPERVISOR is not setCONFIG_CONNECTOR=y
# CONFIG_PROC_EVENTS is not setCONFIG_OF=y
#
# Device Tree and Open Firmware support
#CONFIG_PROC_DEVICETREE=yCONFIG_OF_PROMTREE=yCONFIG_OF_ADDRESS=yCONFIG_OF_IRQ=yCONFIG_OF_DEVICE=yCONFIG_OF_GPIO=yCONFIG_OF_I2C=yCONFIG_OF_NET=yCONFIG_OF_MDIO=yCONFIG_PARPORT=yCONFIG_PARPORT_PC=y
# CONFIG_PARPORT_PC_FIFO is not setCONFIG_PARPORT_PC_SUPERIO=y
# CONFIG_PARPORT_GSC is not setCONFIG_PARPORT_AX88796=yCONFIG_PARPORT_1284=yCONFIG_PARPORT_NOT_PC=yCONFIG_BLK_DEV=yCONFIG_BLK_DEV_FD=yCONFIG_BLK_CPQ_DA=yCONFIG_BLK_CPQ_CISS_DA=yCONFIG_CISS_SCSI_TAPE=y
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
# CONFIG_BLK_DEV_LOOP is not setCONFIG_BLK_DEV_DRBD=yCONFIG_DRBD_FAULT_INJECTION=yCONFIG_BLK_DEV_NBD=yCONFIG_BLK_DEV_SX8=yCONFIG_BLK_DEV_UB=yCONFIG_BLK_DEV_RAM=yCONFIG_BLK_DEV_RAM_COUNT=16CONFIG_BLK_DEV_RAM_SIZE=4096
# CONFIG_BLK_DEV_XIP is not setCONFIG_CDROM_PKTCDVD=yCONFIG_CDROM_PKTCDVD_BUFFERS=8
# CONFIG_CDROM_PKTCDVD_WCACHE is not setCONFIG_ATA_OVER_ETH=yCONFIG_BLK_DEV_HD=yCONFIG_BLK_DEV_RBD=y
# CONFIG_MISC_DEVICES is not setCONFIG_HAVE_IDE=y
#
# SCSI device support
#CONFIG_SCSI_MOD=y
# CONFIG_RAID_ATTRS is not setCONFIG_SCSI=yCONFIG_SCSI_DMA=yCONFIG_SCSI_TGT=yCONFIG_SCSI_NETLINK=y
# CONFIG_SCSI_PROC_FS is not set
#
# SCSI support type (disk, tape, CD-ROM)
#CONFIG_BLK_DEV_SD=yCONFIG_CHR_DEV_ST=y
# CONFIG_CHR_DEV_OSST is not set
# CONFIG_BLK_DEV_SR is not setCONFIG_CHR_DEV_SG=yCONFIG_CHR_DEV_SCH=yCONFIG_SCSI_MULTI_LUN=y
# CONFIG_SCSI_CONSTANTS is not setCONFIG_SCSI_LOGGING=y
# CONFIG_SCSI_SCAN_ASYNC is not set
#
# SCSI Transports
#CONFIG_SCSI_SPI_ATTRS=yCONFIG_SCSI_FC_ATTRS=yCONFIG_SCSI_FC_TGT_ATTRS=yCONFIG_SCSI_ISCSI_ATTRS=yCONFIG_SCSI_SAS_ATTRS=yCONFIG_SCSI_SAS_LIBSAS=y
# CONFIG_SCSI_SAS_ATA is not set
# CONFIG_SCSI_SAS_HOST_SMP is not setCONFIG_SCSI_SAS_LIBSAS_DEBUG=yCONFIG_SCSI_SRP_ATTRS=y
# CONFIG_SCSI_SRP_TGT_ATTRS is not setCONFIG_SCSI_LOWLEVEL=yCONFIG_ISCSI_TCP=yCONFIG_ISCSI_BOOT_SYSFS=yCONFIG_SCSI_BNX2_ISCSI=y
# CONFIG_BE2ISCSI is not set
# CONFIG_BLK_DEV_3W_XXXX_RAID is not setCONFIG_SCSI_HPSA=yCONFIG_SCSI_3W_9XXX=y
# CONFIG_SCSI_3W_SAS is not setCONFIG_SCSI_ACARD=y
# CONFIG_SCSI_AACRAID is not setCONFIG_SCSI_AIC7XXX=yCONFIG_AIC7XXX_CMDS_PER_DEVICE=32CONFIG_AIC7XXX_RESET_DELAY_MS=5000
# CONFIG_AIC7XXX_DEBUG_ENABLE is not setCONFIG_AIC7XXX_DEBUG_MASK=0CONFIG_AIC7XXX_REG_PRETTY_PRINT=yCONFIG_SCSI_AIC7XXX_OLD=y
# CONFIG_SCSI_AIC79XX is not set
# CONFIG_SCSI_AIC94XX is not set
# CONFIG_SCSI_MVSAS is not setCONFIG_SCSI_DPT_I2O=yCONFIG_SCSI_ADVANSYS=y
# CONFIG_SCSI_ARCMSR is not set
# CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not setCONFIG_MEGARAID_SAS=y
# CONFIG_SCSI_MPT2SAS is not set
# CONFIG_SCSI_HPTIOP is not setCONFIG_SCSI_BUSLOGIC=yCONFIG_SCSI_FLASHPOINT=yCONFIG_VMWARE_PVSCSI=yCONFIG_LIBFC=y
# CONFIG_LIBFCOE is not set
# CONFIG_FCOE is not set
# CONFIG_FCOE_FNIC is not setCONFIG_SCSI_DMX3191D=y
# CONFIG_SCSI_EATA is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_FD_MCS is not setCONFIG_SCSI_GDTH=y
# CONFIG_SCSI_IBMMCA is not set
# CONFIG_SCSI_IPS is not setCONFIG_SCSI_INITIO=yCONFIG_SCSI_INIA100=yCONFIG_SCSI_PPA=yCONFIG_SCSI_IMM=yCONFIG_SCSI_IZIP_EPP16=y
# CONFIG_SCSI_IZIP_SLOW_CTR is not setCONFIG_SCSI_NCR_D700=y
# CONFIG_SCSI_STEX is not setCONFIG_SCSI_SYM53C8XX_2=yCONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64CONFIG_SCSI_SYM53C8XX_MMIO=yCONFIG_SCSI_IPR=yCONFIG_SCSI_IPR_TRACE=yCONFIG_SCSI_IPR_DUMP=y
# CONFIG_SCSI_NCR_Q720 is not setCONFIG_SCSI_QLOGIC_1280=yCONFIG_SCSI_QLA_FC=y
# CONFIG_SCSI_QLA_ISCSI is not set
# CONFIG_SCSI_LPFC is not set
# CONFIG_SCSI_SIM710 is not set
CONFIG_SCSI_DC395x=yCONFIG_SCSI_DC390T=y
# CONFIG_SCSI_NSP32 is not setCONFIG_SCSI_PMCRAID=yCONFIG_SCSI_PM8001=y
# CONFIG_SCSI_SRP is not setCONFIG_SCSI_BFA_FC=y
# CONFIG_SCSI_DH is not set
# CONFIG_SCSI_OSD_INITIATOR is not setCONFIG_ATA=y
# CONFIG_ATA_NONSTANDARD is not set
# CONFIG_ATA_VERBOSE_ERROR is not set
# CONFIG_SATA_PMP is not set
#
# Controllers with non-SFF native interface
#CONFIG_SATA_AHCI=y
# CONFIG_SATA_AHCI_PLATFORM is not set
# CONFIG_SATA_INIC162X is not setCONFIG_SATA_ACARD_AHCI=yCONFIG_SATA_SIL24=yCONFIG_ATA_SFF=y
#
# SFF controllers with custom DMA interface
#CONFIG_PDC_ADMA=y
# CONFIG_SATA_QSTOR is not set
# CONFIG_SATA_SX4 is not setCONFIG_ATA_BMDMA=y
#
# SATA SFF controllers with BMDMA
#CONFIG_ATA_PIIX=y
# CONFIG_SATA_MV is not setCONFIG_SATA_NV=yCONFIG_SATA_PROMISE=y
# CONFIG_SATA_SIL is not setCONFIG_SATA_SIS=y
# CONFIG_SATA_SVW is not set
# CONFIG_SATA_ULI is not setCONFIG_SATA_VIA=y
# CONFIG_SATA_VITESSE is not set
#
# PATA SFF controllers with BMDMA
#CONFIG_PATA_ALI=yCONFIG_PATA_AMD=yCONFIG_PATA_ARTOP=y
# CONFIG_PATA_ATIIXP is not set
# CONFIG_PATA_ATP867X is not setCONFIG_PATA_CMD64X=y
# CONFIG_PATA_CS5520 is not setCONFIG_PATA_CS5530=y
# CONFIG_PATA_CS5535 is not set
# CONFIG_PATA_CS5536 is not set
# CONFIG_PATA_CYPRESS is not setCONFIG_PATA_EFAR=y
# CONFIG_PATA_HPT366 is not setCONFIG_PATA_HPT37X=y
# CONFIG_PATA_HPT3X2N is not setCONFIG_PATA_HPT3X3=y
# CONFIG_PATA_HPT3X3_DMA is not set
# CONFIG_PATA_IT8213 is not set
# CONFIG_PATA_IT821X is not set
# CONFIG_PATA_JMICRON is not set
# CONFIG_PATA_MARVELL is not setCONFIG_PATA_NETCELL=yCONFIG_PATA_NINJA32=y
# CONFIG_PATA_NS87415 is not setCONFIG_PATA_OLDPIIX=yCONFIG_PATA_OPTIDMA=yCONFIG_PATA_PDC2027X=yCONFIG_PATA_PDC_OLD=yCONFIG_PATA_RADISYS=yCONFIG_PATA_RDC=yCONFIG_PATA_SC1200=y
# CONFIG_PATA_SCH is not set
# CONFIG_PATA_SERVERWORKS is not setCONFIG_PATA_SIL680=yCONFIG_PATA_SIS=yCONFIG_PATA_TOSHIBA=y
# CONFIG_PATA_TRIFLEX is not setCONFIG_PATA_VIA=yCONFIG_PATA_WINBOND=y
#
# PIO-only SFF controllers
#
# CONFIG_PATA_CMD640_PCI is not set
# CONFIG_PATA_MPIIX is not setCONFIG_PATA_NS87410=yCONFIG_PATA_OPTI=yCONFIG_PATA_PLATFORM=y
# CONFIG_PATA_RZ1000 is not set
#
# Generic fallback / legacy drivers
#CONFIG_ATA_GENERIC=y
# CONFIG_PATA_LEGACY is not setCONFIG_MD=yCONFIG_BLK_DEV_MD=y
# CONFIG_MD_AUTODETECT is not set
# CONFIG_MD_LINEAR is not set
# CONFIG_MD_RAID0 is not set
# CONFIG_MD_RAID1 is not set
# CONFIG_MD_RAID10 is not setCONFIG_MD_RAID456=yCONFIG_MD_MULTIPATH=y
# CONFIG_MD_FAULTY is not set
# CONFIG_BLK_DEV_DM is not setCONFIG_TARGET_CORE=y
# CONFIG_TCM_IBLOCK is not setCONFIG_TCM_FILEIO=y
# CONFIG_TCM_PSCSI is not set
# CONFIG_FUSION is not set
#
# IEEE 1394 (FireWire) support
#
# CONFIG_FIREWIRE is not set
# CONFIG_FIREWIRE_NOSY is not set
# CONFIG_I2O is not setCONFIG_MACINTOSH_DRIVERS=yCONFIG_NETDEVICES=yCONFIG_DUMMY=y
# CONFIG_BONDING is not set
# CONFIG_MACVLAN is not set
# CONFIG_EQUALIZER is not setCONFIG_TUN=y
# CONFIG_VETH is not set
# CONFIG_ARCNET is not setCONFIG_MII=yCONFIG_PHYLIB=y
#
# MII PHY device drivers
#
# CONFIG_MARVELL_PHY is not set CONFIG_DAVICOM_PHY=yCONFIG_QSEMI_PHY=y
# CONFIG_LXT_PHY is not set
# CONFIG_CICADA_PHY is not set
# CONFIG_VITESSE_PHY is not set CONFIG_SMSC_PHY=yCONFIG_BROADCOM_PHY=y
# CONFIG_BCM63XX_PHY is not set CONFIG_ICPLUS_PHY=y
# CONFIG_REALTEK_PHY is not set CONFIG_NATIONAL_PHY=yCONFIG_STE10XP=y
# CONFIG_LSI_ET1011C_PHY is not set CONFIG_MICREL_PHY=yCONFIG_FIXED_PHY=yCONFIG_MDIO_BITBANG=y
# CONFIG_MDIO_GPIO is not set CONFIG_NET_ETHERNET=y
# CONFIG_HAPPYMEAL is not set
# CONFIG_SUNGEM is not set CONFIG_CASSINI=y
# CONFIG_NET_VENDOR_3COM is not set CONFIG_VORTEX=yCONFIG_NET_VENDOR_SMC=yCONFIG_ULTRAMCA=yCONFIG_ETHOC=yCONFIG_DNET=yCONFIG_NET_TULIP=y
# CONFIG_DE2104X is not setCONFIG_TULIP=y
# CONFIG_TULIP_MWI is not set
# CONFIG_TULIP_MMIO is not set
# CONFIG_TULIP_NAPI is not set
# CONFIG_DE4X5 is not set
# CONFIG_WINBOND_840 is not set
# CONFIG_DM9102 is not set CONFIG_ULI526X=y
# CONFIG_PCMCIA_XIRCOM is not set CONFIG_AT1700=yCONFIG_DEPCA=yCONFIG_HP100=y
# CONFIG_NE2_MCA is not set CONFIG_IBMLANA=y
# CONFIG_IBM_NEW_EMAC_ZMII is not set
# CONFIG_IBM_NEW_EMAC_RGMII is not set
# CONFIG_IBM_NEW_EMAC_TAH is not set
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set CONFIG_NET_PCI=yCONFIG_PCNET32=yCONFIG_AMD8111_ETH=y
# CONFIG_ADAPTEC_STARFIRE is not set CONFIG_KSZ884X_PCI=y
# CONFIG_B44 is not setCONFIG_FORCEDETH=yCONFIG_E100=yCONFIG_FEALNX=yCONFIG_NATSEMI=y
# CONFIG_NE2K_PCI is not set CONFIG_8139CP=yCONFIG_8139TOO=yCONFIG_8139TOO_PIO=y
# CONFIG_8139TOO_TUNE_TWISTER is not set CONFIG_8139TOO_8129=y
# CONFIG_8139_OLD_RX_RESET is not set
# CONFIG_R6040 is not set
# CONFIG_SIS900 is not set
# CONFIG_EPIC100 is not set
# CONFIG_SMSC9420 is not set CONFIG_SUNDANCE=y
# CONFIG_SUNDANCE_MMIO is not set
# CONFIG_TLAN is not setCONFIG_KS8842=yCONFIG_KS8851_MLL=y
# CONFIG_VIA_RHINE is not set
# CONFIG_SC92031 is not set CONFIG_NET_POCKET=yCONFIG_ATP=yCONFIG_DE600=yCONFIG_DE620=y
# CONFIG_ATL2 is not set CONFIG_NETDEV_1000=y
# CONFIG_ACENIC is not setCONFIG_DL2K=y
# CONFIG_E1000 is not setCONFIG_E1000E=yCONFIG_IP1000=yCONFIG_IGB=y
# CONFIG_IGB_DCA is not set
# CONFIG_IGBVF is not setCONFIG_NS83820=y
# CONFIG_HAMACHI is not set CONFIG_YELLOWFIN=yCONFIG_R8169=y
# CONFIG_SIS190 is not setCONFIG_SKGE=yCONFIG_SKY2=yCONFIG_VIA_VELOCITY=yCONFIG_TIGON3=yCONFIG_BNX2=yCONFIG_CNIC=yCONFIG_QLA3XXX=yCONFIG_ATL1=yCONFIG_ATL1E=yCONFIG_ATL1C=yCONFIG_JME=y
# CONFIG_STMMAC_ETH is not set
# CONFIG_PCH_GBE is not set
# CONFIG_NETDEV_10000 is not set
# CONFIG_TR is not set
# CONFIG_WLAN is not set
#
# Enable WiMAX (Networking options) to see the WiMAX drivers #
#
# USB Network Adapters
#CONFIG_USB_CATC=yCONFIG_USB_KAWETH=yCONFIG_USB_PEGASUS=yCONFIG_USB_RTL8150=y
# CONFIG_USB_USBNET is not set
# CONFIG_USB_HSO is not set
# CONFIG_USB_IPHETH is not setCONFIG_WAN=y
# CONFIG_HDLC is not setCONFIG_DLCI=yCONFIG_DLCI_MAX=8
# CONFIG_SBNI is not setCONFIG_ATM_DRIVERS=yCONFIG_ATM_DUMMY=yCONFIG_ATM_TCP=yCONFIG_ATM_LANAI=yCONFIG_ATM_ENI=y
# CONFIG_ATM_ENI_DEBUG is not set
# CONFIG_ATM_ENI_TUNE_BURST is not set
# CONFIG_ATM_FIRESTREAM is not setCONFIG_ATM_ZATM=yCONFIG_ATM_ZATM_DEBUG=y
# CONFIG_ATM_NICSTAR is not setCONFIG_ATM_IDT77252=y
# CONFIG_ATM_IDT77252_DEBUG is not setCONFIG_ATM_IDT77252_RCV_ALL=yCONFIG_ATM_IDT77252_USE_SUNI=yCONFIG_ATM_AMBASSADOR=y
# CONFIG_ATM_AMBASSADOR_DEBUG is not set
# CONFIG_ATM_HORIZON is not set
# CONFIG_ATM_IA is not setCONFIG_ATM_FORE200E=yCONFIG_ATM_FORE200E_USE_TASKLET=yCONFIG_ATM_FORE200E_TX_RETRY=16CONFIG_ATM_FORE200E_DEBUG=0
# CONFIG_ATM_HE is not setCONFIG_ATM_SOLOS=y
#
# CAIF transport drivers
#
# CONFIG_CAIF_TTY is not setCONFIG_CAIF_SPI_SLAVE=yCONFIG_CAIF_SPI_SYNC=yCONFIG_FDDI=yCONFIG_DEFXX=yCONFIG_DEFXX_MMIO=y
# CONFIG_SKFP is not setCONFIG_HIPPI=yCONFIG_ROADRUNNER=y
# CONFIG_ROADRUNNER_LARGE_RINGS is not set
# CONFIG_PLIP is not setCONFIG_PPP=yCONFIG_PPP_MULTILINK=yCONFIG_PPP_FILTER=y
# CONFIG_PPP_ASYNC is not set
# CONFIG_PPP_SYNC_TTY is not set
# CONFIG_PPP_DEFLATE is not set
# CONFIG_PPP_BSDCOMP is not setCONFIG_PPP_MPPE=yCONFIG_PPPOE=yCONFIG_PPTP=yCONFIG_PPPOATM=yCONFIG_PPPOL2TP=yCONFIG_SLIP=yCONFIG_SLIP_COMPRESSED=yCONFIG_SLHC=yCONFIG_SLIP_SMART=y
# CONFIG_SLIP_MODE_SLIP6 is not set
# CONFIG_NET_FC is not setCONFIG_NETCONSOLE=y
# CONFIG_NETCONSOLE_DYNAMIC is not setCONFIG_NETPOLL=yCONFIG_NETPOLL_TRAP=yCONFIG_NET_POLL_CONTROLLER=yCONFIG_VMXNET3=yCONFIG_ISDN=yCONFIG_ISDN_I4L=yCONFIG_ISDN_PPP=yCONFIG_ISDN_PPP_VJ=y
# CONFIG_ISDN_MPP is not set
# CONFIG_IPPP_FILTER is not setCONFIG_ISDN_PPP_BSDCOMP=y
# CONFIG_ISDN_AUDIO is not set
# CONFIG_ISDN_X25 is not set
#
# ISDN feature submodules
#CONFIG_ISDN_DRV_LOOP=y
# CONFIG_ISDN_DIVERSION is not set
#
# ISDN4Linux hardware drivers
#
#
# Passive cards
#
# CONFIG_ISDN_DRV_HISAX is not set
#
# Active cards
#CONFIG_ISDN_CAPI=yCONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=yCONFIG_CAPI_TRACE=y
# CONFIG_ISDN_CAPI_MIDDLEWARE is not setCONFIG_ISDN_CAPI_CAPI20=yCONFIG_ISDN_CAPI_CAPIDRV=y
#
# CAPI hardware drivers
#CONFIG_CAPI_AVM=yCONFIG_ISDN_DRV_AVMB1_B1PCI=y
# CONFIG_ISDN_DRV_AVMB1_B1PCIV4 is not setCONFIG_ISDN_DRV_AVMB1_T1PCI=yCONFIG_ISDN_DRV_AVMB1_C4=y
# CONFIG_CAPI_EICON is not setCONFIG_ISDN_DRV_GIGASET=y
# CONFIG_GIGASET_CAPI is not setCONFIG_GIGASET_I4L=y
# CONFIG_GIGASET_DUMMYLL is not set
# CONFIG_GIGASET_BASE is not set
# CONFIG_GIGASET_M105 is not setCONFIG_GIGASET_M101=yCONFIG_GIGASET_DEBUG=y
# CONFIG_PHONE is not set
#
# Input device support
#CONFIG_INPUT=yCONFIG_INPUT_FF_MEMLESS=yCONFIG_INPUT_POLLDEV=y
# CONFIG_INPUT_SPARSEKMAP is not set
#
# Userland interfaces
#CONFIG_INPUT_MOUSEDEV=y
# CONFIG_INPUT_MOUSEDEV_PSAUX is not setCONFIG_INPUT_MOUSEDEV_SCREEN_X=1024CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768CONFIG_INPUT_JOYDEV=yCONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set
#
# Input Device Drivers
#CONFIG_INPUT_KEYBOARD=yCONFIG_KEYBOARD_ADP5520=y
# CONFIG_KEYBOARD_ADP5588 is not setCONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_QT2160 is not setCONFIG_KEYBOARD_LKKBD=yCONFIG_KEYBOARD_GPIO=yCONFIG_KEYBOARD_GPIO_POLLED=y
# CONFIG_KEYBOARD_TCA6416 is not set
# CONFIG_KEYBOARD_MATRIX is not setCONFIG_KEYBOARD_LM8323=yCONFIG_KEYBOARD_MAX7359=yCONFIG_KEYBOARD_MCS=y
# CONFIG_KEYBOARD_NEWTON is not setCONFIG_KEYBOARD_OPENCORES=yCONFIG_KEYBOARD_STOWAWAY=yCONFIG_KEYBOARD_SUNKBD=yCONFIG_KEYBOARD_STMPE=yCONFIG_KEYBOARD_TC3589X=yCONFIG_KEYBOARD_XTKBD=y
# CONFIG_INPUT_MOUSE is not set
# CONFIG_INPUT_JOYSTICK is not setCONFIG_INPUT_TABLET=y
# CONFIG_TABLET_USB_ACECAD is not setCONFIG_TABLET_USB_AIPTEK=y
# CONFIG_TABLET_USB_GTCO is not setCONFIG_TABLET_USB_HANWANG=yCONFIG_TABLET_USB_KBTAB=yCONFIG_TABLET_USB_WACOM=y
# CONFIG_INPUT_TOUCHSCREEN is not setCONFIG_INPUT_MISC=y
# CONFIG_INPUT_88PM860X_ONKEY is not setCONFIG_INPUT_AD714X=yCONFIG_INPUT_AD714X_I2C=y
# CONFIG_INPUT_PCSPKR is not set
# CONFIG_INPUT_MAX8925_ONKEY is not setCONFIG_INPUT_APANEL=y
# CONFIG_INPUT_WISTRON_BTNS is not set
# CONFIG_INPUT_ATI_REMOTE is not set
# CONFIG_INPUT_ATI_REMOTE2 is not setCONFIG_INPUT_KEYSPAN_REMOTE=yCONFIG_INPUT_POWERMATE=y
# CONFIG_INPUT_YEALINK is not set
# CONFIG_INPUT_CM109 is not setCONFIG_INPUT_UINPUT=y
# CONFIG_INPUT_PCF50633_PMU is not setCONFIG_INPUT_PCF8574=yCONFIG_INPUT_GPIO_ROTARY_ENCODER=y
# CONFIG_INPUT_WM831X_ON is not setCONFIG_INPUT_ADXL34X=yCONFIG_INPUT_ADXL34X_I2C=y
# CONFIG_INPUT_CMA3000 is not set
#
# Hardware I/O ports
#CONFIG_SERIO=yCONFIG_SERIO_I8042=yCONFIG_SERIO_SERPORT=y
# CONFIG_SERIO_CT82C710 is not setCONFIG_SERIO_PARKBD=y
# CONFIG_SERIO_PCIPS2 is not setCONFIG_SERIO_LIBPS2=yCONFIG_SERIO_RAW=y
# CONFIG_SERIO_ALTERA_PS2 is not set
# CONFIG_SERIO_PS2MULT is not setCONFIG_GAMEPORT=y
# CONFIG_GAMEPORT_NS558 is not set
# CONFIG_GAMEPORT_L4 is not setCONFIG_GAMEPORT_EMU10K1=yCONFIG_GAMEPORT_FM801=y
#
# Character devices
#CONFIG_VT=y
# CONFIG_CONSOLE_TRANSLATIONS is not setCONFIG_VT_CONSOLE=yCONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not setCONFIG_DEVKMEM=yCONFIG_SERIAL_NONSTANDARD=y
# CONFIG_COMPUTONE is not setCONFIG_ROCKETPORT=yCONFIG_CYCLADES=y
# CONFIG_CYZ_INTR is not set
# CONFIG_DIGIEPCA is not setCONFIG_MOXA_INTELLIO=y
# CONFIG_MOXA_SMARTIO is not setCONFIG_ISI=y
# CONFIG_SYNCLINK is not set
# CONFIG_SYNCLINKMP is not set
# CONFIG_SYNCLINK_GT is not set
# CONFIG_N_HDLC is not setCONFIG_N_GSM=yCONFIG_RISCOM8=y
# CONFIG_SPECIALIX is not set
# CONFIG_STALDRV is not setCONFIG_NOZOMI=y
#
# Serial drivers
#CONFIG_SERIAL_8250=yCONFIG_SERIAL_8250_CONSOLE=yCONFIG_FIX_EARLYCON_MEM=y
# CONFIG_SERIAL_8250_PCI is not setCONFIG_SERIAL_8250_NR_UARTS=4CONFIG_SERIAL_8250_RUNTIME_UARTS=4CONFIG_SERIAL_8250_EXTENDED=yCONFIG_SERIAL_8250_MANY_PORTS=y
# CONFIG_SERIAL_8250_SHARE_IRQ is not setCONFIG_SERIAL_8250_DETECT_IRQ=y
# CONFIG_SERIAL_8250_RSA is not setCONFIG_SERIAL_8250_MCA=y
#
# Non-8250 serial port support
#
# CONFIG_SERIAL_MFD_HSU is not set
# CONFIG_SERIAL_UARTLITE is not setCONFIG_SERIAL_CORE=yCONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_SERIAL_JSM is not setCONFIG_SERIAL_OF_PLATFORM=y
# CONFIG_SERIAL_TIMBERDALE is not set
# CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set
# CONFIG_SERIAL_ALTERA_JTAGUART is not setCONFIG_SERIAL_ALTERA_UART=yCONFIG_SERIAL_ALTERA_UART_MAXPORTS=4CONFIG_SERIAL_ALTERA_UART_BAUDRATE=115200
# CONFIG_SERIAL_ALTERA_UART_CONSOLE is not set
# CONFIG_SERIAL_PCH_UART is not setCONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
# CONFIG_LEGACY_PTYS is not set
# CONFIG_TTY_PRINTK is not set
# CONFIG_PRINTER is not set
# CONFIG_PPDEV is not setCONFIG_IPMI_HANDLER=y
# CONFIG_IPMI_PANIC_EVENT is not set
# CONFIG_IPMI_DEVICE_INTERFACE is not setCONFIG_IPMI_SI=y
# CONFIG_IPMI_WATCHDOG is not set
# CONFIG_IPMI_POWEROFF is not set
# CONFIG_HW_RANDOM is not set
# CONFIG_NVRAM is not set
# CONFIG_RTC is not setCONFIG_GEN_RTC=y
# CONFIG_GEN_RTC_X is not setCONFIG_R3964=yCONFIG_APPLICOM=yCONFIG_SONYPI=yCONFIG_MWAVE=y
CONFIG_PC8736x_GPIO=yCONFIG_NSC_GPIO=y
# CONFIG_RAW_DRIVER is not setCONFIG_HANGCHECK_TIMER=yCONFIG_TCG_TPM=yCONFIG_TCG_TIS=y
# CONFIG_TCG_NSC is not set
# CONFIG_TCG_ATMEL is not set
# CONFIG_TELCLOCK is not setCONFIG_DEVPORT=yCONFIG_RAMOOPS=yCONFIG_I2C=yCONFIG_I2C_BOARDINFO=yCONFIG_I2C_COMPAT=y
# CONFIG_I2C_CHARDEV is not set
# CONFIG_I2C_MUX is not set
# CONFIG_I2C_HELPER_AUTO is not setCONFIG_I2C_SMBUS=y
#
# I2C Algorithms
#CONFIG_I2C_ALGOBIT=y
# CONFIG_I2C_ALGOPCF is not setCONFIG_I2C_ALGOPCA=y
#
# I2C Hardware Bus support
#
#
# PC SMBus host controller drivers
#
# CONFIG_I2C_ALI1535 is not set
# CONFIG_I2C_ALI1563 is not set
# CONFIG_I2C_ALI15X3 is not set
# CONFIG_I2C_AMD756 is not set
# CONFIG_I2C_AMD8111 is not set
# CONFIG_I2C_I801 is not set
# CONFIG_I2C_ISCH is not setCONFIG_I2C_PIIX4=yCONFIG_I2C_NFORCE2=y
# CONFIG_I2C_SIS5595 is not setCONFIG_I2C_SIS630=y
# CONFIG_I2C_SIS96X is not setCONFIG_I2C_VIA=yCONFIG_I2C_VIAPRO=y
#
# I2C system bus drivers (mostly embedded / system-on-chip) #
# CONFIG_I2C_GPIO is not set
# CONFIG_I2C_INTEL_MID is not set CONFIG_I2C_OCORES=yCONFIG_I2C_PCA_PLATFORM=y
# CONFIG_I2C_SIMTEC is not set
# CONFIG_I2C_XILINX is not setCONFIG_I2C_EG20T=y
#
# External I2C/SMBus adapter drivers
#
# CONFIG_I2C_PARPORT is not setCONFIG_I2C_PARPORT_LIGHT=yCONFIG_I2C_TAOS_EVM=yCONFIG_I2C_TINY_USB=y
#
# Other I2C/SMBus bus drivers
#
# CONFIG_SCx200_ACB is not set
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not setCONFIG_I2C_DEBUG_BUS=y
# CONFIG_SPI is not set
#
# PPS support
#CONFIG_PPS=yCONFIG_PPS_DEBUG=y
# CONFIG_NTP_PPS is not set
#
# PPS clients support
#
# CONFIG_PPS_CLIENT_KTIMER is not set
# CONFIG_PPS_CLIENT_LDISC is not setCONFIG_PPS_CLIENT_PARPORT=y
#
# PPS generators support
#CONFIG_PPS_GENERATOR_PARPORT=yCONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=yCONFIG_GPIOLIB=yCONFIG_DEBUG_GPIO=y
# CONFIG_GPIO_SYSFS is not set
#
# Memory mapped GPIO expanders:
#CONFIG_GPIO_BASIC_MMIO=yCONFIG_GPIO_IT8761E=yCONFIG_GPIO_SCH=yCONFIG_GPIO_VX855=y
#
# I2C GPIO expanders:
#
# CONFIG_GPIO_MAX7300 is not set
# CONFIG_GPIO_MAX732X is not setCONFIG_GPIO_PCA953X=y
# CONFIG_GPIO_PCA953X_IRQ is not set
# CONFIG_GPIO_PCF857X is not set
# CONFIG_GPIO_SX150X is not setCONFIG_GPIO_STMPE=yCONFIG_GPIO_TC3589X=y
# CONFIG_GPIO_WM831X is not setCONFIG_GPIO_WM8994=yCONFIG_GPIO_ADP5520=y
# CONFIG_GPIO_ADP5588 is not set
#
# PCI GPIO expanders:
#
# CONFIG_GPIO_CS5535 is not set
# CONFIG_GPIO_BT8XX is not set
# CONFIG_GPIO_LANGWELL is not set
# CONFIG_GPIO_PCH is not setCONFIG_GPIO_ML_IOH=yCONFIG_GPIO_TIMBERDALE=yCONFIG_GPIO_RDC321X=y
#
# SPI GPIO expanders:
#
#
# AC97 GPIO expanders:
#
#
# MODULbus GPIO expanders:
#
# CONFIG_GPIO_JANZ_TTL is not set
# CONFIG_W1 is not setCONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not setCONFIG_PDA_POWER=yCONFIG_MAX8925_POWER=yCONFIG_WM831X_BACKUP=y
# CONFIG_WM831X_POWER is not setCONFIG_TEST_POWER=yCONFIG_BATTERY_DS2782=yCONFIG_BATTERY_BQ20Z75=y
# CONFIG_BATTERY_BQ27x00 is not set
# CONFIG_BATTERY_DA9030 is not set
# CONFIG_BATTERY_MAX17040 is not setCONFIG_BATTERY_MAX17042=yCONFIG_CHARGER_PCF50633=yCONFIG_CHARGER_GPIO=yCONFIG_HWMON=yCONFIG_HWMON_VID=y
# CONFIG_HWMON_DEBUG_CHIP is not set
#
# Native drivers
#
# CONFIG_SENSORS_ABITUGURU is not setCONFIG_SENSORS_ABITUGURU3=yCONFIG_SENSORS_AD7414=y
# CONFIG_SENSORS_AD7418 is not setCONFIG_SENSORS_ADM1021=yCONFIG_SENSORS_ADM1025=y
# CONFIG_SENSORS_ADM1026 is not set
# CONFIG_SENSORS_ADM1029 is not setCONFIG_SENSORS_ADM1031=y
# CONFIG_SENSORS_ADM9240 is not set
# CONFIG_SENSORS_ADT7411 is not setCONFIG_SENSORS_ADT7462=y
# CONFIG_SENSORS_ADT7470 is not set
# CONFIG_SENSORS_ADT7475 is not setCONFIG_SENSORS_ASC7621=yCONFIG_SENSORS_K8TEMP=yCONFIG_SENSORS_K10TEMP=y
# CONFIG_SENSORS_ASB100 is not set
# CONFIG_SENSORS_ATXP1 is not set
# CONFIG_SENSORS_DS620 is not setCONFIG_SENSORS_DS1621=y
# CONFIG_SENSORS_I5K_AMB is not set
# CONFIG_SENSORS_F71805F is not set
# CONFIG_SENSORS_F71882FG is not setCONFIG_SENSORS_F75375S=yCONFIG_SENSORS_FSCHMD=yCONFIG_SENSORS_G760A=yCONFIG_SENSORS_GL518SM=y
# CONFIG_SENSORS_GL520SM is not set
# CONFIG_SENSORS_GPIO_FAN is not set
# CONFIG_SENSORS_CORETEMP is not set
# CONFIG_SENSORS_PKGTEMP is not setCONFIG_SENSORS_IBMAEM=yCONFIG_SENSORS_IBMPEX=y
# CONFIG_SENSORS_IT87 is not setCONFIG_SENSORS_JC42=y
# CONFIG_SENSORS_LM63 is not set
# CONFIG_SENSORS_LM73 is not setCONFIG_SENSORS_LM75=y
# CONFIG_SENSORS_LM77 is not set
# CONFIG_SENSORS_LM78 is not setCONFIG_SENSORS_LM80=y
# CONFIG_SENSORS_LM83 is not setCONFIG_SENSORS_LM85=y
# CONFIG_SENSORS_LM87 is not setCONFIG_SENSORS_LM90=yCONFIG_SENSORS_LM92=y
# CONFIG_SENSORS_LM93 is not setCONFIG_SENSORS_LTC4215=yCONFIG_SENSORS_LTC4245=yCONFIG_SENSORS_LTC4261=yCONFIG_SENSORS_LM95241=y
# CONFIG_SENSORS_MAX1619 is not setCONFIG_SENSORS_MAX6650=yCONFIG_SENSORS_PC87360=y
# CONFIG_SENSORS_PC87427 is not setCONFIG_SENSORS_PCF8591=yCONFIG_SENSORS_SHT15=y
# CONFIG_SENSORS_SHT21 is not set
# CONFIG_SENSORS_SIS5595 is not set
# CONFIG_SENSORS_SMM665 is not setCONFIG_SENSORS_DME1737=y
# CONFIG_SENSORS_EMC1403 is not setCONFIG_SENSORS_EMC2103=y
# CONFIG_SENSORS_SMSC47M1 is not set
# CONFIG_SENSORS_SMSC47M192 is not set
# CONFIG_SENSORS_SMSC47B397 is not setCONFIG_SENSORS_ADS7828=yCONFIG_SENSORS_AMC6821=yCONFIG_SENSORS_THMC50=yCONFIG_SENSORS_TMP102=yCONFIG_SENSORS_TMP401=y
# CONFIG_SENSORS_TMP421 is not setCONFIG_SENSORS_VIA_CPUTEMP=y
# CONFIG_SENSORS_VIA686A is not set
# CONFIG_SENSORS_VT1211 is not setCONFIG_SENSORS_VT8231=y
# CONFIG_SENSORS_W83781D is not set
# CONFIG_SENSORS_W83791D is not set
# CONFIG_SENSORS_W83792D is not setCONFIG_SENSORS_W83793=y
# CONFIG_SENSORS_W83795 is not setCONFIG_SENSORS_W83L785TS=y
# CONFIG_SENSORS_W83L786NG is not setCONFIG_SENSORS_W83627HF=y
# CONFIG_SENSORS_W83627EHF is not set
# CONFIG_SENSORS_WM831X is not set
# CONFIG_SENSORS_LIS3_I2C is not setCONFIG_SENSORS_APPLESMC=yCONFIG_THERMAL=yCONFIG_THERMAL_HWMON=y
# CONFIG_WATCHDOG is not setCONFIG_SSB_POSSIBLE=y
#
# Sonics Silicon Backplane
#CONFIG_SSB=yCONFIG_SSB_SPROM=yCONFIG_SSB_PCIHOST_POSSIBLE=yCONFIG_SSB_PCIHOST=y
# CONFIG_SSB_B43_PCI_BRIDGE is not setCONFIG_SSB_SDIOHOST_POSSIBLE=y
# CONFIG_SSB_SDIOHOST is not setCONFIG_SSB_SILENT=yCONFIG_SSB_DRIVER_PCICORE_POSSIBLE=yCONFIG_SSB_DRIVER_PCICORE=yCONFIG_MFD_SUPPORT=yCONFIG_MFD_CORE=yCONFIG_MFD_88PM860X=y
# CONFIG_MFD_SM501 is not setCONFIG_HTC_PASIC3=yCONFIG_HTC_I2CPLD=yCONFIG_TPS65010=y
# CONFIG_TPS6507X is not set
# CONFIG_TWL4030_CORE is not setCONFIG_MFD_STMPE=yCONFIG_MFD_TC3589X=y
# CONFIG_MFD_TMIO is not setCONFIG_PMIC_DA903X=yCONFIG_PMIC_ADP5520=yCONFIG_MFD_MAX8925=y
# CONFIG_MFD_MAX8998 is not set
# CONFIG_MFD_WM8400 is not setCONFIG_MFD_WM831X=yCONFIG_MFD_WM831X_I2C=y
# CONFIG_MFD_WM8350_I2C is not setCONFIG_MFD_WM8994=yCONFIG_MFD_PCF50633=y
# CONFIG_PCF50633_ADC is not setCONFIG_PCF50633_GPIO=y
# CONFIG_ABX500_CORE is not set
# CONFIG_MFD_CS5535 is not setCONFIG_MFD_TIMBERDALE=yCONFIG_LPC_SCH=yCONFIG_MFD_RDC321X=yCONFIG_MFD_JANZ_CMODIO=y
# CONFIG_MFD_TPS6586X is not setCONFIG_MFD_VX855=y
# CONFIG_MFD_WL1273_CORE is not setCONFIG_REGULATOR=yCONFIG_REGULATOR_DEBUG=yCONFIG_REGULATOR_DUMMY=y
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not setCONFIG_REGULATOR_USERSPACE_CONSUMER=y
# CONFIG_REGULATOR_BQ24022 is not set
# CONFIG_REGULATOR_MAX1586 is not setCONFIG_REGULATOR_MAX8649=y
# CONFIG_REGULATOR_MAX8660 is not setCONFIG_REGULATOR_MAX8925=y
# CONFIG_REGULATOR_MAX8952 is not set
# CONFIG_REGULATOR_WM831X is not setCONFIG_REGULATOR_WM8994=yCONFIG_REGULATOR_DA903X=y
# CONFIG_REGULATOR_PCF50633 is not setCONFIG_REGULATOR_LP3971=yCONFIG_REGULATOR_LP3972=yCONFIG_REGULATOR_TPS65023=y
# CONFIG_REGULATOR_TPS6507X is not set
# CONFIG_REGULATOR_88PM8607 is not set
# CONFIG_REGULATOR_ISL6271A is not set
# CONFIG_REGULATOR_AD5398 is not setCONFIG_MEDIA_SUPPORT=y
#
# Multimedia core support
#
# CONFIG_VIDEO_DEV is not set
# CONFIG_DVB_CORE is not set
# CONFIG_VIDEO_MEDIA is not set
#
# Multimedia drivers
#CONFIG_RC_CORE=yCONFIG_LIRC=yCONFIG_RC_MAP=yCONFIG_IR_NEC_DECODER=yCONFIG_IR_RC5_DECODER=y
# CONFIG_IR_RC6_DECODER is not set
# CONFIG_IR_JVC_DECODER is not set
# CONFIG_IR_SONY_DECODER is not set
# CONFIG_IR_RC5_SZ_DECODER is not setCONFIG_IR_LIRC_CODEC=y
# CONFIG_IR_IMON is not set
# CONFIG_IR_MCEUSB is not set
# CONFIG_IR_STREAMZAP is not setCONFIG_RC_LOOPBACK=y
#
# Graphics support
#
# CONFIG_AGP is not setCONFIG_VGA_ARB=yCONFIG_VGA_ARB_MAX_GPUS=16CONFIG_DRM=yCONFIG_DRM_KMS_HELPER=yCONFIG_DRM_TTM=y
# CONFIG_DRM_TDFX is not set
# CONFIG_DRM_R128 is not setCONFIG_DRM_RADEON=yCONFIG_DRM_MGA=y
# CONFIG_DRM_VIA is not setCONFIG_DRM_SAVAGE=yCONFIG_STUB_POULSBO=yCONFIG_VGASTATE=yCONFIG_VIDEO_OUTPUT_CONTROL=yCONFIG_FB=y
# CONFIG_FIRMWARE_EDID is not set
# CONFIG_FB_DDC is not set
# CONFIG_FB_BOOT_VESA_SUPPORT is not setCONFIG_FB_CFB_FILLRECT=yCONFIG_FB_CFB_COPYAREA=yCONFIG_FB_CFB_IMAGEBLIT=y
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not setCONFIG_FB_SYS_FILLRECT=yCONFIG_FB_SYS_COPYAREA=yCONFIG_FB_SYS_IMAGEBLIT=y
# CONFIG_FB_FOREIGN_ENDIAN is not setCONFIG_FB_SYS_FOPS=y
# CONFIG_FB_WMT_GE_ROPS is not setCONFIG_FB_DEFERRED_IO=yCONFIG_FB_HECUBA=yCONFIG_FB_SVGALIB=y
# CONFIG_FB_MACMODES is not setCONFIG_FB_BACKLIGHT=yCONFIG_FB_MODE_HELPERS=yCONFIG_FB_TILEBLITTING=y
#
# Frame buffer hardware drivers
#
# CONFIG_FB_PM2 is not setCONFIG_FB_CYBER2000=y
# CONFIG_FB_ARC is not set
# CONFIG_FB_IMSTT is not setCONFIG_FB_UVESA=yCONFIG_FB_N411=yCONFIG_FB_HGA=yCONFIG_FB_S1D13XXX=y
# CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not setCONFIG_FB_LE80578=y
# CONFIG_FB_CARILLO_RANCH is not set
# CONFIG_FB_MATROX is not setCONFIG_FB_ATY128=yCONFIG_FB_ATY128_BACKLIGHT=y
# CONFIG_FB_ATY is not set
# CONFIG_FB_S3 is not setCONFIG_FB_SAVAGE=y
# CONFIG_FB_SAVAGE_I2C is not setCONFIG_FB_SAVAGE_ACCEL=y
# CONFIG_FB_SIS is not set
# CONFIG_FB_VIA is not set
# CONFIG_FB_NEOMAGIC is not setCONFIG_FB_KYRO=yCONFIG_FB_3DFX=yCONFIG_FB_3DFX_ACCEL=y
# CONFIG_FB_3DFX_I2C is not set
# CONFIG_FB_VOODOO1 is not setCONFIG_FB_VT8623=yCONFIG_FB_TRIDENT=y
# CONFIG_FB_ARK is not set
# CONFIG_FB_PM3 is not set
# CONFIG_FB_CARMINE is not set
# CONFIG_FB_GEODE is not set
# CONFIG_FB_TMIO is not setCONFIG_FB_UDL=yCONFIG_FB_METRONOME=yCONFIG_FB_MB862XX=yCONFIG_FB_MB862XX_PCI_GDC=y
# CONFIG_FB_BROADSHEET is not setCONFIG_BACKLIGHT_LCD_SUPPORT=y
# CONFIG_LCD_CLASS_DEVICE is not setCONFIG_BACKLIGHT_CLASS_DEVICE=yCONFIG_BACKLIGHT_GENERIC=y
# CONFIG_BACKLIGHT_PROGEAR is not setCONFIG_BACKLIGHT_DA903X=yCONFIG_BACKLIGHT_MAX8925=yCONFIG_BACKLIGHT_MBP_NVIDIA=yCONFIG_BACKLIGHT_SAHARA=yCONFIG_BACKLIGHT_WM831X=yCONFIG_BACKLIGHT_ADP5520=yCONFIG_BACKLIGHT_ADP8860=yCONFIG_BACKLIGHT_88PM860X=yCONFIG_BACKLIGHT_PCF50633=y
#
# Display device support
#CONFIG_DISPLAY_SUPPORT=y
#
# Display hardware drivers
#
#
# Console display driver support
#CONFIG_VGA_CONSOLE=yCONFIG_VGACON_SOFT_SCROLLBACK=yCONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64CONFIG_DUMMY_CONSOLE=y
CONFIG_FONT_8x16=yCONFIG_LOGO=y
# CONFIG_LOGO_LINUX_MONO is not set
# CONFIG_LOGO_LINUX_VGA16 is not set
# CONFIG_LOGO_LINUX_CLUT224 is not set
# CONFIG_SOUND is not setCONFIG_HID_SUPPORT=yCONFIG_HID=y
# CONFIG_HIDRAW is not set
#
# USB Input Devices
#
# CONFIG_USB_HID is not setCONFIG_HID_PID=y
#
# USB HID Boot Protocol drivers
#
# CONFIG_USB_KBD is not setCONFIG_USB_MOUSE=y
#
# Special HID drivers
#CONFIG_USB_SUPPORT=yCONFIG_USB_ARCH_HAS_HCD=yCONFIG_USB_ARCH_HAS_OHCI=yCONFIG_USB_ARCH_HAS_EHCI=yCONFIG_USB=y
# CONFIG_USB_DEBUG is not set
# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
#
# Miscellaneous USB options
#
# CONFIG_USB_DEVICEFS is not set
# CONFIG_USB_DEVICE_CLASS is not setCONFIG_USB_DYNAMIC_MINORS=yCONFIG_USB_OTG_WHITELIST=y
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
# CONFIG_USB_MON is not setCONFIG_USB_WUSB=yCONFIG_USB_WUSB_CBAF=y
# CONFIG_USB_WUSB_CBAF_DEBUG is not set
#
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
# CONFIG_USB_XHCI_HCD is not setCONFIG_USB_EHCI_HCD=yCONFIG_USB_EHCI_ROOT_HUB_TT=y
# CONFIG_USB_EHCI_TT_NEWSCHED is not setCONFIG_USB_OXU210HP_HCD=yCONFIG_USB_ISP116X_HCD=yCONFIG_USB_ISP1760_HCD=y
# CONFIG_USB_ISP1362_HCD is not setCONFIG_USB_OHCI_HCD=y
# CONFIG_USB_OHCI_HCD_SSB is not set
# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not setCONFIG_USB_OHCI_LITTLE_ENDIAN=yCONFIG_USB_UHCI_HCD=y
# CONFIG_USB_SL811_HCD is not setCONFIG_USB_R8A66597_HCD=yCONFIG_USB_HWA_HCD=y
#
# USB Device Class drivers
#
# CONFIG_USB_ACM is not setCONFIG_USB_PRINTER=y
# CONFIG_USB_WDM is not set
# CONFIG_USB_TMC is not set
#
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may #
#
# also be needed; see USB_STORAGE Help for more info # # CONFIG_USB_STORAGE is not set # CONFIG_USB_UAS is not set CONFIG_USB_LIBUSUAL=y
#
# USB Imaging devices
#CONFIG_USB_MDC800=y
# CONFIG_USB_MICROTEK is not set
#
# USB port drivers
#CONFIG_USB_USS720=yCONFIG_USB_SERIAL=y
# CONFIG_USB_SERIAL_CONSOLE is not setCONFIG_USB_EZUSB=y
# CONFIG_USB_SERIAL_GENERIC is not setCONFIG_USB_SERIAL_AIRCABLE=yCONFIG_USB_SERIAL_ARK3116=yCONFIG_USB_SERIAL_BELKIN=yCONFIG_USB_SERIAL_CH341=y
# CONFIG_USB_SERIAL_WHITEHEAT is not set
# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
# CONFIG_USB_SERIAL_CP210X is not setCONFIG_USB_SERIAL_CYPRESS_M8=yCONFIG_USB_SERIAL_EMPEG=y
# CONFIG_USB_SERIAL_FTDI_SIO is not setCONFIG_USB_SERIAL_FUNSOFT=yCONFIG_USB_SERIAL_VISOR=yCONFIG_USB_SERIAL_IPAQ=y
# CONFIG_USB_SERIAL_IR is not setCONFIG_USB_SERIAL_EDGEPORT=y
# CONFIG_USB_SERIAL_EDGEPORT_TI is not setCONFIG_USB_SERIAL_GARMIN=yCONFIG_USB_SERIAL_IPW=y
# CONFIG_USB_SERIAL_IUU is not set
# CONFIG_USB_SERIAL_KEYSPAN_PDA is not setCONFIG_USB_SERIAL_KEYSPAN=yCONFIG_USB_SERIAL_KLSI=yCONFIG_USB_SERIAL_KOBIL_SCT=yCONFIG_USB_SERIAL_MCT_U232=yCONFIG_USB_SERIAL_MOS7720=y
# CONFIG_USB_SERIAL_MOS7715_PARPORT is not setCONFIG_USB_SERIAL_MOS7840=y
# CONFIG_USB_SERIAL_MOTOROLA is not setCONFIG_USB_SERIAL_NAVMAN=yCONFIG_USB_SERIAL_PL2303=yCONFIG_USB_SERIAL_OTI6858=yCONFIG_USB_SERIAL_QCAUX=yCONFIG_USB_SERIAL_QUALCOMM=y
# CONFIG_USB_SERIAL_SPCP8X5 is not set
# CONFIG_USB_SERIAL_HP4X is not setCONFIG_USB_SERIAL_SAFE=yCONFIG_USB_SERIAL_SAFE_PADDED=y
# CONFIG_USB_SERIAL_SAMBA is not set
# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
# CONFIG_USB_SERIAL_SIERRAWIRELESS is not setCONFIG_USB_SERIAL_SYMBOL=yCONFIG_USB_SERIAL_TI=yCONFIG_USB_SERIAL_CYBERJACK=y
# CONFIG_USB_SERIAL_XIRCOM is not setCONFIG_USB_SERIAL_WWAN=yCONFIG_USB_SERIAL_OPTION=yCONFIG_USB_SERIAL_OMNINET=y
# CONFIG_USB_SERIAL_OPTICON is not set
# CONFIG_USB_SERIAL_VIVOPAY_SERIAL is not set
# CONFIG_USB_SERIAL_ZIO is not set
# CONFIG_USB_SERIAL_SSU100 is not setCONFIG_USB_SERIAL_DEBUG=y
#
# USB Miscellaneous drivers
#CONFIG_USB_EMI62=yCONFIG_USB_EMI26=yCONFIG_USB_ADUTUX=yCONFIG_USB_SEVSEG=y
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_LEGOTOWER is not set
# CONFIG_USB_LCD is not set
# CONFIG_USB_LED is not set
# CONFIG_USB_CYPRESS_CY7C63 is not set
# CONFIG_USB_CYTHERM is not setCONFIG_USB_IDMOUSE=y
# CONFIG_USB_FTDI_ELAN is not setCONFIG_USB_APPLEDISPLAY=yCONFIG_USB_SISUSBVGA=yCONFIG_USB_SISUSBVGA_CON=yCONFIG_USB_LD=y
# CONFIG_USB_TRANCEVIBRATOR is not set
# CONFIG_USB_IOWARRIOR is not set
# CONFIG_USB_TEST is not set
# CONFIG_USB_ISIGHTFW is not setCONFIG_USB_YUREX=yCONFIG_USB_ATM=yCONFIG_USB_SPEEDTOUCH=yCONFIG_USB_CXACRU=y
# CONFIG_USB_UEAGLEATM is not setCONFIG_USB_XUSBATM=yCONFIG_USB_GADGET=yCONFIG_USB_GADGET_DEBUG=y
# CONFIG_USB_GADGET_DEBUG_FILES is not setCONFIG_USB_GADGET_VBUS_DRAW=2CONFIG_USB_GADGET_SELECTED=yCONFIG_USB_GADGET_R8A66597=yCONFIG_USB_R8A66597=y
# CONFIG_USB_GADGET_PXA_U2O is not set
# CONFIG_USB_GADGET_M66592 is not set
# CONFIG_USB_GADGET_AMD5536UDC is not set
# CONFIG_USB_GADGET_CI13XXX_PCI is not set
# CONFIG_USB_GADGET_NET2280 is not set
# CONFIG_USB_GADGET_GOKU is not set
# CONFIG_USB_GADGET_LANGWELL is not set
# CONFIG_USB_GADGET_EG20T is not set
# CONFIG_USB_GADGET_DUMMY_HCD is not setCONFIG_USB_GADGET_DUALSPEED=y
# CONFIG_USB_ZERO is not set
# CONFIG_USB_ETH is not set
# CONFIG_USB_G_NCM is not set
# CONFIG_USB_GADGETFS is not setCONFIG_USB_FUNCTIONFS=yCONFIG_USB_FUNCTIONFS_ETH=yCONFIG_USB_FUNCTIONFS_RNDIS=y
# CONFIG_USB_FUNCTIONFS_GENERIC is not set
# CONFIG_USB_FILE_STORAGE is not set
# CONFIG_USB_MASS_STORAGE is not set
# CONFIG_USB_G_SERIAL is not set
# CONFIG_USB_G_PRINTER is not set
# CONFIG_USB_CDC_COMPOSITE is not set
# CONFIG_USB_G_MULTI is not set
# CONFIG_USB_G_HID is not set
# CONFIG_USB_G_DBGP is not set
#
# OTG and related infrastructure
#
# CONFIG_USB_GPIO_VBUS is not set
# CONFIG_NOP_USB_XCEIV is not setCONFIG_UWB=yCONFIG_UWB_HWA=yCONFIG_UWB_WHCI=y
# CONFIG_UWB_I1480U is not setCONFIG_MMC=y
# CONFIG_MMC_DEBUG is not setCONFIG_MMC_UNSAFE_RESUME=yCONFIG_MMC_CLKGATE=y
#
# MMC/SD/SDIO Card Drivers
#
# CONFIG_MMC_BLOCK is not set
# CONFIG_SDIO_UART is not set
# CONFIG_MMC_TEST is not set
#
# MMC/SD/SDIO Host Controller Drivers
#
# CONFIG_MMC_SDHCI is not setCONFIG_MMC_WBSD=y
# CONFIG_MMC_TIFM_SD is not set
# CONFIG_MMC_CB710 is not set
# CONFIG_MMC_VIA_SDMMC is not setCONFIG_MMC_USHC=y
# CONFIG_MEMSTICK is not setCONFIG_NEW_LEDS=yCONFIG_LEDS_CLASS=y
#
# LED drivers
#CONFIG_LEDS_88PM860X=y
# CONFIG_LEDS_ALIX2 is not setCONFIG_LEDS_PCA9532=y
# CONFIG_LEDS_GPIO is not setCONFIG_LEDS_LP3944=y
# CONFIG_LEDS_LP5521 is not set
# CONFIG_LEDS_LP5523 is not setCONFIG_LEDS_CLEVO_MAIL=y
# CONFIG_LEDS_PCA955X is not setCONFIG_LEDS_WM831X_STATUS=y
# CONFIG_LEDS_DA903X is not set
# CONFIG_LEDS_REGULATOR is not set
# CONFIG_LEDS_BD2802 is not setCONFIG_LEDS_LT3593=yCONFIG_LEDS_ADP5520=y
# CONFIG_LEDS_TRIGGERS is not set
#
# LED Triggers
#
# CONFIG_NFC_DEVICES is not set
# CONFIG_ACCESSIBILITY is not setCONFIG_INFINIBAND=yCONFIG_INFINIBAND_USER_MAD=y
# CONFIG_INFINIBAND_USER_ACCESS is not setCONFIG_INFINIBAND_ADDR_TRANS=yCONFIG_INFINIBAND_MTHCA=y
# CONFIG_INFINIBAND_MTHCA_DEBUG is not setCONFIG_INFINIBAND_AMSO1100=yCONFIG_INFINIBAND_AMSO1100_DEBUG=yCONFIG_INFINIBAND_NES=y
# CONFIG_INFINIBAND_NES_DEBUG is not set
# CONFIG_INFINIBAND_IPOIB is not setCONFIG_INFINIBAND_SRP=yCONFIG_INFINIBAND_ISER=y
# CONFIG_EDAC is not set
# CONFIG_RTC_CLASS is not setCONFIG_DMADEVICES=y
# CONFIG_DMADEVICES_DEBUG is not set
#
# DMA Devices
#CONFIG_INTEL_MID_DMAC=yCONFIG_INTEL_IOATDMA=yCONFIG_TIMB_DMA=yCONFIG_PCH_DMA=yCONFIG_DMA_ENGINE=y
#
# DMA Clients
#CONFIG_NET_DMA=y
# CONFIG_ASYNC_TX_DMA is not setCONFIG_DMATEST=yCONFIG_DCA=yCONFIG_AUXDISPLAY=yCONFIG_KS0108=yCONFIG_KS0108_PORT=0x378CONFIG_KS0108_DELAY=2
# CONFIG_CFAG12864B is not setCONFIG_UIO=yCONFIG_UIO_CIF=y
# CONFIG_UIO_PDRV is not set
# CONFIG_UIO_PDRV_GENIRQ is not setCONFIG_UIO_AEC=y
# CONFIG_UIO_SERCOS3 is not setCONFIG_UIO_PCI_GENERIC=y
# CONFIG_UIO_NETX is not set
# CONFIG_X86_PLATFORM_DEVICES is not set
#
# Firmware Drivers
#CONFIG_EDD=yCONFIG_EDD_OFF=y
# CONFIG_FIRMWARE_MEMMAP is not set
# CONFIG_DELL_RBU is not setCONFIG_DCDBAS=yCONFIG_DMIID=y
# CONFIG_ISCSI_IBFT_FIND is not set
#
# File systems
#CONFIG_EXT2_FS=y
# CONFIG_EXT2_FS_XATTR is not setCONFIG_EXT2_FS_XIP=yCONFIG_EXT3_FS=yCONFIG_EXT3_DEFAULTS_TO_ORDERED=yCONFIG_EXT3_FS_XATTR=yCONFIG_EXT3_FS_POSIX_ACL=yCONFIG_EXT3_FS_SECURITY=yCONFIG_EXT4_FS=y
# CONFIG_EXT4_FS_XATTR is not setCONFIG_EXT4_DEBUG=yCONFIG_FS_XIP=yCONFIG_JBD=yCONFIG_JBD2=yCONFIG_FS_MBCACHE=yCONFIG_REISERFS_FS=yCONFIG_REISERFS_CHECK=y
# CONFIG_REISERFS_PROC_INFO is not set
# CONFIG_REISERFS_FS_XATTR is not setCONFIG_JFS_FS=yCONFIG_JFS_POSIX_ACL=y
# CONFIG_JFS_SECURITY is not set
# CONFIG_JFS_DEBUG is not set
# CONFIG_JFS_STATISTICS is not setCONFIG_XFS_FS=yCONFIG_XFS_QUOTA=y
# CONFIG_XFS_POSIX_ACL is not setCONFIG_XFS_RT=y
# CONFIG_XFS_DEBUG is not setCONFIG_GFS2_FS=yCONFIG_GFS2_FS_LOCKING_DLM=yCONFIG_OCFS2_FS=y
# CONFIG_OCFS2_FS_O2CB is not setCONFIG_OCFS2_FS_USERSPACE_CLUSTER=yCONFIG_OCFS2_DEBUG_MASKLOG=y
# CONFIG_OCFS2_DEBUG_FS is not set
# CONFIG_BTRFS_FS is not set
# CONFIG_NILFS2_FS is not setCONFIG_FS_POSIX_ACL=yCONFIG_EXPORTFS=yCONFIG_FILE_LOCKING=yCONFIG_FSNOTIFY=yCONFIG_DNOTIFY=y
# CONFIG_INOTIFY_USER is not set
# CONFIG_FANOTIFY is not setCONFIG_QUOTA=yCONFIG_QUOTA_NETLINK_INTERFACE=y
# CONFIG_PRINT_QUOTA_WARNING is not setCONFIG_QUOTA_DEBUG=yCONFIG_QUOTA_TREE=y
# CONFIG_QFMT_V1 is not setCONFIG_QFMT_V2=yCONFIG_QUOTACTL=yCONFIG_AUTOFS4_FS=y
# CONFIG_FUSE_FS is not set
#
# Caches
#
# CONFIG_FSCACHE is not set
#
# CD-ROM/DVD Filesystems
#CONFIG_ISO9660_FS=y
# CONFIG_JOLIET is not setCONFIG_ZISOFS=y
# CONFIG_UDF_FS is not set
#
# DOS/FAT/NT Filesystems
#CONFIG_FAT_FS=yCONFIG_MSDOS_FS=yCONFIG_VFAT_FS=yCONFIG_FAT_DEFAULT_CODEPAGE=437CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"CONFIG_NTFS_FS=y
# CONFIG_NTFS_DEBUG is not setCONFIG_NTFS_RW=y
#
# Pseudo filesystems
#CONFIG_PROC_FS=y
# CONFIG_PROC_KCORE is not set
# CONFIG_PROC_SYSCTL is not set
# CONFIG_PROC_PAGE_MONITOR is not setCONFIG_SYSFS=yCONFIG_HUGETLBFS=yCONFIG_HUGETLB_PAGE=yCONFIG_CONFIGFS_FS=yCONFIG_MISC_FILESYSTEMS=y
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_ECRYPT_FS is not set
# CONFIG_HFS_FS is not setCONFIG_HFSPLUS_FS=yCONFIG_BEFS_FS=y
# CONFIG_BEFS_DEBUG is not setCONFIG_BFS_FS=yCONFIG_EFS_FS=yCONFIG_LOGFS=y
# CONFIG_CRAMFS is not set
# CONFIG_SQUASHFS is not set
# CONFIG_VXFS_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_OMFS_FS is not setCONFIG_HPFS_FS=yCONFIG_QNX4FS_FS=y
# CONFIG_ROMFS_FS is not set
# CONFIG_SYSV_FS is not setCONFIG_UFS_FS=y
# CONFIG_UFS_FS_WRITE is not setCONFIG_UFS_DEBUG=y
# CONFIG_NETWORK_FILESYSTEMS is not set
#
# Partition Types
#CONFIG_PARTITION_ADVANCED=yCONFIG_ACORN_PARTITION=yCONFIG_ACORN_PARTITION_CUMANA=y
# CONFIG_ACORN_PARTITION_EESOX is not setCONFIG_ACORN_PARTITION_ICS=yCONFIG_ACORN_PARTITION_ADFS=y
# CONFIG_ACORN_PARTITION_POWERTEC is not set
# CONFIG_ACORN_PARTITION_RISCIX is not set
# CONFIG_OSF_PARTITION is not setCONFIG_AMIGA_PARTITION=yCONFIG_ATARI_PARTITION=yCONFIG_MAC_PARTITION=yCONFIG_MSDOS_PARTITION=yCONFIG_BSD_DISKLABEL=y
# CONFIG_MINIX_SUBPARTITION is not set
# CONFIG_SOLARIS_X86_PARTITION is not set
# CONFIG_UNIXWARE_DISKLABEL is not setCONFIG_LDM_PARTITION=yCONFIG_LDM_DEBUG=yCONFIG_SGI_PARTITION=yCONFIG_ULTRIX_PARTITION=y
# CONFIG_SUN_PARTITION is not set
# CONFIG_KARMA_PARTITION is not setCONFIG_EFI_PARTITION=y
# CONFIG_SYSV68_PARTITION is not setCONFIG_NLS=yCONFIG_NLS_DEFAULT="iso8859-1"CONFIG_NLS_CODEPAGE_437=yCONFIG_NLS_CODEPAGE_737=yCONFIG_NLS_CODEPAGE_775=yCONFIG_NLS_CODEPAGE_850=yCONFIG_NLS_CODEPAGE_852=y
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not setCONFIG_NLS_CODEPAGE_861=y
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not setCONFIG_NLS_CODEPAGE_950=y
# CONFIG_NLS_CODEPAGE_932 is not setCONFIG_NLS_CODEPAGE_949=yCONFIG_NLS_CODEPAGE_874=yCONFIG_NLS_ISO8859_8=y
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not setCONFIG_NLS_ASCII=yCONFIG_NLS_ISO8859_1=y
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not setCONFIG_NLS_ISO8859_4=y
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not setCONFIG_NLS_ISO8859_7=y
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not setCONFIG_NLS_ISO8859_14=yCONFIG_NLS_ISO8859_15=yCONFIG_NLS_KOI8_R=yCONFIG_NLS_KOI8_U=yCONFIG_NLS_UTF8=yCONFIG_DLM=y
# CONFIG_DLM_DEBUG is not set
#
# Kernel hacking
#CONFIG_TRACE_IRQFLAGS_SUPPORT=y
# CONFIG_PRINTK_TIME is not set
# CONFIG_ENABLE_WARN_DEPRECATED is not set
# CONFIG_ENABLE_MUST_CHECK is not setCONFIG_FRAME_WARN=1024CONFIG_MAGIC_SYSRQ=y
# CONFIG_STRIP_ASM_SYMS is not setCONFIG_UNUSED_SYMBOLS=y
# CONFIG_DEBUG_FS is not set
# CONFIG_HEADERS_CHECK is not setCONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SHIRQ is not set
# CONFIG_LOCKUP_DETECTOR is not set
# CONFIG_HARDLOCKUP_DETECTOR is not setCONFIG_DETECT_HUNG_TASK=yCONFIG_BOOTPARAM_HUNG_TASK_PANIC=yCONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1
# CONFIG_SCHED_DEBUG is not set
# CONFIG_SCHEDSTATS is not setCONFIG_TIMER_STATS=y
# CONFIG_DEBUG_OBJECTS is not setCONFIG_SLUB_STATS=yCONFIG_DEBUG_RT_MUTEXES=yCONFIG_DEBUG_PI_LIST=y
# CONFIG_RT_MUTEX_TESTER is not setCONFIG_DEBUG_SPINLOCK=yCONFIG_DEBUG_MUTEXES=yCONFIG_BKL=yCONFIG_DEBUG_LOCK_ALLOC=yCONFIG_PROVE_LOCKING=yCONFIG_PROVE_RCU=y
# CONFIG_PROVE_RCU_REPEATEDLY is not setCONFIG_SPARSE_RCU_POINTER=yCONFIG_LOCKDEP=y
# CONFIG_LOCK_STAT is not set
# CONFIG_DEBUG_LOCKDEP is not setCONFIG_TRACE_IRQFLAGS=y
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not setCONFIG_STACKTRACE=y
# CONFIG_DEBUG_HIGHMEM is not setCONFIG_DEBUG_VM=yCONFIG_DEBUG_VIRTUAL=yCONFIG_DEBUG_WRITECOUNT=y
# CONFIG_DEBUG_MEMORY_INIT is not set
# CONFIG_DEBUG_LIST is not setCONFIG_TEST_LIST_SORT=y
# CONFIG_DEBUG_SG is not set
# CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_CREDENTIALS is not setCONFIG_ARCH_WANT_FRAME_POINTERS=yCONFIG_FRAME_POINTER=y
# CONFIG_BOOT_PRINTK_DELAY is not set
# CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not setCONFIG_FAULT_INJECTION=yCONFIG_FAILSLAB=y
# CONFIG_FAIL_PAGE_ALLOC is not set
# CONFIG_FAIL_MAKE_REQUEST is not set
# CONFIG_FAIL_IO_TIMEOUT is not set
# CONFIG_LATENCYTOP is not setCONFIG_USER_STACKTRACE_SUPPORT=yCONFIG_HAVE_FUNCTION_TRACER=yCONFIG_HAVE_FUNCTION_GRAPH_TRACER=yCONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=yCONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=yCONFIG_HAVE_DYNAMIC_FTRACE=yCONFIG_HAVE_FTRACE_MCOUNT_RECORD=yCONFIG_HAVE_SYSCALL_TRACEPOINTS=yCONFIG_HAVE_C_RECORDMCOUNT=yCONFIG_TRACING_SUPPORT=y
# CONFIG_FTRACE is not set
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not setCONFIG_DMA_API_DEBUG=yCONFIG_ATOMIC64_SELFTEST=y
# CONFIG_ASYNC_RAID6_TEST is not setCONFIG_SAMPLES=yCONFIG_HAVE_ARCH_KGDB=y
# CONFIG_KGDB is not setCONFIG_HAVE_ARCH_KMEMCHECK=yCONFIG_KMEMCHECK=y
# CONFIG_KMEMCHECK_DISABLED_BY_DEFAULT is not setCONFIG_KMEMCHECK_ENABLED_BY_DEFAULT=y
# CONFIG_KMEMCHECK_ONESHOT_BY_DEFAULT is not setCONFIG_KMEMCHECK_QUEUE_SIZE=64CONFIG_KMEMCHECK_SHADOW_COPY_SHIFT=5
# CONFIG_KMEMCHECK_PARTIAL_OK is not setCONFIG_KMEMCHECK_BITOPS_OK=yCONFIG_STRICT_DEVMEM=yCONFIG_X86_VERBOSE_BOOTUP=yCONFIG_EARLY_PRINTK=yCONFIG_EARLY_PRINTK_DBGP=y
# CONFIG_DEBUG_STACKOVERFLOW is not setCONFIG_DEBUG_STACK_USAGE=y
# CONFIG_X86_PTDUMP is not setCONFIG_DEBUG_RODATA=y
# CONFIG_DEBUG_RODATA_TEST is not set
# CONFIG_DOUBLEFAULT is not setCONFIG_IOMMU_STRESS=yCONFIG_HAVE_MMIOTRACE_SUPPORT=yCONFIG_IO_DELAY_TYPE_0X80=0CONFIG_IO_DELAY_TYPE_0XED=1CONFIG_IO_DELAY_TYPE_UDELAY=2CONFIG_IO_DELAY_TYPE_NONE=3CONFIG_IO_DELAY_0X80=y
# CONFIG_IO_DELAY_0XED is not set
# CONFIG_IO_DELAY_UDELAY is not set
# CONFIG_IO_DELAY_NONE is not setCONFIG_DEFAULT_IO_DELAY_TYPE=0
# CONFIG_CPA_DEBUG is not set
# CONFIG_OPTIMIZE_INLINING is not set
#
# Security options
#CONFIG_KEYS=y
# CONFIG_TRUSTED_KEYS is not setCONFIG_KEYS_DEBUG_PROC_KEYS=y
# CONFIG_SECURITY_DMESG_RESTRICT is not setCONFIG_SECURITY=yCONFIG_SECURITYFS=y
# CONFIG_SECURITY_NETWORK is not set
# CONFIG_SECURITY_PATH is not set
# CONFIG_SECURITY_TOMOYO is not set
# CONFIG_SECURITY_APPARMOR is not setCONFIG_IMA=yCONFIG_IMA_MEASURE_PCR_IDX=10CONFIG_IMA_AUDIT=yCONFIG_DEFAULT_SECURITY_DAC=yCONFIG_DEFAULT_SECURITY=""CONFIG_XOR_BLOCKS=yCONFIG_ASYNC_CORE=yCONFIG_ASYNC_MEMCPY=yCONFIG_ASYNC_XOR=yCONFIG_ASYNC_PQ=yCONFIG_ASYNC_RAID6_RECOV=yCONFIG_ASYNC_TX_DISABLE_PQ_VAL_DMA=yCONFIG_ASYNC_TX_DISABLE_XOR_VAL_DMA=yCONFIG_CRYPTO=y
#
# Crypto core or helper
#CONFIG_CRYPTO_ALGAPI=yCONFIG_CRYPTO_ALGAPI2=yCONFIG_CRYPTO_AEAD=yCONFIG_CRYPTO_AEAD2=yCONFIG_CRYPTO_BLKCIPHER=yCONFIG_CRYPTO_BLKCIPHER2=yCONFIG_CRYPTO_HASH=yCONFIG_CRYPTO_HASH2=yCONFIG_CRYPTO_RNG=yCONFIG_CRYPTO_RNG2=yCONFIG_CRYPTO_PCOMP=yCONFIG_CRYPTO_PCOMP2=yCONFIG_CRYPTO_MANAGER=yCONFIG_CRYPTO_MANAGER2=y
# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not setCONFIG_CRYPTO_GF128MUL=yCONFIG_CRYPTO_NULL=yCONFIG_CRYPTO_WORKQUEUE=yCONFIG_CRYPTO_CRYPTD=y
# CONFIG_CRYPTO_AUTHENC is not set
#
# Authenticated Encryption with Associated Data
#CONFIG_CRYPTO_CCM=yCONFIG_CRYPTO_GCM=yCONFIG_CRYPTO_SEQIV=y
#
# Block modes
#CONFIG_CRYPTO_CBC=yCONFIG_CRYPTO_CTR=y
# CONFIG_CRYPTO_CTS is not setCONFIG_CRYPTO_ECB=yCONFIG_CRYPTO_LRW=y
# CONFIG_CRYPTO_PCBC is not setCONFIG_CRYPTO_XTS=yCONFIG_CRYPTO_FPU=y
#
# Hash modes
#CONFIG_CRYPTO_HMAC=y
# CONFIG_CRYPTO_XCBC is not setCONFIG_CRYPTO_VMAC=y
#
# Digest
#CONFIG_CRYPTO_CRC32C=y
# CONFIG_CRYPTO_CRC32C_INTEL is not setCONFIG_CRYPTO_GHASH=yCONFIG_CRYPTO_MD4=yCONFIG_CRYPTO_MD5=yCONFIG_CRYPTO_MICHAEL_MIC=y
# CONFIG_CRYPTO_RMD128 is not set
# CONFIG_CRYPTO_RMD160 is not set
# CONFIG_CRYPTO_RMD256 is not setCONFIG_CRYPTO_RMD320=yCONFIG_CRYPTO_SHA1=yCONFIG_CRYPTO_SHA256=yCONFIG_CRYPTO_SHA512=yCONFIG_CRYPTO_TGR192=y
# CONFIG_CRYPTO_WP512 is not set
#
# Ciphers
#CONFIG_CRYPTO_AES=yCONFIG_CRYPTO_AES_586=yCONFIG_CRYPTO_AES_NI_INTEL=yCONFIG_CRYPTO_ANUBIS=yCONFIG_CRYPTO_ARC4=y
# CONFIG_CRYPTO_BLOWFISH is not set
# CONFIG_CRYPTO_CAMELLIA is not setCONFIG_CRYPTO_CAST5=y
# CONFIG_CRYPTO_CAST6 is not setCONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_FCRYPT is not setCONFIG_CRYPTO_KHAZAD=yCONFIG_CRYPTO_SALSA20=yCONFIG_CRYPTO_SALSA20_586=y
# CONFIG_CRYPTO_SEED is not set
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_TEA is not setCONFIG_CRYPTO_TWOFISH=yCONFIG_CRYPTO_TWOFISH_COMMON=y
# CONFIG_CRYPTO_TWOFISH_586 is not set
#
# Compression
#CONFIG_CRYPTO_DEFLATE=yCONFIG_CRYPTO_ZLIB=yCONFIG_CRYPTO_LZO=y
#
# Random Number Generation
#
# CONFIG_CRYPTO_ANSI_CPRNG is not set
# CONFIG_CRYPTO_USER_API_HASH is not set
# CONFIG_CRYPTO_USER_API_SKCIPHER is not setCONFIG_CRYPTO_HW=yCONFIG_CRYPTO_DEV_PADLOCK=yCONFIG_CRYPTO_DEV_PADLOCK_AES=yCONFIG_CRYPTO_DEV_PADLOCK_SHA=yCONFIG_CRYPTO_DEV_GEODE=y
# CONFIG_CRYPTO_DEV_HIFN_795X is not setCONFIG_HAVE_KVM=y
# CONFIG_VIRTUALIZATION is not set
# CONFIG_BINARY_PRINTF is not set
#
# Library routines
#CONFIG_RAID6_PQ=yCONFIG_BITREVERSE=yCONFIG_GENERIC_FIND_FIRST_BIT=yCONFIG_GENERIC_FIND_NEXT_BIT=yCONFIG_GENERIC_FIND_LAST_BIT=yCONFIG_CRC_CCITT=yCONFIG_CRC16=y
# CONFIG_CRC_T10DIF is not setCONFIG_CRC_ITU_T=yCONFIG_CRC32=yCONFIG_CRC7=yCONFIG_LIBCRC32C=yCONFIG_ZLIB_INFLATE=yCONFIG_ZLIB_DEFLATE=yCONFIG_LZO_COMPRESS=yCONFIG_LZO_DECOMPRESS=yCONFIG_XZ_DEC=y
# CONFIG_XZ_DEC_X86 is not set
# CONFIG_XZ_DEC_POWERPC is not set
# CONFIG_XZ_DEC_IA64 is not setCONFIG_XZ_DEC_ARM=y
# CONFIG_XZ_DEC_ARMTHUMB is not setCONFIG_XZ_DEC_SPARC=yCONFIG_XZ_DEC_BCJ=yCONFIG_XZ_DEC_TEST=yCONFIG_DECOMPRESS_XZ=yCONFIG_BTREE=yCONFIG_HAS_IOMEM=yCONFIG_HAS_IOPORT=yCONFIG_HAS_DMA=yCONFIG_CHECK_SIGNATURE=yCONFIG_NLATTR=yCONFIG_LRU_CACHE=yCONFIG_FORCE_SUCCESSFUL_BUILD=yCONFIG_FORCE_MINIMAL_CONFIG=yCONFIG_FORCE_MINIMAL_CONFIG_PHYS=yCONFIG_X86_32_ALWAYS_ON=y
PATCH 1/1 x86: fix build failure on X86_UP_APIC
Commit 4c321ff8 (x86: Replace cpu_2_logical_apicid[] with early percpu variable) and following changes introduced and used x86_cpu_to_logical_apicid percpu variable. It was declared and defined inside CONFIG_SMP && CONFIG_X86_32 but if CONFIG_X86_UP_APIC is set UP configuration makes use of it and build fails.
Fix it by declaring and defining it inside CONFIG_X86_LOCAL_APIC && CONFIG_X86_32.
---
Oops, forgot about UP apic. This should fix the problem. Thank you.
arch/x86/include/asm/smp.h | 2 +- arch/x86/kernel/apic/apic.c | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-)
arch/x86/include/asm/smp.h +1 -1
@@ -38,7 +38,7 @@ static inline struct cpumask *cpu_core_mDECLARE_EARLY_PER_CPU (u16, x86_cpu_to_apicid);DECLARE_EARLY_PER_CPU (u16, x86_bios_cpu_apicid); -#if defined(CONFIG_SMP ) && defined(CONFIG_X86_32 ) +#if defined(CONFIG_X86_LOCAL_APIC ) && defined(CONFIG_X86_32 )DECLARE_EARLY_PER_CPU (int, x86_cpu_to_logical_apicid);#endif
arch/x86/kernel/apic/apic.c +0 -2
@@ -79,7 +79,6 @@ EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu#ifdef CONFIG_X86_32 -#ifdef CONFIG_SMP /* * On x86_32, the mapping between cpu and logical apicid may vary * depending on apic in use. The following early percpu variable is
@@ -87,7 +86,6 @@ EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu* actually diverge. Let's keep it ugly for now. */ DEFINE_EARLY_PER_CPU (int, x86_cpu_to_logical_apicid,BAD_APICID ); -#endif /* * Knob to control our willingness to enable the local APIC.
[tip:x86/numa] x86: Fix build failure on X86_UP_APIC
Commit-ID: 4e62445b90ac4ef708bd11c7ae052b1d5ef765b5 Gitweb: http://git.kernel.org/tip/4e62445b90ac4ef708bd11c7ae052b1d5ef765b5 Author: Tejun Heo <[email protected]> AuthorDate: Fri, 28 Jan 2011 17:22:48 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 28 Jan 2011 17:24:49 +0100
x86: Fix build failure on X86_UP_APIC
Commit 4c321ff8 (x86: Replace cpu_2_logical_apicid[] with early percpu variable) and following changes introduced and used x86_cpu_to_logical_apicid percpu variable. It was declared and defined inside CONFIG_SMP && CONFIG_X86_32 but if CONFIG_X86_UP_APIC is set UP configuration makes use of it and build fails.
Fix it by declaring and defining it inside CONFIG_X86_LOCAL_APIC && CONFIG_X86_32.
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/smp.h | 2 +- arch/x86/kernel/apic/apic.c | 2 -- 2 files changed, 1 insertions(+), 3 deletions(-)
arch/x86/include/asm/smp.h +1 -1
@@ -38,7 +38,7 @@ static inline struct cpumask *cpu_core_mask(int cpu)DECLARE_EARLY_PER_CPU (u16, x86_cpu_to_apicid);DECLARE_EARLY_PER_CPU (u16, x86_bios_cpu_apicid); -#if defined(CONFIG_SMP ) && defined(CONFIG_X86_32 ) +#if defined(CONFIG_X86_LOCAL_APIC ) && defined(CONFIG_X86_32 )DECLARE_EARLY_PER_CPU (int, x86_cpu_to_logical_apicid);#endif
arch/x86/kernel/apic/apic.c +0 -2
@@ -79,7 +79,6 @@ EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu_apicid);#ifdef CONFIG_X86_32 -#ifdef CONFIG_SMP /* * On x86_32, the mapping between cpu and logical apicid may vary * depending on apic in use. The following early percpu variable is
@@ -87,7 +86,6 @@ EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu_apicid);* actually diverge. Let's keep it ugly for now. */ DEFINE_EARLY_PER_CPU (int, x86_cpu_to_logical_apicid,BAD_APICID ); -#endif /* * Knob to control our willingness to enable the local APIC.