diff options
| -rw-r--r-- | arch/x86/kernel/amd_iommu.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/addon_cpuid_features.c | 17 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cyrix.c | 18 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mtrr/generic.c | 20 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mtrr/main.c | 5 | ||||
| -rw-r--r-- | arch/x86/kernel/genx2apic_uv_x.c | 8 | ||||
| -rw-r--r-- | arch/x86/kernel/numaq_32.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/paravirt.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/pci-calgary_64.c | 14 | ||||
| -rw-r--r-- | arch/x86/kernel/setup.c | 16 | ||||
| -rw-r--r-- | arch/x86/kernel/smpboot.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/tlb_uv.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/tsc_sync.c | 6 | ||||
| -rw-r--r-- | arch/x86/mm/init_64.c | 36 | ||||
| -rw-r--r-- | arch/x86/mm/ioremap.c | 8 | ||||
| -rw-r--r-- | arch/x86/mm/mmio-mod.c | 4 | ||||
| -rw-r--r-- | arch/x86/mm/pageattr.c | 6 | ||||
| -rw-r--r-- | arch/x86/mm/pat.c | 50 | ||||
| -rw-r--r-- | arch/x86/oprofile/nmi_int.c | 39 | ||||
| -rw-r--r-- | include/asm-x86/genapic_32.h | 1 | ||||
| -rw-r--r-- | include/asm-x86/genapic_64.h | 1 | ||||
| -rw-r--r-- | include/asm-x86/irq_vectors.h | 1 | ||||
| -rw-r--r-- | include/asm-x86/uv/uv_bau.h | 5 |
23 files changed, 168 insertions, 99 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index de39e1f2ede5..69b4d060b21c 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -65,7 +65,7 @@ static int __iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd) | |||
| 65 | u8 *target; | 65 | u8 *target; |
| 66 | 66 | ||
| 67 | tail = readl(iommu->mmio_base + MMIO_CMD_TAIL_OFFSET); | 67 | tail = readl(iommu->mmio_base + MMIO_CMD_TAIL_OFFSET); |
| 68 | target = (iommu->cmd_buf + tail); | 68 | target = iommu->cmd_buf + tail; |
| 69 | memcpy_toio(target, cmd, sizeof(*cmd)); | 69 | memcpy_toio(target, cmd, sizeof(*cmd)); |
| 70 | tail = (tail + sizeof(*cmd)) % iommu->cmd_buf_size; | 70 | tail = (tail + sizeof(*cmd)) % iommu->cmd_buf_size; |
| 71 | head = readl(iommu->mmio_base + MMIO_CMD_HEAD_OFFSET); | 71 | head = readl(iommu->mmio_base + MMIO_CMD_HEAD_OFFSET); |
diff --git a/arch/x86/kernel/cpu/addon_cpuid_features.c b/arch/x86/kernel/cpu/addon_cpuid_features.c index 84a8220a6072..a6ef672adbba 100644 --- a/arch/x86/kernel/cpu/addon_cpuid_features.c +++ b/arch/x86/kernel/cpu/addon_cpuid_features.c | |||
| @@ -56,9 +56,22 @@ void __cpuinit validate_pat_support(struct cpuinfo_x86 *c) | |||
| 56 | 56 | ||
| 57 | switch (c->x86_vendor) { | 57 | switch (c->x86_vendor) { |
| 58 | case X86_VENDOR_INTEL: | 58 | case X86_VENDOR_INTEL: |
| 59 | if (c->x86 == 0xF || (c->x86 == 6 && c->x86_model >= 15)) | 59 | /* |
| 60 | * There is a known erratum on Pentium III and Core Solo | ||
| 61 | * and Core Duo CPUs. | ||
| 62 | * " Page with PAT set to WC while associated MTRR is UC | ||
| 63 | * may consolidate to UC " | ||
| 64 | * Because of this erratum, it is better to stick with | ||
| 65 | * setting WC in MTRR rather than using PAT on these CPUs. | ||
| 66 | * | ||
| 67 | * Enable PAT WC only on P4, Core 2 or later CPUs. | ||
| 68 | */ | ||
| 69 | if (c->x86 > 0x6 || (c->x86 == 6 && c->x86_model >= 15)) | ||
| 60 | return; | 70 | return; |
| 61 | break; | 71 | |
| 72 | pat_disable("PAT WC disabled due to known CPU erratum."); | ||
| 73 | return; | ||
| 74 | |||
| 62 | case X86_VENDOR_AMD: | 75 | case X86_VENDOR_AMD: |
| 63 | case X86_VENDOR_CENTAUR: | 76 | case X86_VENDOR_CENTAUR: |
| 64 | case X86_VENDOR_TRANSMETA: | 77 | case X86_VENDOR_TRANSMETA: |
diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c index 3fd7a67bb06a..e710a21bb6e8 100644 --- a/arch/x86/kernel/cpu/cyrix.c +++ b/arch/x86/kernel/cpu/cyrix.c | |||
| @@ -134,23 +134,6 @@ static void __cpuinit set_cx86_memwb(void) | |||
| 134 | setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x14); | 134 | setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x14); |
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | static void __cpuinit set_cx86_inc(void) | ||
| 138 | { | ||
| 139 | unsigned char ccr3; | ||
| 140 | |||
| 141 | printk(KERN_INFO "Enable Incrementor on Cyrix/NSC processor.\n"); | ||
| 142 | |||
| 143 | ccr3 = getCx86(CX86_CCR3); | ||
| 144 | setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); /* enable MAPEN */ | ||
| 145 | /* PCR1 -- Performance Control */ | ||
| 146 | /* Incrementor on, whatever that is */ | ||
| 147 | setCx86(CX86_PCR1, getCx86(CX86_PCR1) | 0x02); | ||
| 148 | /* PCR0 -- Performance Control */ | ||
| 149 | /* Incrementor Margin 10 */ | ||
| 150 | setCx86(CX86_PCR0, getCx86(CX86_PCR0) | 0x04); | ||
| 151 | setCx86(CX86_CCR3, ccr3); /* disable MAPEN */ | ||
| 152 | } | ||
| 153 | |||
| 154 | /* | 137 | /* |
| 155 | * Configure later MediaGX and/or Geode processor. | 138 | * Configure later MediaGX and/or Geode processor. |
| 156 | */ | 139 | */ |
| @@ -174,7 +157,6 @@ static void __cpuinit geode_configure(void) | |||
| 174 | 157 | ||
| 175 | set_cx86_memwb(); | 158 | set_cx86_memwb(); |
| 176 | set_cx86_reorder(); | 159 | set_cx86_reorder(); |
| 177 | set_cx86_inc(); | ||
| 178 | 160 | ||
| 179 | local_irq_restore(flags); | 161 | local_irq_restore(flags); |
| 180 | } | 162 | } |
diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c index 509bd3d9eacd..cb7d3b6a80eb 100644 --- a/arch/x86/kernel/cpu/mtrr/generic.c +++ b/arch/x86/kernel/cpu/mtrr/generic.c | |||
| @@ -379,6 +379,7 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base, | |||
| 379 | unsigned long *size, mtrr_type *type) | 379 | unsigned long *size, mtrr_type *type) |
| 380 | { | 380 | { |
| 381 | unsigned int mask_lo, mask_hi, base_lo, base_hi; | 381 | unsigned int mask_lo, mask_hi, base_lo, base_hi; |
| 382 | unsigned int tmp, hi; | ||
| 382 | 383 | ||
| 383 | rdmsr(MTRRphysMask_MSR(reg), mask_lo, mask_hi); | 384 | rdmsr(MTRRphysMask_MSR(reg), mask_lo, mask_hi); |
| 384 | if ((mask_lo & 0x800) == 0) { | 385 | if ((mask_lo & 0x800) == 0) { |
| @@ -392,8 +393,23 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base, | |||
| 392 | rdmsr(MTRRphysBase_MSR(reg), base_lo, base_hi); | 393 | rdmsr(MTRRphysBase_MSR(reg), base_lo, base_hi); |
| 393 | 394 | ||
| 394 | /* Work out the shifted address mask. */ | 395 | /* Work out the shifted address mask. */ |
| 395 | mask_lo = size_or_mask | mask_hi << (32 - PAGE_SHIFT) | 396 | tmp = mask_hi << (32 - PAGE_SHIFT) | mask_lo >> PAGE_SHIFT; |
| 396 | | mask_lo >> PAGE_SHIFT; | 397 | mask_lo = size_or_mask | tmp; |
| 398 | /* Expand tmp with high bits to all 1s*/ | ||
| 399 | hi = fls(tmp); | ||
| 400 | if (hi > 0) { | ||
| 401 | tmp |= ~((1<<(hi - 1)) - 1); | ||
| 402 | |||
| 403 | if (tmp != mask_lo) { | ||
| 404 | static int once = 1; | ||
| 405 | |||
| 406 | if (once) { | ||
| 407 | printk(KERN_INFO "mtrr: your BIOS has set up an incorrect mask, fixing it up.\n"); | ||
| 408 | once = 0; | ||
| 409 | } | ||
| 410 | mask_lo = tmp; | ||
| 411 | } | ||
| 412 | } | ||
| 397 | 413 | ||
| 398 | /* This works correctly if size is a power of two, i.e. a | 414 | /* This works correctly if size is a power of two, i.e. a |
| 399 | contiguous range. */ | 415 | contiguous range. */ |
diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c index 6f23969c8faf..b117d7f8a564 100644 --- a/arch/x86/kernel/cpu/mtrr/main.c +++ b/arch/x86/kernel/cpu/mtrr/main.c | |||
| @@ -1496,11 +1496,8 @@ int __init mtrr_trim_uncached_memory(unsigned long end_pfn) | |||
| 1496 | 1496 | ||
| 1497 | /* kvm/qemu doesn't have mtrr set right, don't trim them all */ | 1497 | /* kvm/qemu doesn't have mtrr set right, don't trim them all */ |
| 1498 | if (!highest_pfn) { | 1498 | if (!highest_pfn) { |
| 1499 | if (!kvm_para_available()) { | 1499 | WARN(!kvm_para_available(), KERN_WARNING |
| 1500 | printk(KERN_WARNING | ||
| 1501 | "WARNING: strange, CPU MTRRs all blank?\n"); | 1500 | "WARNING: strange, CPU MTRRs all blank?\n"); |
| 1502 | WARN_ON(1); | ||
| 1503 | } | ||
| 1504 | return 0; | 1501 | return 0; |
| 1505 | } | 1502 | } |
| 1506 | 1503 | ||
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c index 2d7e307c7779..bfa837cb16be 100644 --- a/arch/x86/kernel/genx2apic_uv_x.c +++ b/arch/x86/kernel/genx2apic_uv_x.c | |||
| @@ -293,7 +293,9 @@ static __init void uv_rtc_init(void) | |||
| 293 | sn_rtc_cycles_per_second = ticks_per_sec; | 293 | sn_rtc_cycles_per_second = ticks_per_sec; |
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | static __init void uv_system_init(void) | 296 | static bool uv_system_inited; |
| 297 | |||
| 298 | void __init uv_system_init(void) | ||
| 297 | { | 299 | { |
| 298 | union uvh_si_addr_map_config_u m_n_config; | 300 | union uvh_si_addr_map_config_u m_n_config; |
| 299 | union uvh_node_id_u node_id; | 301 | union uvh_node_id_u node_id; |
| @@ -383,6 +385,7 @@ static __init void uv_system_init(void) | |||
| 383 | map_mmr_high(max_pnode); | 385 | map_mmr_high(max_pnode); |
| 384 | map_config_high(max_pnode); | 386 | map_config_high(max_pnode); |
| 385 | map_mmioh_high(max_pnode); | 387 | map_mmioh_high(max_pnode); |
| 388 | uv_system_inited = true; | ||
| 386 | } | 389 | } |
| 387 | 390 | ||
| 388 | /* | 391 | /* |
| @@ -391,8 +394,7 @@ static __init void uv_system_init(void) | |||
| 391 | */ | 394 | */ |
| 392 | void __cpuinit uv_cpu_init(void) | 395 | void __cpuinit uv_cpu_init(void) |
| 393 | { | 396 | { |
| 394 | if (!uv_node_to_blade) | 397 | BUG_ON(!uv_system_inited); |
| 395 | uv_system_init(); | ||
| 396 | 398 | ||
| 397 | uv_blade_info[uv_numa_blade_id()].nr_online_cpus++; | 399 | uv_blade_info[uv_numa_blade_id()].nr_online_cpus++; |
| 398 | 400 | ||
diff --git a/arch/x86/kernel/numaq_32.c b/arch/x86/kernel/numaq_32.c index b8c45610b20a..eecc8c18f010 100644 --- a/arch/x86/kernel/numaq_32.c +++ b/arch/x86/kernel/numaq_32.c | |||
| @@ -73,7 +73,7 @@ static void __init smp_dump_qct(void) | |||
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | 75 | ||
| 76 | void __init numaq_tsc_disable(void) | 76 | void __cpuinit numaq_tsc_disable(void) |
| 77 | { | 77 | { |
| 78 | if (!found_numaq) | 78 | if (!found_numaq) |
| 79 | return; | 79 | return; |
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index 94da4d52d798..300da17e61cb 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c | |||
| @@ -471,7 +471,7 @@ struct pv_lock_ops pv_lock_ops = { | |||
| 471 | .spin_unlock = __ticket_spin_unlock, | 471 | .spin_unlock = __ticket_spin_unlock, |
| 472 | #endif | 472 | #endif |
| 473 | }; | 473 | }; |
| 474 | EXPORT_SYMBOL_GPL(pv_lock_ops); | 474 | EXPORT_SYMBOL(pv_lock_ops); |
| 475 | 475 | ||
| 476 | EXPORT_SYMBOL_GPL(pv_time_ops); | 476 | EXPORT_SYMBOL_GPL(pv_time_ops); |
| 477 | EXPORT_SYMBOL (pv_cpu_ops); | 477 | EXPORT_SYMBOL (pv_cpu_ops); |
diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index 218d783ed7a8..dcdac6c826e9 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c | |||
| @@ -343,9 +343,8 @@ static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr, | |||
| 343 | /* were we called with bad_dma_address? */ | 343 | /* were we called with bad_dma_address? */ |
| 344 | badend = bad_dma_address + (EMERGENCY_PAGES * PAGE_SIZE); | 344 | badend = bad_dma_address + (EMERGENCY_PAGES * PAGE_SIZE); |
| 345 | if (unlikely((dma_addr >= bad_dma_address) && (dma_addr < badend))) { | 345 | if (unlikely((dma_addr >= bad_dma_address) && (dma_addr < badend))) { |
| 346 | printk(KERN_ERR "Calgary: driver tried unmapping bad DMA " | 346 | WARN(1, KERN_ERR "Calgary: driver tried unmapping bad DMA " |
| 347 | "address 0x%Lx\n", dma_addr); | 347 | "address 0x%Lx\n", dma_addr); |
| 348 | WARN_ON(1); | ||
| 349 | return; | 348 | return; |
| 350 | } | 349 | } |
| 351 | 350 | ||
| @@ -1269,13 +1268,15 @@ static inline int __init determine_tce_table_size(u64 ram) | |||
| 1269 | static int __init build_detail_arrays(void) | 1268 | static int __init build_detail_arrays(void) |
| 1270 | { | 1269 | { |
| 1271 | unsigned long ptr; | 1270 | unsigned long ptr; |
| 1272 | int i, scal_detail_size, rio_detail_size; | 1271 | unsigned numnodes, i; |
| 1272 | int scal_detail_size, rio_detail_size; | ||
| 1273 | 1273 | ||
| 1274 | if (rio_table_hdr->num_scal_dev > MAX_NUMNODES){ | 1274 | numnodes = rio_table_hdr->num_scal_dev; |
| 1275 | if (numnodes > MAX_NUMNODES){ | ||
| 1275 | printk(KERN_WARNING | 1276 | printk(KERN_WARNING |
| 1276 | "Calgary: MAX_NUMNODES too low! Defined as %d, " | 1277 | "Calgary: MAX_NUMNODES too low! Defined as %d, " |
| 1277 | "but system has %d nodes.\n", | 1278 | "but system has %d nodes.\n", |
| 1278 | MAX_NUMNODES, rio_table_hdr->num_scal_dev); | 1279 | MAX_NUMNODES, numnodes); |
| 1279 | return -ENODEV; | 1280 | return -ENODEV; |
| 1280 | } | 1281 | } |
| 1281 | 1282 | ||
| @@ -1296,8 +1297,7 @@ static int __init build_detail_arrays(void) | |||
| 1296 | } | 1297 | } |
| 1297 | 1298 | ||
| 1298 | ptr = ((unsigned long)rio_table_hdr) + 3; | 1299 | ptr = ((unsigned long)rio_table_hdr) + 3; |
| 1299 | for (i = 0; i < rio_table_hdr->num_scal_dev; | 1300 | for (i = 0; i < numnodes; i++, ptr += scal_detail_size) |
| 1300 | i++, ptr += scal_detail_size) | ||
| 1301 | scal_devs[i] = (struct scal_detail *)ptr; | 1301 | scal_devs[i] = (struct scal_detail *)ptr; |
| 1302 | 1302 | ||
| 1303 | for (i = 0; i < rio_table_hdr->num_rio_dev; | 1303 | for (i = 0; i < rio_table_hdr->num_rio_dev; |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index a4656adab53b..362d4e7f2d38 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -604,14 +604,6 @@ void __init setup_arch(char **cmdline_p) | |||
| 604 | early_cpu_init(); | 604 | early_cpu_init(); |
| 605 | early_ioremap_init(); | 605 | early_ioremap_init(); |
| 606 | 606 | ||
| 607 | #if defined(CONFIG_VMI) && defined(CONFIG_X86_32) | ||
| 608 | /* | ||
| 609 | * Must be before kernel pagetables are setup | ||
| 610 | * or fixmap area is touched. | ||
| 611 | */ | ||
| 612 | vmi_init(); | ||
| 613 | #endif | ||
| 614 | |||
| 615 | ROOT_DEV = old_decode_dev(boot_params.hdr.root_dev); | 607 | ROOT_DEV = old_decode_dev(boot_params.hdr.root_dev); |
| 616 | screen_info = boot_params.screen_info; | 608 | screen_info = boot_params.screen_info; |
| 617 | edid_info = boot_params.edid_info; | 609 | edid_info = boot_params.edid_info; |
| @@ -678,6 +670,14 @@ void __init setup_arch(char **cmdline_p) | |||
| 678 | 670 | ||
| 679 | parse_early_param(); | 671 | parse_early_param(); |
| 680 | 672 | ||
| 673 | #if defined(CONFIG_VMI) && defined(CONFIG_X86_32) | ||
| 674 | /* | ||
| 675 | * Must be before kernel pagetables are setup | ||
| 676 | * or fixmap area is touched. | ||
| 677 | */ | ||
| 678 | vmi_init(); | ||
| 679 | #endif | ||
| 680 | |||
| 681 | /* after early param, so could get panic from serial */ | 681 | /* after early param, so could get panic from serial */ |
| 682 | reserve_early_setup_data(); | 682 | reserve_early_setup_data(); |
| 683 | 683 | ||
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index e139e617f422..7985c5b3f916 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -1221,6 +1221,9 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus) | |||
| 1221 | printk(KERN_INFO "CPU%d: ", 0); | 1221 | printk(KERN_INFO "CPU%d: ", 0); |
| 1222 | print_cpu_info(&cpu_data(0)); | 1222 | print_cpu_info(&cpu_data(0)); |
| 1223 | setup_boot_clock(); | 1223 | setup_boot_clock(); |
| 1224 | |||
| 1225 | if (is_uv_system()) | ||
| 1226 | uv_system_init(); | ||
| 1224 | out: | 1227 | out: |
| 1225 | preempt_enable(); | 1228 | preempt_enable(); |
| 1226 | } | 1229 | } |
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index d0fbb7712ab0..8b8c0d6640fa 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <asm/genapic.h> | 17 | #include <asm/genapic.h> |
| 18 | #include <asm/idle.h> | 18 | #include <asm/idle.h> |
| 19 | #include <asm/tsc.h> | 19 | #include <asm/tsc.h> |
| 20 | #include <asm/irq_vectors.h> | ||
| 20 | 21 | ||
| 21 | #include <mach_apic.h> | 22 | #include <mach_apic.h> |
| 22 | 23 | ||
| @@ -783,7 +784,7 @@ static int __init uv_bau_init(void) | |||
| 783 | uv_init_blade(blade, node, cur_cpu); | 784 | uv_init_blade(blade, node, cur_cpu); |
| 784 | cur_cpu += uv_blade_nr_possible_cpus(blade); | 785 | cur_cpu += uv_blade_nr_possible_cpus(blade); |
| 785 | } | 786 | } |
| 786 | set_intr_gate(UV_BAU_MESSAGE, uv_bau_message_intr1); | 787 | alloc_intr_gate(UV_BAU_MESSAGE, uv_bau_message_intr1); |
| 787 | uv_enable_timeouts(); | 788 | uv_enable_timeouts(); |
| 788 | 789 | ||
| 789 | return 0; | 790 | return 0; |
diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c index 0577825cf89b..9ffb01c31c40 100644 --- a/arch/x86/kernel/tsc_sync.c +++ b/arch/x86/kernel/tsc_sync.c | |||
| @@ -88,11 +88,9 @@ static __cpuinit void check_tsc_warp(void) | |||
| 88 | __raw_spin_unlock(&sync_lock); | 88 | __raw_spin_unlock(&sync_lock); |
| 89 | } | 89 | } |
| 90 | } | 90 | } |
| 91 | if (!(now-start)) { | 91 | WARN(!(now-start), |
| 92 | printk("Warning: zero tsc calibration delta: %Ld [max: %Ld]\n", | 92 | "Warning: zero tsc calibration delta: %Ld [max: %Ld]\n", |
| 93 | now-start, end-start); | 93 | now-start, end-start); |
| 94 | WARN_ON(1); | ||
| 95 | } | ||
| 96 | } | 94 | } |
| 97 | 95 | ||
| 98 | /* | 96 | /* |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index a87ea0e4b3dc..d3746efb060d 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
| @@ -241,7 +241,7 @@ static unsigned long __initdata table_start; | |||
| 241 | static unsigned long __meminitdata table_end; | 241 | static unsigned long __meminitdata table_end; |
| 242 | static unsigned long __meminitdata table_top; | 242 | static unsigned long __meminitdata table_top; |
| 243 | 243 | ||
| 244 | static __meminit void *alloc_low_page(unsigned long *phys) | 244 | static __ref void *alloc_low_page(unsigned long *phys) |
| 245 | { | 245 | { |
| 246 | unsigned long pfn = table_end++; | 246 | unsigned long pfn = table_end++; |
| 247 | void *adr; | 247 | void *adr; |
| @@ -262,7 +262,7 @@ static __meminit void *alloc_low_page(unsigned long *phys) | |||
| 262 | return adr; | 262 | return adr; |
| 263 | } | 263 | } |
| 264 | 264 | ||
| 265 | static __meminit void unmap_low_page(void *adr) | 265 | static __ref void unmap_low_page(void *adr) |
| 266 | { | 266 | { |
| 267 | if (after_bootmem) | 267 | if (after_bootmem) |
| 268 | return; | 268 | return; |
| @@ -336,9 +336,12 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end, | |||
| 336 | } | 336 | } |
| 337 | 337 | ||
| 338 | if (pmd_val(*pmd)) { | 338 | if (pmd_val(*pmd)) { |
| 339 | if (!pmd_large(*pmd)) | 339 | if (!pmd_large(*pmd)) { |
| 340 | spin_lock(&init_mm.page_table_lock); | ||
| 340 | last_map_addr = phys_pte_update(pmd, address, | 341 | last_map_addr = phys_pte_update(pmd, address, |
| 341 | end); | 342 | end); |
| 343 | spin_unlock(&init_mm.page_table_lock); | ||
| 344 | } | ||
| 342 | /* Count entries we're using from level2_ident_pgt */ | 345 | /* Count entries we're using from level2_ident_pgt */ |
| 343 | if (start == 0) | 346 | if (start == 0) |
| 344 | pages++; | 347 | pages++; |
| @@ -347,8 +350,10 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end, | |||
| 347 | 350 | ||
| 348 | if (page_size_mask & (1<<PG_LEVEL_2M)) { | 351 | if (page_size_mask & (1<<PG_LEVEL_2M)) { |
| 349 | pages++; | 352 | pages++; |
| 353 | spin_lock(&init_mm.page_table_lock); | ||
| 350 | set_pte((pte_t *)pmd, | 354 | set_pte((pte_t *)pmd, |
| 351 | pfn_pte(address >> PAGE_SHIFT, PAGE_KERNEL_LARGE)); | 355 | pfn_pte(address >> PAGE_SHIFT, PAGE_KERNEL_LARGE)); |
| 356 | spin_unlock(&init_mm.page_table_lock); | ||
| 352 | last_map_addr = (address & PMD_MASK) + PMD_SIZE; | 357 | last_map_addr = (address & PMD_MASK) + PMD_SIZE; |
| 353 | continue; | 358 | continue; |
| 354 | } | 359 | } |
| @@ -357,7 +362,9 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end, | |||
| 357 | last_map_addr = phys_pte_init(pte, address, end); | 362 | last_map_addr = phys_pte_init(pte, address, end); |
| 358 | unmap_low_page(pte); | 363 | unmap_low_page(pte); |
| 359 | 364 | ||
| 365 | spin_lock(&init_mm.page_table_lock); | ||
| 360 | pmd_populate_kernel(&init_mm, pmd, __va(pte_phys)); | 366 | pmd_populate_kernel(&init_mm, pmd, __va(pte_phys)); |
| 367 | spin_unlock(&init_mm.page_table_lock); | ||
| 361 | } | 368 | } |
| 362 | update_page_count(PG_LEVEL_2M, pages); | 369 | update_page_count(PG_LEVEL_2M, pages); |
| 363 | return last_map_addr; | 370 | return last_map_addr; |
| @@ -370,9 +377,7 @@ phys_pmd_update(pud_t *pud, unsigned long address, unsigned long end, | |||
| 370 | pmd_t *pmd = pmd_offset(pud, 0); | 377 | pmd_t *pmd = pmd_offset(pud, 0); |
| 371 | unsigned long last_map_addr; | 378 | unsigned long last_map_addr; |
| 372 | 379 | ||
| 373 | spin_lock(&init_mm.page_table_lock); | ||
| 374 | last_map_addr = phys_pmd_init(pmd, address, end, page_size_mask); | 380 | last_map_addr = phys_pmd_init(pmd, address, end, page_size_mask); |
| 375 | spin_unlock(&init_mm.page_table_lock); | ||
| 376 | __flush_tlb_all(); | 381 | __flush_tlb_all(); |
| 377 | return last_map_addr; | 382 | return last_map_addr; |
| 378 | } | 383 | } |
| @@ -408,20 +413,21 @@ phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end, | |||
| 408 | 413 | ||
| 409 | if (page_size_mask & (1<<PG_LEVEL_1G)) { | 414 | if (page_size_mask & (1<<PG_LEVEL_1G)) { |
| 410 | pages++; | 415 | pages++; |
| 416 | spin_lock(&init_mm.page_table_lock); | ||
| 411 | set_pte((pte_t *)pud, | 417 | set_pte((pte_t *)pud, |
| 412 | pfn_pte(addr >> PAGE_SHIFT, PAGE_KERNEL_LARGE)); | 418 | pfn_pte(addr >> PAGE_SHIFT, PAGE_KERNEL_LARGE)); |
| 419 | spin_unlock(&init_mm.page_table_lock); | ||
| 413 | last_map_addr = (addr & PUD_MASK) + PUD_SIZE; | 420 | last_map_addr = (addr & PUD_MASK) + PUD_SIZE; |
| 414 | continue; | 421 | continue; |
| 415 | } | 422 | } |
| 416 | 423 | ||
| 417 | pmd = alloc_low_page(&pmd_phys); | 424 | pmd = alloc_low_page(&pmd_phys); |
| 418 | |||
| 419 | spin_lock(&init_mm.page_table_lock); | ||
| 420 | last_map_addr = phys_pmd_init(pmd, addr, end, page_size_mask); | 425 | last_map_addr = phys_pmd_init(pmd, addr, end, page_size_mask); |
| 421 | unmap_low_page(pmd); | 426 | unmap_low_page(pmd); |
| 427 | |||
| 428 | spin_lock(&init_mm.page_table_lock); | ||
| 422 | pud_populate(&init_mm, pud, __va(pmd_phys)); | 429 | pud_populate(&init_mm, pud, __va(pmd_phys)); |
| 423 | spin_unlock(&init_mm.page_table_lock); | 430 | spin_unlock(&init_mm.page_table_lock); |
| 424 | |||
| 425 | } | 431 | } |
| 426 | __flush_tlb_all(); | 432 | __flush_tlb_all(); |
| 427 | update_page_count(PG_LEVEL_1G, pages); | 433 | update_page_count(PG_LEVEL_1G, pages); |
| @@ -513,16 +519,14 @@ static unsigned long __init kernel_physical_mapping_init(unsigned long start, | |||
| 513 | continue; | 519 | continue; |
| 514 | } | 520 | } |
| 515 | 521 | ||
| 516 | if (after_bootmem) | 522 | pud = alloc_low_page(&pud_phys); |
| 517 | pud = pud_offset(pgd, start & PGDIR_MASK); | ||
| 518 | else | ||
| 519 | pud = alloc_low_page(&pud_phys); | ||
| 520 | |||
| 521 | last_map_addr = phys_pud_init(pud, __pa(start), __pa(next), | 523 | last_map_addr = phys_pud_init(pud, __pa(start), __pa(next), |
| 522 | page_size_mask); | 524 | page_size_mask); |
| 523 | unmap_low_page(pud); | 525 | unmap_low_page(pud); |
| 524 | pgd_populate(&init_mm, pgd_offset_k(start), | 526 | |
| 525 | __va(pud_phys)); | 527 | spin_lock(&init_mm.page_table_lock); |
| 528 | pgd_populate(&init_mm, pgd, __va(pud_phys)); | ||
| 529 | spin_unlock(&init_mm.page_table_lock); | ||
| 526 | } | 530 | } |
| 527 | 531 | ||
| 528 | return last_map_addr; | 532 | return last_map_addr; |
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 6ba6f889c79d..d4b6e6a29ae3 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
| @@ -553,13 +553,11 @@ static int __init check_early_ioremap_leak(void) | |||
| 553 | { | 553 | { |
| 554 | if (!early_ioremap_nested) | 554 | if (!early_ioremap_nested) |
| 555 | return 0; | 555 | return 0; |
| 556 | 556 | WARN(1, KERN_WARNING | |
| 557 | printk(KERN_WARNING | ||
| 558 | "Debug warning: early ioremap leak of %d areas detected.\n", | 557 | "Debug warning: early ioremap leak of %d areas detected.\n", |
| 559 | early_ioremap_nested); | 558 | early_ioremap_nested); |
| 560 | printk(KERN_WARNING | 559 | printk(KERN_WARNING |
| 561 | "please boot with early_ioremap_debug and report the dmesg.\n"); | 560 | "please boot with early_ioremap_debug and report the dmesg.\n"); |
| 562 | WARN_ON(1); | ||
| 563 | 561 | ||
| 564 | return 1; | 562 | return 1; |
| 565 | } | 563 | } |
diff --git a/arch/x86/mm/mmio-mod.c b/arch/x86/mm/mmio-mod.c index e7397e108beb..635b50e85581 100644 --- a/arch/x86/mm/mmio-mod.c +++ b/arch/x86/mm/mmio-mod.c | |||
| @@ -430,7 +430,9 @@ static void enter_uniprocessor(void) | |||
| 430 | "may miss events.\n"); | 430 | "may miss events.\n"); |
| 431 | } | 431 | } |
| 432 | 432 | ||
| 433 | static void leave_uniprocessor(void) | 433 | /* __ref because leave_uniprocessor calls cpu_up which is __cpuinit, |
| 434 | but this whole function is ifdefed CONFIG_HOTPLUG_CPU */ | ||
| 435 | static void __ref leave_uniprocessor(void) | ||
| 434 | { | 436 | { |
| 435 | int cpu; | 437 | int cpu; |
| 436 | int err; | 438 | int err; |
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index f5f5154ea11e..43e2f8483e4f 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
| @@ -849,7 +849,7 @@ int set_memory_uc(unsigned long addr, int numpages) | |||
| 849 | /* | 849 | /* |
| 850 | * for now UC MINUS. see comments in ioremap_nocache() | 850 | * for now UC MINUS. see comments in ioremap_nocache() |
| 851 | */ | 851 | */ |
| 852 | if (reserve_memtype(addr, addr + numpages * PAGE_SIZE, | 852 | if (reserve_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE, |
| 853 | _PAGE_CACHE_UC_MINUS, NULL)) | 853 | _PAGE_CACHE_UC_MINUS, NULL)) |
| 854 | return -EINVAL; | 854 | return -EINVAL; |
| 855 | 855 | ||
| @@ -868,7 +868,7 @@ int set_memory_wc(unsigned long addr, int numpages) | |||
| 868 | if (!pat_enabled) | 868 | if (!pat_enabled) |
| 869 | return set_memory_uc(addr, numpages); | 869 | return set_memory_uc(addr, numpages); |
| 870 | 870 | ||
| 871 | if (reserve_memtype(addr, addr + numpages * PAGE_SIZE, | 871 | if (reserve_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE, |
| 872 | _PAGE_CACHE_WC, NULL)) | 872 | _PAGE_CACHE_WC, NULL)) |
| 873 | return -EINVAL; | 873 | return -EINVAL; |
| 874 | 874 | ||
| @@ -884,7 +884,7 @@ int _set_memory_wb(unsigned long addr, int numpages) | |||
| 884 | 884 | ||
| 885 | int set_memory_wb(unsigned long addr, int numpages) | 885 | int set_memory_wb(unsigned long addr, int numpages) |
| 886 | { | 886 | { |
| 887 | free_memtype(addr, addr + numpages * PAGE_SIZE); | 887 | free_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE); |
| 888 | 888 | ||
| 889 | return _set_memory_wb(addr, numpages); | 889 | return _set_memory_wb(addr, numpages); |
| 890 | } | 890 | } |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index 2fe30916d4b6..2a50e0fa64a5 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
| @@ -207,6 +207,9 @@ static int chk_conflict(struct memtype *new, struct memtype *entry, | |||
| 207 | return -EBUSY; | 207 | return -EBUSY; |
| 208 | } | 208 | } |
| 209 | 209 | ||
| 210 | static struct memtype *cached_entry; | ||
| 211 | static u64 cached_start; | ||
| 212 | |||
| 210 | /* | 213 | /* |
| 211 | * req_type typically has one of the: | 214 | * req_type typically has one of the: |
| 212 | * - _PAGE_CACHE_WB | 215 | * - _PAGE_CACHE_WB |
| @@ -280,11 +283,17 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
| 280 | 283 | ||
| 281 | spin_lock(&memtype_lock); | 284 | spin_lock(&memtype_lock); |
| 282 | 285 | ||
| 286 | if (cached_entry && start >= cached_start) | ||
| 287 | entry = cached_entry; | ||
| 288 | else | ||
| 289 | entry = list_entry(&memtype_list, struct memtype, nd); | ||
| 290 | |||
| 283 | /* Search for existing mapping that overlaps the current range */ | 291 | /* Search for existing mapping that overlaps the current range */ |
| 284 | where = NULL; | 292 | where = NULL; |
| 285 | list_for_each_entry(entry, &memtype_list, nd) { | 293 | list_for_each_entry_continue(entry, &memtype_list, nd) { |
| 286 | if (end <= entry->start) { | 294 | if (end <= entry->start) { |
| 287 | where = entry->nd.prev; | 295 | where = entry->nd.prev; |
| 296 | cached_entry = list_entry(where, struct memtype, nd); | ||
| 288 | break; | 297 | break; |
| 289 | } else if (start <= entry->start) { /* end > entry->start */ | 298 | } else if (start <= entry->start) { /* end > entry->start */ |
| 290 | err = chk_conflict(new, entry, new_type); | 299 | err = chk_conflict(new, entry, new_type); |
| @@ -292,6 +301,8 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
| 292 | dprintk("Overlap at 0x%Lx-0x%Lx\n", | 301 | dprintk("Overlap at 0x%Lx-0x%Lx\n", |
| 293 | entry->start, entry->end); | 302 | entry->start, entry->end); |
| 294 | where = entry->nd.prev; | 303 | where = entry->nd.prev; |
| 304 | cached_entry = list_entry(where, | ||
| 305 | struct memtype, nd); | ||
| 295 | } | 306 | } |
| 296 | break; | 307 | break; |
| 297 | } else if (start < entry->end) { /* start > entry->start */ | 308 | } else if (start < entry->end) { /* start > entry->start */ |
| @@ -299,7 +310,20 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
| 299 | if (!err) { | 310 | if (!err) { |
| 300 | dprintk("Overlap at 0x%Lx-0x%Lx\n", | 311 | dprintk("Overlap at 0x%Lx-0x%Lx\n", |
| 301 | entry->start, entry->end); | 312 | entry->start, entry->end); |
| 302 | where = &entry->nd; | 313 | cached_entry = list_entry(entry->nd.prev, |
| 314 | struct memtype, nd); | ||
| 315 | |||
| 316 | /* | ||
| 317 | * Move to right position in the linked | ||
| 318 | * list to add this new entry | ||
| 319 | */ | ||
| 320 | list_for_each_entry_continue(entry, | ||
| 321 | &memtype_list, nd) { | ||
| 322 | if (start <= entry->start) { | ||
| 323 | where = entry->nd.prev; | ||
| 324 | break; | ||
| 325 | } | ||
| 326 | } | ||
| 303 | } | 327 | } |
| 304 | break; | 328 | break; |
| 305 | } | 329 | } |
| @@ -314,6 +338,8 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
| 314 | return err; | 338 | return err; |
| 315 | } | 339 | } |
| 316 | 340 | ||
| 341 | cached_start = start; | ||
| 342 | |||
| 317 | if (where) | 343 | if (where) |
| 318 | list_add(&new->nd, where); | 344 | list_add(&new->nd, where); |
| 319 | else | 345 | else |
| @@ -343,6 +369,9 @@ int free_memtype(u64 start, u64 end) | |||
| 343 | spin_lock(&memtype_lock); | 369 | spin_lock(&memtype_lock); |
| 344 | list_for_each_entry(entry, &memtype_list, nd) { | 370 | list_for_each_entry(entry, &memtype_list, nd) { |
| 345 | if (entry->start == start && entry->end == end) { | 371 | if (entry->start == start && entry->end == end) { |
| 372 | if (cached_entry == entry || cached_start == start) | ||
| 373 | cached_entry = NULL; | ||
| 374 | |||
| 346 | list_del(&entry->nd); | 375 | list_del(&entry->nd); |
| 347 | kfree(entry); | 376 | kfree(entry); |
| 348 | err = 0; | 377 | err = 0; |
| @@ -361,14 +390,6 @@ int free_memtype(u64 start, u64 end) | |||
| 361 | } | 390 | } |
| 362 | 391 | ||
| 363 | 392 | ||
| 364 | /* | ||
| 365 | * /dev/mem mmap interface. The memtype used for mapping varies: | ||
| 366 | * - Use UC for mappings with O_SYNC flag | ||
| 367 | * - Without O_SYNC flag, if there is any conflict in reserve_memtype, | ||
| 368 | * inherit the memtype from existing mapping. | ||
| 369 | * - Else use UC_MINUS memtype (for backward compatibility with existing | ||
| 370 | * X drivers. | ||
| 371 | */ | ||
| 372 | pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, | 393 | pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, |
| 373 | unsigned long size, pgprot_t vma_prot) | 394 | unsigned long size, pgprot_t vma_prot) |
| 374 | { | 395 | { |
| @@ -406,14 +427,14 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, | |||
| 406 | unsigned long size, pgprot_t *vma_prot) | 427 | unsigned long size, pgprot_t *vma_prot) |
| 407 | { | 428 | { |
| 408 | u64 offset = ((u64) pfn) << PAGE_SHIFT; | 429 | u64 offset = ((u64) pfn) << PAGE_SHIFT; |
| 409 | unsigned long flags = _PAGE_CACHE_UC_MINUS; | 430 | unsigned long flags = -1; |
| 410 | int retval; | 431 | int retval; |
| 411 | 432 | ||
| 412 | if (!range_is_allowed(pfn, size)) | 433 | if (!range_is_allowed(pfn, size)) |
| 413 | return 0; | 434 | return 0; |
| 414 | 435 | ||
| 415 | if (file->f_flags & O_SYNC) { | 436 | if (file->f_flags & O_SYNC) { |
| 416 | flags = _PAGE_CACHE_UC; | 437 | flags = _PAGE_CACHE_UC_MINUS; |
| 417 | } | 438 | } |
| 418 | 439 | ||
| 419 | #ifdef CONFIG_X86_32 | 440 | #ifdef CONFIG_X86_32 |
| @@ -436,13 +457,14 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, | |||
| 436 | #endif | 457 | #endif |
| 437 | 458 | ||
| 438 | /* | 459 | /* |
| 439 | * With O_SYNC, we can only take UC mapping. Fail if we cannot. | 460 | * With O_SYNC, we can only take UC_MINUS mapping. Fail if we cannot. |
| 461 | * | ||
| 440 | * Without O_SYNC, we want to get | 462 | * Without O_SYNC, we want to get |
| 441 | * - WB for WB-able memory and no other conflicting mappings | 463 | * - WB for WB-able memory and no other conflicting mappings |
| 442 | * - UC_MINUS for non-WB-able memory with no other conflicting mappings | 464 | * - UC_MINUS for non-WB-able memory with no other conflicting mappings |
| 443 | * - Inherit from confliting mappings otherwise | 465 | * - Inherit from confliting mappings otherwise |
| 444 | */ | 466 | */ |
| 445 | if (flags != _PAGE_CACHE_UC_MINUS) { | 467 | if (flags != -1) { |
| 446 | retval = reserve_memtype(offset, offset + size, flags, NULL); | 468 | retval = reserve_memtype(offset, offset + size, flags, NULL); |
| 447 | } else { | 469 | } else { |
| 448 | retval = reserve_memtype(offset, offset + size, -1, &flags); | 470 | retval = reserve_memtype(offset, offset + size, -1, &flags); |
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c index 3f90289410e6..0227694f7dab 100644 --- a/arch/x86/oprofile/nmi_int.c +++ b/arch/x86/oprofile/nmi_int.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
| 16 | #include <linux/moduleparam.h> | 16 | #include <linux/moduleparam.h> |
| 17 | #include <linux/kdebug.h> | 17 | #include <linux/kdebug.h> |
| 18 | #include <linux/cpu.h> | ||
| 18 | #include <asm/nmi.h> | 19 | #include <asm/nmi.h> |
| 19 | #include <asm/msr.h> | 20 | #include <asm/msr.h> |
| 20 | #include <asm/apic.h> | 21 | #include <asm/apic.h> |
| @@ -28,23 +29,48 @@ static DEFINE_PER_CPU(unsigned long, saved_lvtpc); | |||
| 28 | 29 | ||
| 29 | static int nmi_start(void); | 30 | static int nmi_start(void); |
| 30 | static void nmi_stop(void); | 31 | static void nmi_stop(void); |
| 32 | static void nmi_cpu_start(void *dummy); | ||
| 33 | static void nmi_cpu_stop(void *dummy); | ||
| 31 | 34 | ||
| 32 | /* 0 == registered but off, 1 == registered and on */ | 35 | /* 0 == registered but off, 1 == registered and on */ |
| 33 | static int nmi_enabled = 0; | 36 | static int nmi_enabled = 0; |
| 34 | 37 | ||
| 38 | #ifdef CONFIG_SMP | ||
| 39 | static int oprofile_cpu_notifier(struct notifier_block *b, unsigned long action, | ||
| 40 | void *data) | ||
| 41 | { | ||
| 42 | int cpu = (unsigned long)data; | ||
| 43 | switch (action) { | ||
| 44 | case CPU_DOWN_FAILED: | ||
| 45 | case CPU_ONLINE: | ||
| 46 | smp_call_function_single(cpu, nmi_cpu_start, NULL, 0); | ||
| 47 | break; | ||
| 48 | case CPU_DOWN_PREPARE: | ||
| 49 | smp_call_function_single(cpu, nmi_cpu_stop, NULL, 1); | ||
| 50 | break; | ||
| 51 | } | ||
| 52 | return NOTIFY_DONE; | ||
| 53 | } | ||
| 54 | |||
| 55 | static struct notifier_block oprofile_cpu_nb = { | ||
| 56 | .notifier_call = oprofile_cpu_notifier | ||
| 57 | }; | ||
| 58 | #endif | ||
| 59 | |||
| 35 | #ifdef CONFIG_PM | 60 | #ifdef CONFIG_PM |
| 36 | 61 | ||
| 37 | static int nmi_suspend(struct sys_device *dev, pm_message_t state) | 62 | static int nmi_suspend(struct sys_device *dev, pm_message_t state) |
| 38 | { | 63 | { |
| 64 | /* Only one CPU left, just stop that one */ | ||
| 39 | if (nmi_enabled == 1) | 65 | if (nmi_enabled == 1) |
| 40 | nmi_stop(); | 66 | nmi_cpu_stop(NULL); |
| 41 | return 0; | 67 | return 0; |
| 42 | } | 68 | } |
| 43 | 69 | ||
| 44 | static int nmi_resume(struct sys_device *dev) | 70 | static int nmi_resume(struct sys_device *dev) |
| 45 | { | 71 | { |
| 46 | if (nmi_enabled == 1) | 72 | if (nmi_enabled == 1) |
| 47 | nmi_start(); | 73 | nmi_cpu_start(NULL); |
| 48 | return 0; | 74 | return 0; |
| 49 | } | 75 | } |
| 50 | 76 | ||
| @@ -463,6 +489,9 @@ int __init op_nmi_init(struct oprofile_operations *ops) | |||
| 463 | } | 489 | } |
| 464 | 490 | ||
| 465 | init_sysfs(); | 491 | init_sysfs(); |
| 492 | #ifdef CONFIG_SMP | ||
| 493 | register_cpu_notifier(&oprofile_cpu_nb); | ||
| 494 | #endif | ||
| 466 | using_nmi = 1; | 495 | using_nmi = 1; |
| 467 | ops->create_files = nmi_create_files; | 496 | ops->create_files = nmi_create_files; |
| 468 | ops->setup = nmi_setup; | 497 | ops->setup = nmi_setup; |
| @@ -476,6 +505,10 @@ int __init op_nmi_init(struct oprofile_operations *ops) | |||
| 476 | 505 | ||
| 477 | void op_nmi_exit(void) | 506 | void op_nmi_exit(void) |
| 478 | { | 507 | { |
| 479 | if (using_nmi) | 508 | if (using_nmi) { |
| 480 | exit_sysfs(); | 509 | exit_sysfs(); |
| 510 | #ifdef CONFIG_SMP | ||
| 511 | unregister_cpu_notifier(&oprofile_cpu_nb); | ||
| 512 | #endif | ||
| 513 | } | ||
| 481 | } | 514 | } |
diff --git a/include/asm-x86/genapic_32.h b/include/asm-x86/genapic_32.h index b02ea6e17de8..754d635f90ff 100644 --- a/include/asm-x86/genapic_32.h +++ b/include/asm-x86/genapic_32.h | |||
| @@ -118,6 +118,7 @@ enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC}; | |||
| 118 | #define get_uv_system_type() UV_NONE | 118 | #define get_uv_system_type() UV_NONE |
| 119 | #define is_uv_system() 0 | 119 | #define is_uv_system() 0 |
| 120 | #define uv_wakeup_secondary(a, b) 1 | 120 | #define uv_wakeup_secondary(a, b) 1 |
| 121 | #define uv_system_init() do {} while (0) | ||
| 121 | 122 | ||
| 122 | 123 | ||
| 123 | #endif | 124 | #endif |
diff --git a/include/asm-x86/genapic_64.h b/include/asm-x86/genapic_64.h index 0f8504627c41..a47d63129135 100644 --- a/include/asm-x86/genapic_64.h +++ b/include/asm-x86/genapic_64.h | |||
| @@ -42,6 +42,7 @@ extern int is_uv_system(void); | |||
| 42 | extern struct genapic apic_x2apic_uv_x; | 42 | extern struct genapic apic_x2apic_uv_x; |
| 43 | DECLARE_PER_CPU(int, x2apic_extra_bits); | 43 | DECLARE_PER_CPU(int, x2apic_extra_bits); |
| 44 | extern void uv_cpu_init(void); | 44 | extern void uv_cpu_init(void); |
| 45 | extern void uv_system_init(void); | ||
| 45 | extern int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip); | 46 | extern int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip); |
| 46 | 47 | ||
| 47 | extern void setup_apic_routing(void); | 48 | extern void setup_apic_routing(void); |
diff --git a/include/asm-x86/irq_vectors.h b/include/asm-x86/irq_vectors.h index b95d167b7fb2..a48c7f2dbdc0 100644 --- a/include/asm-x86/irq_vectors.h +++ b/include/asm-x86/irq_vectors.h | |||
| @@ -76,6 +76,7 @@ | |||
| 76 | #define CALL_FUNCTION_SINGLE_VECTOR 0xfb | 76 | #define CALL_FUNCTION_SINGLE_VECTOR 0xfb |
| 77 | #define THERMAL_APIC_VECTOR 0xfa | 77 | #define THERMAL_APIC_VECTOR 0xfa |
| 78 | #define THRESHOLD_APIC_VECTOR 0xf9 | 78 | #define THRESHOLD_APIC_VECTOR 0xf9 |
| 79 | #define UV_BAU_MESSAGE 0xf8 | ||
| 79 | #define INVALIDATE_TLB_VECTOR_END 0xf7 | 80 | #define INVALIDATE_TLB_VECTOR_END 0xf7 |
| 80 | #define INVALIDATE_TLB_VECTOR_START 0xf0 /* f0-f7 used for TLB flush */ | 81 | #define INVALIDATE_TLB_VECTOR_START 0xf0 /* f0-f7 used for TLB flush */ |
| 81 | 82 | ||
diff --git a/include/asm-x86/uv/uv_bau.h b/include/asm-x86/uv/uv_bau.h index 91ac0dfb7588..610b6b308e93 100644 --- a/include/asm-x86/uv/uv_bau.h +++ b/include/asm-x86/uv/uv_bau.h | |||
| @@ -40,11 +40,6 @@ | |||
| 40 | #define UV_ACTIVATION_DESCRIPTOR_SIZE 32 | 40 | #define UV_ACTIVATION_DESCRIPTOR_SIZE 32 |
| 41 | #define UV_DISTRIBUTION_SIZE 256 | 41 | #define UV_DISTRIBUTION_SIZE 256 |
| 42 | #define UV_SW_ACK_NPENDING 8 | 42 | #define UV_SW_ACK_NPENDING 8 |
| 43 | #define UV_BAU_MESSAGE 200 | ||
| 44 | /* | ||
| 45 | * Messaging irq; see irq_64.h and include/asm-x86/hw_irq_64.h | ||
| 46 | * To be dynamically allocated in the future | ||
| 47 | */ | ||
| 48 | #define UV_NET_ENDPOINT_INTD 0x38 | 43 | #define UV_NET_ENDPOINT_INTD 0x38 |
| 49 | #define UV_DESC_BASE_PNODE_SHIFT 49 | 44 | #define UV_DESC_BASE_PNODE_SHIFT 49 |
| 50 | #define UV_PAYLOADQ_PNODE_SHIFT 49 | 45 | #define UV_PAYLOADQ_PNODE_SHIFT 49 |
