diff options
| author | Hirokazu Takata <takata@linux-m32r.org> | 2006-04-11 01:53:18 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-04-11 09:18:34 -0400 |
| commit | 7c1c4e541888947947bc46a18a9a5543a259ed62 (patch) | |
| tree | b2484781dd89aea63fb0e66702f0ec1b9ad491c0 /arch/m32r | |
| parent | 917b1f78a9871a1985004df09ed1eb2e0dc3bf4f (diff) | |
[PATCH] m32r: Fix cpu_possible_map and cpu_present_map initialization for SMP kernel
This patch fixes a boot problem of the m32r SMP kernel 2.6.16-rc1-mm3 or
later.
In this patch, cpu_possible_map is statically initialized, and cpu_present_map
is also copied from cpu_possible_map in smp_prepare_cpus(), because the m32r
architecture has not supported CPU hotplug yet.
Signed-off-by: Hayato Fujiwara <fujiwara.hayato@renesas.com>
Signed-off-by: Hirokazu Takata <takata@linux-m32r.org>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/m32r')
| -rw-r--r-- | arch/m32r/kernel/setup.c | 12 | ||||
| -rw-r--r-- | arch/m32r/kernel/smpboot.c | 19 |
2 files changed, 15 insertions, 16 deletions
diff --git a/arch/m32r/kernel/setup.c b/arch/m32r/kernel/setup.c index 0d78942b4c76..3cd3c2988a48 100644 --- a/arch/m32r/kernel/setup.c +++ b/arch/m32r/kernel/setup.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | 9 | ||
| 10 | #include <linux/config.h> | 10 | #include <linux/config.h> |
| 11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
| 12 | #include <linux/kernel.h> | ||
| 12 | #include <linux/stddef.h> | 13 | #include <linux/stddef.h> |
| 13 | #include <linux/fs.h> | 14 | #include <linux/fs.h> |
| 14 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
| @@ -219,8 +220,6 @@ static unsigned long __init setup_memory(void) | |||
| 219 | extern unsigned long setup_memory(void); | 220 | extern unsigned long setup_memory(void); |
| 220 | #endif /* CONFIG_DISCONTIGMEM */ | 221 | #endif /* CONFIG_DISCONTIGMEM */ |
| 221 | 222 | ||
| 222 | #define M32R_PCC_PCATCR 0x00ef7014 /* will move to m32r.h */ | ||
| 223 | |||
| 224 | void __init setup_arch(char **cmdline_p) | 223 | void __init setup_arch(char **cmdline_p) |
| 225 | { | 224 | { |
| 226 | ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); | 225 | ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); |
| @@ -269,15 +268,14 @@ void __init setup_arch(char **cmdline_p) | |||
| 269 | paging_init(); | 268 | paging_init(); |
| 270 | } | 269 | } |
| 271 | 270 | ||
| 272 | static struct cpu cpu[NR_CPUS]; | 271 | static struct cpu cpu_devices[NR_CPUS]; |
| 273 | 272 | ||
| 274 | static int __init topology_init(void) | 273 | static int __init topology_init(void) |
| 275 | { | 274 | { |
| 276 | int cpu_id; | 275 | int i; |
| 277 | 276 | ||
| 278 | for (cpu_id = 0; cpu_id < NR_CPUS; cpu_id++) | 277 | for_each_present_cpu(i) |
| 279 | if (cpu_possible(cpu_id)) | 278 | register_cpu(&cpu_devices[i], i, NULL); |
| 280 | register_cpu(&cpu[cpu_id], cpu_id, NULL); | ||
| 281 | 279 | ||
| 282 | return 0; | 280 | return 0; |
| 283 | } | 281 | } |
diff --git a/arch/m32r/kernel/smpboot.c b/arch/m32r/kernel/smpboot.c index d7ec16e7fb25..840b4348bf0c 100644 --- a/arch/m32r/kernel/smpboot.c +++ b/arch/m32r/kernel/smpboot.c | |||
| @@ -39,8 +39,10 @@ | |||
| 39 | * Martin J. Bligh : Added support for multi-quad systems | 39 | * Martin J. Bligh : Added support for multi-quad systems |
| 40 | */ | 40 | */ |
| 41 | 41 | ||
| 42 | #include <linux/module.h> | ||
| 42 | #include <linux/config.h> | 43 | #include <linux/config.h> |
| 43 | #include <linux/init.h> | 44 | #include <linux/init.h> |
| 45 | #include <linux/kernel.h> | ||
| 44 | #include <linux/mm.h> | 46 | #include <linux/mm.h> |
| 45 | #include <linux/smp_lock.h> | 47 | #include <linux/smp_lock.h> |
| 46 | #include <linux/irq.h> | 48 | #include <linux/irq.h> |
| @@ -72,11 +74,15 @@ physid_mask_t phys_cpu_present_map; | |||
| 72 | 74 | ||
| 73 | /* Bitmask of currently online CPUs */ | 75 | /* Bitmask of currently online CPUs */ |
| 74 | cpumask_t cpu_online_map; | 76 | cpumask_t cpu_online_map; |
| 77 | EXPORT_SYMBOL(cpu_online_map); | ||
| 75 | 78 | ||
| 76 | cpumask_t cpu_bootout_map; | 79 | cpumask_t cpu_bootout_map; |
| 77 | cpumask_t cpu_bootin_map; | 80 | cpumask_t cpu_bootin_map; |
| 78 | cpumask_t cpu_callout_map; | ||
| 79 | static cpumask_t cpu_callin_map; | 81 | static cpumask_t cpu_callin_map; |
| 82 | cpumask_t cpu_callout_map; | ||
| 83 | EXPORT_SYMBOL(cpu_callout_map); | ||
| 84 | cpumask_t cpu_possible_map = CPU_MASK_ALL; | ||
| 85 | EXPORT_SYMBOL(cpu_possible_map); | ||
| 80 | 86 | ||
| 81 | /* Per CPU bogomips and other parameters */ | 87 | /* Per CPU bogomips and other parameters */ |
| 82 | struct cpuinfo_m32r cpu_data[NR_CPUS] __cacheline_aligned; | 88 | struct cpuinfo_m32r cpu_data[NR_CPUS] __cacheline_aligned; |
| @@ -110,7 +116,6 @@ static unsigned int calibration_result; | |||
| 110 | 116 | ||
| 111 | void smp_prepare_boot_cpu(void); | 117 | void smp_prepare_boot_cpu(void); |
| 112 | void smp_prepare_cpus(unsigned int); | 118 | void smp_prepare_cpus(unsigned int); |
| 113 | static void smp_tune_scheduling(void); | ||
| 114 | static void init_ipi_lock(void); | 119 | static void init_ipi_lock(void); |
| 115 | static void do_boot_cpu(int); | 120 | static void do_boot_cpu(int); |
| 116 | int __cpu_up(unsigned int); | 121 | int __cpu_up(unsigned int); |
| @@ -177,6 +182,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
| 177 | } | 182 | } |
| 178 | for (phys_id = 0 ; phys_id < nr_cpu ; phys_id++) | 183 | for (phys_id = 0 ; phys_id < nr_cpu ; phys_id++) |
| 179 | physid_set(phys_id, phys_cpu_present_map); | 184 | physid_set(phys_id, phys_cpu_present_map); |
| 185 | #ifndef CONFIG_HOTPLUG_CPU | ||
| 186 | cpu_present_map = cpu_possible_map; | ||
| 187 | #endif | ||
| 180 | 188 | ||
| 181 | show_mp_info(nr_cpu); | 189 | show_mp_info(nr_cpu); |
| 182 | 190 | ||
| @@ -186,7 +194,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
| 186 | * Setup boot CPU information | 194 | * Setup boot CPU information |
| 187 | */ | 195 | */ |
| 188 | smp_store_cpu_info(0); /* Final full version of the data */ | 196 | smp_store_cpu_info(0); /* Final full version of the data */ |
| 189 | smp_tune_scheduling(); | ||
| 190 | 197 | ||
| 191 | /* | 198 | /* |
| 192 | * If SMP should be disabled, then really disable it! | 199 | * If SMP should be disabled, then really disable it! |
| @@ -230,11 +237,6 @@ smp_done: | |||
| 230 | Dprintk("Boot done.\n"); | 237 | Dprintk("Boot done.\n"); |
| 231 | } | 238 | } |
| 232 | 239 | ||
| 233 | static void __init smp_tune_scheduling(void) | ||
| 234 | { | ||
| 235 | /* Nothing to do. */ | ||
| 236 | } | ||
| 237 | |||
| 238 | /* | 240 | /* |
| 239 | * init_ipi_lock : Initialize IPI locks. | 241 | * init_ipi_lock : Initialize IPI locks. |
| 240 | */ | 242 | */ |
| @@ -629,4 +631,3 @@ static void __init unmap_cpu_to_physid(int cpu_id, int phys_id) | |||
| 629 | physid_2_cpu[phys_id] = -1; | 631 | physid_2_cpu[phys_id] = -1; |
| 630 | cpu_2_physid[cpu_id] = -1; | 632 | cpu_2_physid[cpu_id] = -1; |
| 631 | } | 633 | } |
| 632 | |||
