diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-30 12:06:13 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-30 12:06:13 -0400 |
| commit | 021fad8b706849c091f6e682bc5df3ce4f9ab4d7 (patch) | |
| tree | 471aacadc425fcb725ea293637e34d813b666b5d | |
| parent | e9a5f426b85e429bffaee4e0b086b1e742a39fa6 (diff) | |
| parent | 1ba4f22c426ba04b00fd717318d50620c621a0e1 (diff) | |
Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
x86, cpufeature: Unbreak compile with gcc 3.x
x86, pat: Fix memory leak in free_memtype
x86, k8: Fix section mismatch for powernowk8_exit()
lib/atomic64_test: fix missing include of linux/kernel.h
x86: remove last traces of quicklist usage
x86, setup: Phoenix BIOS fixup is needed on Dell Inspiron Mini 1012
x86: "nosmp" command line option should force the system into UP mode
arch/x86/pci: use kasprintf
x86, apic: ack all pending irqs when crashed/on kexec
| -rw-r--r-- | arch/x86/include/asm/cpufeature.h | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/apic.c | 41 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/powernow-k8.c | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/setup.c | 11 | ||||
| -rw-r--r-- | arch/x86/kernel/smpboot.c | 26 | ||||
| -rw-r--r-- | arch/x86/mm/pat.c | 10 | ||||
| -rw-r--r-- | arch/x86/mm/pat_internal.h | 6 | ||||
| -rw-r--r-- | arch/x86/mm/pat_rbtree.c | 7 | ||||
| -rw-r--r-- | arch/x86/mm/pgtable_32.c | 1 | ||||
| -rw-r--r-- | arch/x86/pci/acpi.c | 3 | ||||
| -rw-r--r-- | lib/atomic64_test.c | 1 |
11 files changed, 93 insertions, 26 deletions
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index dca9c545f44e..468145914389 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h | |||
| @@ -332,6 +332,7 @@ static __always_inline __pure bool __static_cpu_has(u8 bit) | |||
| 332 | #endif | 332 | #endif |
| 333 | } | 333 | } |
| 334 | 334 | ||
| 335 | #if __GNUC__ >= 4 | ||
| 335 | #define static_cpu_has(bit) \ | 336 | #define static_cpu_has(bit) \ |
| 336 | ( \ | 337 | ( \ |
| 337 | __builtin_constant_p(boot_cpu_has(bit)) ? \ | 338 | __builtin_constant_p(boot_cpu_has(bit)) ? \ |
| @@ -340,6 +341,12 @@ static __always_inline __pure bool __static_cpu_has(u8 bit) | |||
| 340 | __static_cpu_has(bit) : \ | 341 | __static_cpu_has(bit) : \ |
| 341 | boot_cpu_has(bit) \ | 342 | boot_cpu_has(bit) \ |
| 342 | ) | 343 | ) |
| 344 | #else | ||
| 345 | /* | ||
| 346 | * gcc 3.x is too stupid to do the static test; fall back to dynamic. | ||
| 347 | */ | ||
| 348 | #define static_cpu_has(bit) boot_cpu_has(bit) | ||
| 349 | #endif | ||
| 343 | 350 | ||
| 344 | #endif /* defined(__KERNEL__) && !defined(__ASSEMBLY__) */ | 351 | #endif /* defined(__KERNEL__) && !defined(__ASSEMBLY__) */ |
| 345 | 352 | ||
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index e5a4a1e01618..c02cc692985c 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | #include <asm/smp.h> | 51 | #include <asm/smp.h> |
| 52 | #include <asm/mce.h> | 52 | #include <asm/mce.h> |
| 53 | #include <asm/kvm_para.h> | 53 | #include <asm/kvm_para.h> |
| 54 | #include <asm/tsc.h> | ||
| 54 | 55 | ||
| 55 | unsigned int num_processors; | 56 | unsigned int num_processors; |
| 56 | 57 | ||
| @@ -1151,8 +1152,13 @@ static void __cpuinit lapic_setup_esr(void) | |||
| 1151 | */ | 1152 | */ |
| 1152 | void __cpuinit setup_local_APIC(void) | 1153 | void __cpuinit setup_local_APIC(void) |
| 1153 | { | 1154 | { |
| 1154 | unsigned int value; | 1155 | unsigned int value, queued; |
| 1155 | int i, j; | 1156 | int i, j, acked = 0; |
| 1157 | unsigned long long tsc = 0, ntsc; | ||
| 1158 | long long max_loops = cpu_khz; | ||
| 1159 | |||
| 1160 | if (cpu_has_tsc) | ||
| 1161 | rdtscll(tsc); | ||
| 1156 | 1162 | ||
| 1157 | if (disable_apic) { | 1163 | if (disable_apic) { |
| 1158 | arch_disable_smp_support(); | 1164 | arch_disable_smp_support(); |
| @@ -1204,13 +1210,32 @@ void __cpuinit setup_local_APIC(void) | |||
| 1204 | * the interrupt. Hence a vector might get locked. It was noticed | 1210 | * the interrupt. Hence a vector might get locked. It was noticed |
| 1205 | * for timer irq (vector 0x31). Issue an extra EOI to clear ISR. | 1211 | * for timer irq (vector 0x31). Issue an extra EOI to clear ISR. |
| 1206 | */ | 1212 | */ |
| 1207 | for (i = APIC_ISR_NR - 1; i >= 0; i--) { | 1213 | do { |
| 1208 | value = apic_read(APIC_ISR + i*0x10); | 1214 | queued = 0; |
| 1209 | for (j = 31; j >= 0; j--) { | 1215 | for (i = APIC_ISR_NR - 1; i >= 0; i--) |
| 1210 | if (value & (1<<j)) | 1216 | queued |= apic_read(APIC_IRR + i*0x10); |
| 1211 | ack_APIC_irq(); | 1217 | |
| 1218 | for (i = APIC_ISR_NR - 1; i >= 0; i--) { | ||
| 1219 | value = apic_read(APIC_ISR + i*0x10); | ||
| 1220 | for (j = 31; j >= 0; j--) { | ||
| 1221 | if (value & (1<<j)) { | ||
| 1222 | ack_APIC_irq(); | ||
| 1223 | acked++; | ||
| 1224 | } | ||
| 1225 | } | ||
| 1212 | } | 1226 | } |
| 1213 | } | 1227 | if (acked > 256) { |
| 1228 | printk(KERN_ERR "LAPIC pending interrupts after %d EOI\n", | ||
| 1229 | acked); | ||
| 1230 | break; | ||
| 1231 | } | ||
| 1232 | if (cpu_has_tsc) { | ||
| 1233 | rdtscll(ntsc); | ||
| 1234 | max_loops = (cpu_khz << 10) - (ntsc - tsc); | ||
| 1235 | } else | ||
| 1236 | max_loops--; | ||
| 1237 | } while (queued && max_loops > 0); | ||
| 1238 | WARN_ON(max_loops <= 0); | ||
| 1214 | 1239 | ||
| 1215 | /* | 1240 | /* |
| 1216 | * Now that we are all set up, enable the APIC | 1241 | * Now that we are all set up, enable the APIC |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index 6f3dc8fbbfdc..7ec2123838e6 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c | |||
| @@ -1497,8 +1497,8 @@ static struct cpufreq_driver cpufreq_amd64_driver = { | |||
| 1497 | * simply keep the boost-disable flag in sync with the current global | 1497 | * simply keep the boost-disable flag in sync with the current global |
| 1498 | * state. | 1498 | * state. |
| 1499 | */ | 1499 | */ |
| 1500 | static int __cpuinit cpb_notify(struct notifier_block *nb, unsigned long action, | 1500 | static int cpb_notify(struct notifier_block *nb, unsigned long action, |
| 1501 | void *hcpu) | 1501 | void *hcpu) |
| 1502 | { | 1502 | { |
| 1503 | unsigned cpu = (long)hcpu; | 1503 | unsigned cpu = (long)hcpu; |
| 1504 | u32 lo, hi; | 1504 | u32 lo, hi; |
| @@ -1528,7 +1528,7 @@ static int __cpuinit cpb_notify(struct notifier_block *nb, unsigned long action, | |||
| 1528 | return NOTIFY_OK; | 1528 | return NOTIFY_OK; |
| 1529 | } | 1529 | } |
| 1530 | 1530 | ||
| 1531 | static struct notifier_block __cpuinitdata cpb_nb = { | 1531 | static struct notifier_block cpb_nb = { |
| 1532 | .notifier_call = cpb_notify, | 1532 | .notifier_call = cpb_notify, |
| 1533 | }; | 1533 | }; |
| 1534 | 1534 | ||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index e8029896309a..b4ae4acbd031 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -676,6 +676,17 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = { | |||
| 676 | DMI_MATCH(DMI_BOARD_NAME, "DG45FC"), | 676 | DMI_MATCH(DMI_BOARD_NAME, "DG45FC"), |
| 677 | }, | 677 | }, |
| 678 | }, | 678 | }, |
| 679 | /* | ||
| 680 | * The Dell Inspiron Mini 1012 has DMI_BIOS_VENDOR = "Dell Inc.", so | ||
| 681 | * match on the product name. | ||
| 682 | */ | ||
| 683 | { | ||
| 684 | .callback = dmi_low_memory_corruption, | ||
| 685 | .ident = "Phoenix BIOS", | ||
| 686 | .matches = { | ||
| 687 | DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1012"), | ||
| 688 | }, | ||
| 689 | }, | ||
| 679 | #endif | 690 | #endif |
| 680 | {} | 691 | {} |
| 681 | }; | 692 | }; |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 763d815e27a0..37462f1ddba5 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -1215,9 +1215,17 @@ __init void prefill_possible_map(void) | |||
| 1215 | if (!num_processors) | 1215 | if (!num_processors) |
| 1216 | num_processors = 1; | 1216 | num_processors = 1; |
| 1217 | 1217 | ||
| 1218 | if (setup_possible_cpus == -1) | 1218 | i = setup_max_cpus ?: 1; |
| 1219 | possible = num_processors + disabled_cpus; | 1219 | if (setup_possible_cpus == -1) { |
| 1220 | else | 1220 | possible = num_processors; |
| 1221 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 1222 | if (setup_max_cpus) | ||
| 1223 | possible += disabled_cpus; | ||
| 1224 | #else | ||
| 1225 | if (possible > i) | ||
| 1226 | possible = i; | ||
| 1227 | #endif | ||
| 1228 | } else | ||
| 1221 | possible = setup_possible_cpus; | 1229 | possible = setup_possible_cpus; |
| 1222 | 1230 | ||
| 1223 | total_cpus = max_t(int, possible, num_processors + disabled_cpus); | 1231 | total_cpus = max_t(int, possible, num_processors + disabled_cpus); |
| @@ -1230,11 +1238,23 @@ __init void prefill_possible_map(void) | |||
| 1230 | possible = nr_cpu_ids; | 1238 | possible = nr_cpu_ids; |
| 1231 | } | ||
