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 | } | 1239 | } |
| 1232 | 1240 | ||
| 1241 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 1242 | if (!setup_max_cpus) | ||
| 1243 | #endif | ||
| 1244 | if (possible > i) { | ||
| 1245 | printk(KERN_WARNING | ||
| 1246 | "%d Processors exceeds max_cpus limit of %u\n", | ||
| 1247 | possible, setup_max_cpus); | ||
| 1248 | possible = i; | ||
| 1249 | } | ||
| 1250 | |||
| 1233 | printk(KERN_INFO "SMP: Allowing %d CPUs, %d hotplug CPUs\n", | 1251 | printk(KERN_INFO "SMP: Allowing %d CPUs, %d hotplug CPUs\n", |
| 1234 | possible, max_t(int, possible - num_processors, 0)); | 1252 | possible, max_t(int, possible - num_processors, 0)); |
| 1235 | 1253 | ||
| 1236 | for (i = 0; i < possible; i++) | 1254 | for (i = 0; i < possible; i++) |
| 1237 | set_cpu_possible(i, true); | 1255 | set_cpu_possible(i, true); |
| 1256 | for (; i < NR_CPUS; i++) | ||
| 1257 | set_cpu_possible(i, false); | ||
| 1238 | 1258 | ||
| 1239 | nr_cpu_ids = possible; | 1259 | nr_cpu_ids = possible; |
| 1240 | } | 1260 | } |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index bbe5502ee1cb..acc15b23b743 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
| @@ -336,6 +336,7 @@ int free_memtype(u64 start, u64 end) | |||
| 336 | { | 336 | { |
| 337 | int err = -EINVAL; | 337 | int err = -EINVAL; |
| 338 | int is_range_ram; | 338 | int is_range_ram; |
| 339 | struct memtype *entry; | ||
| 339 | 340 | ||
| 340 | if (!pat_enabled) | 341 | if (!pat_enabled) |
| 341 | return 0; | 342 | return 0; |
| @@ -355,17 +356,20 @@ int free_memtype(u64 start, u64 end) | |||
| 355 | } | 356 | } |
| 356 | 357 | ||
| 357 | spin_lock(&memtype_lock); | 358 | spin_lock(&memtype_lock); |
| 358 | err = rbt_memtype_erase(start, end); | 359 | entry = rbt_memtype_erase(start, end); |
| 359 | spin_unlock(&memtype_lock); | 360 | spin_unlock(&memtype_lock); |
| 360 | 361 | ||
| 361 | if (err) { | 362 | if (!entry) { |
| 362 | printk(KERN_INFO "%s:%d freeing invalid memtype %Lx-%Lx\n", | 363 | printk(KERN_INFO "%s:%d freeing invalid memtype %Lx-%Lx\n", |
| 363 | current->comm, current->pid, start, end); | 364 | current->comm, current->pid, start, end); |
| 365 | return -EINVAL; | ||
| 364 | } | 366 | } |
| 365 | 367 | ||
| 368 | kfree(entry); | ||
| 369 | |||
| 366 | dprintk("free_memtype request 0x%Lx-0x%Lx\n", start, end); | 370 | dprintk("free_memtype request 0x%Lx-0x%Lx\n", start, end); |
| 367 | 371 | ||
| 368 | return err; | 372 | return 0; |
| 369 | } | 373 | } |
| 370 | 374 | ||
| 371 | 375 | ||
diff --git a/arch/x86/mm/pat_internal.h b/arch/x86/mm/pat_internal.h index 4f39eefa3e61..77e5ba153fac 100644 --- a/arch/x86/mm/pat_internal.h +++ b/arch/x86/mm/pat_internal.h | |||
| @@ -28,15 +28,15 @@ static inline char *cattr_name(unsigned long flags) | |||
| 28 | #ifdef CONFIG_X86_PAT | 28 | #ifdef CONFIG_X86_PAT |
| 29 | extern int rbt_memtype_check_insert(struct memtype *new, | 29 | extern int rbt_memtype_check_insert(struct memtype *new, |
| 30 | unsigned long *new_type); | 30 | unsigned long *new_type); |
| 31 | extern int rbt_memtype_erase(u64 start, u64 end); | 31 | extern struct memtype *rbt_memtype_erase(u64 start, u64 end); |
| 32 | extern struct memtype *rbt_memtype_lookup(u64 addr); | 32 | extern struct memtype *rbt_memtype_lookup(u64 addr); |
| 33 | extern int rbt_memtype_copy_nth_element(struct memtype *out, loff_t pos); | 33 | extern int rbt_memtype_copy_nth_element(struct memtype *out, loff_t pos); |
| 34 | #else | 34 | #else |
| 35 | static inline int rbt_memtype_check_insert(struct memtype *new, | 35 | static inline int rbt_memtype_check_insert(struct memtype *new, |
| 36 | unsigned long *new_type) | 36 | unsigned long *new_type) |
| 37 | { return 0; } | 37 | { return 0; } |
| 38 | static inline int rbt_memtype_erase(u64 start, u64 end) | 38 | static inline struct memtype *rbt_memtype_erase(u64 start, u64 end) |
| 39 | { return 0; } | 39 | { return NULL; } |
| 40 | static inline struct memtype *rbt_memtype_lookup(u64 addr) | 40 | static inline struct memtype *rbt_memtype_lookup(u64 addr) |
| 41 | { return NULL; } | 41 | { return NULL; } |
| 42 | static inline int rbt_memtype_copy_nth_element(struct memtype *out, loff_t pos) | 42 | static inline int rbt_memtype_copy_nth_element(struct memtype *out, loff_t pos) |
diff --git a/arch/x86/mm/pat_rbtree.c b/arch/x86/mm/pat_rbtree.c index 07de4cb8cc30..f537087bb740 100644 --- a/arch/x86/mm/pat_rbtree.c +++ b/arch/x86/mm/pat_rbtree.c | |||
| @@ -231,16 +231,17 @@ int rbt_memtype_check_insert(struct memtype *new, unsigned long *ret_type) | |||
| 231 | return err; | 231 | return err; |
| 232 | } | 232 | } |
| 233 | 233 | ||
| 234 | int rbt_memtype_erase(u64 start, u64 end) | 234 | struct memtype *rbt_memtype_erase(u64 start, u64 end) |
| 235 | { | 235 | { |
| 236 | struct memtype *data; | 236 | struct memtype *data; |
| 237 | 237 | ||
| 238 | data = memtype_rb_exact_match(&memtype_rbroot, start, end); | 238 | data = memtype_rb_exact_match(&memtype_rbroot, start, end); |
| 239 | if (!data) | 239 | if (!data) |
| 240 | return -EINVAL; | 240 | goto out; |
| 241 | 241 | ||
| 242 | rb_erase(&data->rb, &memtype_rbroot); | 242 | rb_erase(&data->rb, &memtype_rbroot); |
| 243 | return 0; | 243 | out: |
| 244 | return data; | ||
| 244 | } | 245 | } |
| 245 | 246 | ||
| 246 | struct memtype *rbt_memtype_lookup(u64 addr) | 247 | struct memtype *rbt_memtype_lookup(u64 addr) |
diff --git a/arch/x86/mm/pgtable_32.c b/arch/x86/mm/pgtable_32.c index 792854003ed3..cac718499256 100644 --- a/arch/x86/mm/pgtable_32.c +++ b/arch/x86/mm/pgtable_32.c | |||
| @@ -9,7 +9,6 @@ | |||
| 9 | #include <linux/pagemap.h> | 9 | #include <linux/pagemap.h> |
| 10 | #include <linux/spinlock.h> | 10 | #include <linux/spinlock.h> |
| 11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 12 | #include <linux/quicklist.h> | ||
| 13 | 12 | ||
| 14 | #include <asm/system.h> | 13 | #include <asm/system.h> |
| 15 | #include <asm/pgtable.h> | 14 | #include <asm/pgtable.h> |
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 9dcf43d7d0c0..2ec04c424a62 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c | |||
| @@ -207,10 +207,9 @@ get_current_resources(struct acpi_device *device, int busnum, | |||
| 207 | if (!info.res) | 207 | if (!info.res) |
| 208 | goto res_alloc_fail; | 208 | goto res_alloc_fail; |
| 209 | 209 | ||
| 210 | info.name = kmalloc(16, GFP_KERNEL); | 210 | info.name = kasprintf(GFP_KERNEL, "PCI Bus %04x:%02x", domain, busnum); |
| 211 | if (!info.name) | 211 | if (!info.name) |
| 212 | goto name_alloc_fail; | 212 | goto name_alloc_fail; |
| 213 | sprintf(info.name, "PCI Bus %04x:%02x", domain, busnum); | ||
| 214 | 213 | ||
| 215 | info.res_num = 0; | 214 | info.res_num = 0; |
| 216 | acpi_walk_resources(device->handle, METHOD_NAME__CRS, setup_resource, | 215 | acpi_walk_resources(device->handle, METHOD_NAME__CRS, setup_resource, |
diff --git a/lib/atomic64_test.c b/lib/atomic64_test.c index 65e482caf5e9..9087d71537dd 100644 --- a/lib/atomic64_test.c +++ b/lib/atomic64_test.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | * (at your option) any later version. | 9 | * (at your option) any later version. |
| 10 | */ | 10 | */ |
| 11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
| 12 | #include <linux/kernel.h> | ||
| 12 | #include <asm/atomic.h> | 13 | #include <asm/atomic.h> |
| 13 | 14 | ||
| 14 | #define INIT(c) do { atomic64_set(&v, c); r = c; } while (0) | 15 | #define INIT(c) do { atomic64_set(&v, c); r = c; } while (0) |
