diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-05-08 19:59:23 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-05-08 19:59:23 -0400 |
| commit | d9d05fda919cb6414ae4889b696b2fada7a23217 (patch) | |
| tree | 55973380559881adb20b785c49aef6a7494a113f /arch | |
| parent | 825118d1f1ce577224a3e668960717d8fc8ac44e (diff) | |
| parent | e5299926d7459d9fa7c7f856983147817aedb10e (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: MCE: make cmci_discover_lock irq-safe
x86: xen, i386: reserve Xen pagetables
x86, kexec: fix crashdump panic with CONFIG_KEXEC_JUMP
x86-64: finish cleanup_highmaps()'s job wrt. _brk_end
x86: fix boot hang in early_reserve_e820()
x86: Fix a typo in a printk message
x86, srat: do not register nodes beyond e820 map
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_intel_64.c | 10 | ||||
| -rw-r--r-- | arch/x86/kernel/e820.c | 11 | ||||
| -rw-r--r-- | arch/x86/kernel/machine_kexec_32.c | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/machine_kexec_64.c | 4 | ||||
| -rw-r--r-- | arch/x86/mm/init.c | 18 | ||||
| -rw-r--r-- | arch/x86/mm/srat_32.c | 2 | ||||
| -rw-r--r-- | arch/x86/mm/srat_64.c | 1 | ||||
| -rw-r--r-- | arch/x86/xen/mmu.c | 5 |
8 files changed, 40 insertions, 15 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce_intel_64.c b/arch/x86/kernel/cpu/mcheck/mce_intel_64.c index d6b72df89d69..cef3ee30744b 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_intel_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_intel_64.c | |||
| @@ -151,10 +151,11 @@ static void print_update(char *type, int *hdr, int num) | |||
| 151 | static void cmci_discover(int banks, int boot) | 151 | static void cmci_discover(int banks, int boot) |
| 152 | { | 152 | { |
| 153 | unsigned long *owned = (void *)&__get_cpu_var(mce_banks_owned); | 153 | unsigned long *owned = (void *)&__get_cpu_var(mce_banks_owned); |
| 154 | unsigned long flags; | ||
| 154 | int hdr = 0; | 155 | int hdr = 0; |
| 155 | int i; | 156 | int i; |
| 156 | 157 | ||
| 157 | spin_lock(&cmci_discover_lock); | 158 | spin_lock_irqsave(&cmci_discover_lock, flags); |
| 158 | for (i = 0; i < banks; i++) { | 159 | for (i = 0; i < banks; i++) { |
| 159 | u64 val; | 160 | u64 val; |
| 160 | 161 | ||
| @@ -184,7 +185,7 @@ static void cmci_discover(int banks, int boot) | |||
| 184 | WARN_ON(!test_bit(i, __get_cpu_var(mce_poll_banks))); | 185 | WARN_ON(!test_bit(i, __get_cpu_var(mce_poll_banks))); |
| 185 | } | 186 | } |
| 186 | } | 187 | } |
| 187 | spin_unlock(&cmci_discover_lock); | 188 | spin_unlock_irqrestore(&cmci_discover_lock, flags); |
| 188 | if (hdr) | 189 | if (hdr) |
| 189 | printk(KERN_CONT "\n"); | 190 | printk(KERN_CONT "\n"); |
| 190 | } | 191 | } |
| @@ -211,13 +212,14 @@ void cmci_recheck(void) | |||
| 211 | */ | 212 | */ |
| 212 | void cmci_clear(void) | 213 | void cmci_clear(void) |
| 213 | { | 214 | { |
| 215 | unsigned long flags; | ||
| 214 | int i; | 216 | int i; |
| 215 | int banks; | 217 | int banks; |
| 216 | u64 val; | 218 | u64 val; |
| 217 | 219 | ||
| 218 | if (!cmci_supported(&banks)) | 220 | if (!cmci_supported(&banks)) |
| 219 | return; | 221 | return; |
| 220 | spin_lock(&cmci_discover_lock); | 222 | spin_lock_irqsave(&cmci_discover_lock, flags); |
| 221 | for (i = 0; i < banks; i++) { | 223 | for (i = 0; i < banks; i++) { |
| 222 | if (!test_bit(i, __get_cpu_var(mce_banks_owned))) | 224 | if (!test_bit(i, __get_cpu_var(mce_banks_owned))) |
| 223 | continue; | 225 | continue; |
| @@ -227,7 +229,7 @@ void cmci_clear(void) | |||
| 227 | wrmsrl(MSR_IA32_MC0_CTL2 + i, val); | 229 | wrmsrl(MSR_IA32_MC0_CTL2 + i, val); |
| 228 | __clear_bit(i, __get_cpu_var(mce_banks_owned)); | 230 | __clear_bit(i, __get_cpu_var(mce_banks_owned)); |
| 229 | } | 231 | } |
| 230 | spin_unlock(&cmci_discover_lock); | 232 | spin_unlock_irqrestore(&cmci_discover_lock, flags); |
| 231 | } | 233 | } |
| 232 | 234 | ||
| 233 | /* | 235 | /* |
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index ef2c3563357d..006281302925 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
| @@ -1074,12 +1074,13 @@ u64 __init early_reserve_e820(u64 startt, u64 sizet, u64 align) | |||
| 1074 | u64 addr; | 1074 | u64 addr; |
| 1075 | u64 start; | 1075 | u64 start; |
| 1076 | 1076 | ||
| 1077 | start = startt; | 1077 | for (start = startt; ; start += size) { |
| 1078 | while (size < sizet && (start + 1)) | ||
| 1079 | start = find_e820_area_size(start, &size, align); | 1078 | start = find_e820_area_size(start, &size, align); |
| 1080 | 1079 | if (!(start + 1)) | |
| 1081 | if (size < sizet) | 1080 | return 0; |
| 1082 | return 0; | 1081 | if (size >= sizet) |
| 1082 | break; | ||
| 1083 | } | ||
| 1083 | 1084 | ||
| 1084 | #ifdef CONFIG_X86_32 | 1085 | #ifdef CONFIG_X86_32 |
| 1085 | if (start >= MAXMEM) | 1086 | if (start >= MAXMEM) |
diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c index e7368c1da01d..c1c429d00130 100644 --- a/arch/x86/kernel/machine_kexec_32.c +++ b/arch/x86/kernel/machine_kexec_32.c | |||
| @@ -194,7 +194,7 @@ void machine_kexec(struct kimage *image) | |||
| 194 | unsigned int preserve_context); | 194 | unsigned int preserve_context); |
| 195 | 195 | ||
| 196 | #ifdef CONFIG_KEXEC_JUMP | 196 | #ifdef CONFIG_KEXEC_JUMP |
| 197 | if (kexec_image->preserve_context) | 197 | if (image->preserve_context) |
| 198 | save_processor_state(); | 198 | save_processor_state(); |
| 199 | #endif | 199 | #endif |
| 200 | 200 | ||
| @@ -253,7 +253,7 @@ void machine_kexec(struct kimage *image) | |||
| 253 | image->preserve_context); | 253 | image->preserve_context); |
| 254 | 254 | ||
| 255 | #ifdef CONFIG_KEXEC_JUMP | 255 | #ifdef CONFIG_KEXEC_JUMP |
| 256 | if (kexec_image->preserve_context) | 256 | if (image->preserve_context) |
| 257 | restore_processor_state(); | 257 | restore_processor_state(); |
| 258 | #endif | 258 | #endif |
| 259 | 259 | ||
diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c index 89cea4d44679..84c3bf209e98 100644 --- a/arch/x86/kernel/machine_kexec_64.c +++ b/arch/x86/kernel/machine_kexec_64.c | |||
| @@ -274,7 +274,7 @@ void machine_kexec(struct kimage *image) | |||
| 274 | int save_ftrace_enabled; | 274 | int save_ftrace_enabled; |
| 275 | 275 | ||
| 276 | #ifdef CONFIG_KEXEC_JUMP | 276 | #ifdef CONFIG_KEXEC_JUMP |
| 277 | if (kexec_image->preserve_context) | 277 | if (image->preserve_context) |
| 278 | save_processor_state(); | 278 | save_processor_state(); |
| 279 | #endif | 279 | #endif |
| 280 | 280 | ||
| @@ -333,7 +333,7 @@ void machine_kexec(struct kimage *image) | |||
| 333 | image->preserve_context); | 333 | image->preserve_context); |
| 334 | 334 | ||
| 335 | #ifdef CONFIG_KEXEC_JUMP | 335 | #ifdef CONFIG_KEXEC_JUMP |
| 336 | if (kexec_image->preserve_context) | 336 | if (image->preserve_context) |
| 337 | restore_processor_state(); | 337 | restore_processor_state(); |
| 338 | #endif | 338 | #endif |
| 339 | 339 | ||
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index fd3da1dda1c9..ae4f7b5d7104 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <asm/page.h> | 7 | #include <asm/page.h> |
| 8 | #include <asm/page_types.h> | 8 | #include <asm/page_types.h> |
| 9 | #include <asm/sections.h> | 9 | #include <asm/sections.h> |
| 10 | #include <asm/setup.h> | ||
| 10 | #include <asm/system.h> | 11 | #include <asm/system.h> |
| 11 | #include <asm/tlbflush.h> | 12 | #include <asm/tlbflush.h> |
| 12 | 13 | ||
| @@ -304,8 +305,23 @@ unsigned long __init_refok init_memory_mapping(unsigned long start, | |||
| 304 | #endif | 305 | #endif |
| 305 | 306 | ||
| 306 | #ifdef CONFIG_X86_64 | 307 | #ifdef CONFIG_X86_64 |
| 307 | if (!after_bootmem) | 308 | if (!after_bootmem && !start) { |
| 309 | pud_t *pud; | ||
| 310 | pmd_t *pmd; | ||
| 311 | |||
| 308 | mmu_cr4_features = read_cr4(); | 312 | mmu_cr4_features = read_cr4(); |
| 313 | |||
| 314 | /* | ||
| 315 | * _brk_end cannot change anymore, but it and _end may be | ||
| 316 | * located on different 2M pages. cleanup_highmap(), however, | ||
| 317 | * can only consider _end when it runs, so destroy any | ||
| 318 | * mappings beyond _brk_end here. | ||
| 319 | */ | ||
| 320 | pud = pud_offset(pgd_offset_k(_brk_end), _brk_end); | ||
| 321 | pmd = pmd_offset(pud, _brk_end - 1); | ||
| 322 | while (++pmd <= pmd_offset(pud, (unsigned long)_end - 1)) | ||
| 323 | pmd_clear(pmd); | ||
| 324 | } | ||
| 309 | #endif | 325 | #endif |
| 310 | __flush_tlb_all(); | 326 | __flush_tlb_all(); |
| 311 | 327 | ||
diff --git a/arch/x86/mm/srat_32.c b/arch/x86/mm/srat_32.c index 16ae70fc57e7..29a0e37114f8 100644 --- a/arch/x86/mm/srat_32.c +++ b/arch/x86/mm/srat_32.c | |||
| @@ -216,7 +216,7 @@ int __init get_memcfg_from_srat(void) | |||
| 216 | 216 | ||
| 217 | if (num_memory_chunks == 0) { | 217 | if (num_memory_chunks == 0) { |
| 218 | printk(KERN_WARNING | 218 | printk(KERN_WARNING |
| 219 | "could not finy any ACPI SRAT memory areas.\n"); | 219 | "could not find any ACPI SRAT memory areas.\n"); |
| 220 | goto out_fail; | 220 | goto out_fail; |
| 221 | } | 221 | } |
| 222 | 222 | ||
diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c index 33c5fa57e43d..01765955baaf 100644 --- a/arch/x86/mm/srat_64.c +++ b/arch/x86/mm/srat_64.c | |||
| @@ -361,6 +361,7 @@ static void __init unparse_node(int node) | |||
| 361 | { | 361 | { |
| 362 | int i; | 362 | int i; |
| 363 | node_clear(node, nodes_parsed); | 363 | node_clear(node, nodes_parsed); |
| 364 | node_clear(node, cpu_nodes_parsed); | ||
| 364 | for (i = 0; i < MAX_LOCAL_APIC; i++) { | 365 | for (i = 0; i < MAX_LOCAL_APIC; i++) { |
| 365 | if (apicid_to_node[i] == node) | 366 | if (apicid_to_node[i] == node) |
| 366 | apicid_to_node[i] = NUMA_NO_NODE; | 367 | apicid_to_node[i] = NUMA_NO_NODE; |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 9842b1212407..e25a78e1113a 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -1794,6 +1794,11 @@ __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, | |||
| 1794 | 1794 | ||
| 1795 | pin_pagetable_pfn(MMUEXT_PIN_L3_TABLE, PFN_DOWN(__pa(swapper_pg_dir))); | 1795 | pin_pagetable_pfn(MMUEXT_PIN_L3_TABLE, PFN_DOWN(__pa(swapper_pg_dir))); |
| 1796 | 1796 | ||
| 1797 | reserve_early(__pa(xen_start_info->pt_base), | ||
| 1798 | __pa(xen_start_info->pt_base + | ||
| 1799 | xen_start_info->nr_pt_frames * PAGE_SIZE), | ||
| 1800 | "XEN PAGETABLES"); | ||
| 1801 | |||
| 1797 | return swapper_pg_dir; | 1802 | return swapper_pg_dir; |
| 1798 | } | 1803 | } |
| 1799 | #endif /* CONFIG_X86_64 */ | 1804 | #endif /* CONFIG_X86_64 */ |
