diff options
| author | Lin Ming <ming.m.lin@intel.com> | 2011-05-15 21:11:00 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2011-05-29 02:17:56 -0400 |
| commit | 932df7414336a00f45e5aec62724cf736b0bcfd4 (patch) | |
| tree | aaa896c278e90005729f566a437a4134b27dab2b | |
| parent | 61c4f2c81c61f73549928dfd9f3e8f26aa36a8cf (diff) | |
ACPI: processor: fix processor_physically_present in UP kernel
Usually, there are multiple processors defined in ACPI table, for
example
Scope (_PR)
{
Processor (CPU0, 0x00, 0x00000410, 0x06) {}
Processor (CPU1, 0x01, 0x00000410, 0x06) {}
Processor (CPU2, 0x02, 0x00000410, 0x06) {}
Processor (CPU3, 0x03, 0x00000410, 0x06) {}
}
processor_physically_present(...) will be called to check whether those
processors are physically present.
Currently we have below codes in processor_physically_present,
cpuid = acpi_get_cpuid(...);
if ((cpuid == -1) && (num_possible_cpus() > 1))
return false;
return true;
In UP kernel, acpi_get_cpuid(...) always return -1 and
num_possible_cpus() always return 1, so
processor_physically_present(...) always returns true for all passed in
processor handles.
This is wrong for UP processor or SMP processor running UP kernel.
This patch removes the !SMP version of acpi_get_cpuid(), so both UP and
SMP kernel use the same acpi_get_cpuid function.
And for UP kernel, only processor 0 is valid.
https://bugzilla.kernel.org/show_bug.cgi?id=16548
https://bugzilla.kernel.org/show_bug.cgi?id=16357
Tested-by: Anton Kochkov <anton.kochkov@gmail.com>
Tested-by: Ambroz Bizjak <ambrop7@gmail.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
| -rw-r--r-- | drivers/acpi/processor_core.c | 12 | ||||
| -rw-r--r-- | include/acpi/processor.h | 7 |
2 files changed, 9 insertions, 10 deletions
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 25bf17da69fd..02d2a4c9084d 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
| @@ -37,7 +37,6 @@ static struct dmi_system_id __initdata processor_idle_dmi_table[] = { | |||
| 37 | {}, | 37 | {}, |
| 38 | }; | 38 | }; |
| 39 | 39 | ||
| 40 | #ifdef CONFIG_SMP | ||
| 41 | static int map_lapic_id(struct acpi_subtable_header *entry, | 40 | static int map_lapic_id(struct acpi_subtable_header *entry, |
| 42 | u32 acpi_id, int *apic_id) | 41 | u32 acpi_id, int *apic_id) |
| 43 | { | 42 | { |
| @@ -165,7 +164,9 @@ exit: | |||
| 165 | 164 | ||
| 166 | int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) | 165 | int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) |
| 167 | { | 166 | { |
| 167 | #ifdef CONFIG_SMP | ||
| 168 | int i; | 168 | int i; |
| 169 | #endif | ||
| 169 | int apic_id = -1; | 170 | int apic_id = -1; |
| 170 | 171 | ||
| 171 | apic_id = map_mat_entry(handle, type, acpi_id); | 172 | apic_id = map_mat_entry(handle, type, acpi_id); |
| @@ -174,14 +175,19 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) | |||
| 174 | if (apic_id == -1) | 175 | if (apic_id == -1) |
| 175 | return apic_id; | 176 | return apic_id; |
| 176 | 177 | ||
| 178 | #ifdef CONFIG_SMP | ||
| 177 | for_each_possible_cpu(i) { | 179 | for_each_possible_cpu(i) { |
| 178 | if (cpu_physical_id(i) == apic_id) | 180 | if (cpu_physical_id(i) == apic_id) |
| 179 | return i; | 181 | return i; |
| 180 | } | 182 | } |
| 183 | #else | ||
| 184 | /* In UP kernel, only processor 0 is valid */ | ||
| 185 | if (apic_id == 0) | ||
| 186 | return apic_id; | ||
| 187 | #endif | ||
| 181 | return -1; | 188 | return -1; |
| 182 | } | 189 | } |
| 183 | EXPORT_SYMBOL_GPL(acpi_get_cpuid); | 190 | EXPORT_SYMBOL_GPL(acpi_get_cpuid); |
| 184 | #endif | ||
| 185 | 191 | ||
| 186 | static bool __init processor_physically_present(acpi_handle handle) | 192 | static bool __init processor_physically_present(acpi_handle handle) |
| 187 | { | 193 | { |
| @@ -217,7 +223,7 @@ static bool __init processor_physically_present(acpi_handle handle) | |||
| 217 | type = (acpi_type == ACPI_TYPE_DEVICE) ? 1 : 0; | 223 | type = (acpi_type == ACPI_TYPE_DEVICE) ? 1 : 0; |
| 218 | cpuid = acpi_get_cpuid(handle, type, acpi_id); | 224 | cpuid = acpi_get_cpuid(handle, type, acpi_id); |
| 219 | 225 | ||
| 220 | if ((cpuid == -1) && (num_possible_cpus() > 1)) | 226 | if (cpuid == -1) |
| 221 | return false; | 227 | return false; |
| 222 | 228 | ||
| 223 | return true; | 229 | return true; |
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index 55192ac0cede..ba4928cae473 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
| @@ -310,14 +310,7 @@ static inline int acpi_processor_get_bios_limit(int cpu, unsigned int *limit) | |||
| 310 | 310 | ||
| 311 | /* in processor_core.c */ | 311 | /* in processor_core.c */ |
| 312 | void acpi_processor_set_pdc(acpi_handle handle); | 312 | void acpi_processor_set_pdc(acpi_handle handle); |
| 313 | #ifdef CONFIG_SMP | ||
| 314 | int acpi_get_cpuid(acpi_handle, int type, u32 acpi_id); | 313 | int acpi_get_cpuid(acpi_handle, int type, u32 acpi_id); |
| 315 | #else | ||
| 316 | static inline int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) | ||
| 317 | { | ||
| 318 | return -1; | ||
| 319 | } | ||
| 320 | #endif | ||
| 321 | 314 | ||
| 322 | /* in processor_throttling.c */ | 315 | /* in processor_throttling.c */ |
| 323 | int acpi_processor_tstate_has_changed(struct acpi_processor *pr); | 316 | int acpi_processor_tstate_has_changed(struct acpi_processor *pr); |
