diff options
| -rw-r--r-- | arch/x86/kernel/apic_64.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/kvmclock.c | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/tsc_32.c | 25 | ||||
| -rw-r--r-- | arch/x86/kernel/tsc_64.c | 5 | ||||
| -rw-r--r-- | arch/x86/kvm/mmu.c | 2 | ||||
| -rw-r--r-- | arch/x86/vdso/vclock_gettime.c | 6 | ||||
| -rw-r--r-- | arch/x86/xen/mmu.c | 2 | ||||
| -rw-r--r-- | include/asm-x86/tlbflush.h | 13 |
8 files changed, 38 insertions, 21 deletions
diff --git a/arch/x86/kernel/apic_64.c b/arch/x86/kernel/apic_64.c index 5910020c3f24..0633cfd0dc29 100644 --- a/arch/x86/kernel/apic_64.c +++ b/arch/x86/kernel/apic_64.c | |||
| @@ -534,7 +534,7 @@ int setup_profiling_timer(unsigned int multiplier) | |||
| 534 | */ | 534 | */ |
| 535 | void clear_local_APIC(void) | 535 | void clear_local_APIC(void) |
| 536 | { | 536 | { |
| 537 | int maxlvt = lapic_get_maxlvt(); | 537 | int maxlvt; |
| 538 | u32 v; | 538 | u32 v; |
| 539 | 539 | ||
| 540 | /* APIC hasn't been mapped yet */ | 540 | /* APIC hasn't been mapped yet */ |
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 4bc1be5d5472..08a30986d472 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c | |||
| @@ -53,7 +53,7 @@ static cycle_t kvm_clock_read(void); | |||
| 53 | * have elapsed since the hypervisor wrote the data. So we try to account for | 53 | * have elapsed since the hypervisor wrote the data. So we try to account for |
| 54 | * that with system time | 54 | * that with system time |
| 55 | */ | 55 | */ |
| 56 | unsigned long kvm_get_wallclock(void) | 56 | static unsigned long kvm_get_wallclock(void) |
| 57 | { | 57 | { |
| 58 | u32 wc_sec, wc_nsec; | 58 | u32 wc_sec, wc_nsec; |
| 59 | u64 delta; | 59 | u64 delta; |
| @@ -86,7 +86,7 @@ unsigned long kvm_get_wallclock(void) | |||
| 86 | return ts.tv_sec + 1; | 86 | return ts.tv_sec + 1; |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | int kvm_set_wallclock(unsigned long now) | 89 | static int kvm_set_wallclock(unsigned long now) |
| 90 | { | 90 | { |
| 91 | return 0; | 91 | return 0; |
| 92 | } | 92 | } |
diff --git a/arch/x86/kernel/tsc_32.c b/arch/x86/kernel/tsc_32.c index e4790728b224..068759db63dd 100644 --- a/arch/x86/kernel/tsc_32.c +++ b/arch/x86/kernel/tsc_32.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | 14 | ||
| 15 | #include "mach_timer.h" | 15 | #include "mach_timer.h" |
| 16 | 16 | ||
| 17 | static int tsc_enabled; | 17 | static int tsc_disabled; |
| 18 | 18 | ||
| 19 | /* | 19 | /* |
| 20 | * On some systems the TSC frequency does not | 20 | * On some systems the TSC frequency does not |
| @@ -28,8 +28,8 @@ EXPORT_SYMBOL_GPL(tsc_khz); | |||
| 28 | static int __init tsc_setup(char *str) | 28 | static int __init tsc_setup(char *str) |
| 29 | { | 29 | { |
| 30 | printk(KERN_WARNING "notsc: Kernel compiled with CONFIG_X86_TSC, " | 30 | printk(KERN_WARNING "notsc: Kernel compiled with CONFIG_X86_TSC, " |
| 31 | "cannot disable TSC completely.\n"); | 31 | "cannot disable TSC completely.\n"); |
| 32 | mark_tsc_unstable("user disabled TSC"); | 32 | tsc_disabled = 1; |
| 33 | return 1; | 33 | return 1; |
| 34 | } | 34 | } |
| 35 | #else | 35 | #else |
| @@ -120,7 +120,7 @@ unsigned long long native_sched_clock(void) | |||
| 120 | * very important for it to be as fast as the platform | 120 | * very important for it to be as fast as the platform |
| 121 | * can achive it. ) | 121 | * can achive it. ) |
| 122 | */ | 122 | */ |
| 123 | if (unlikely(!tsc_enabled && !tsc_unstable)) | 123 | if (unlikely(tsc_disabled)) |
| 124 | /* No locking but a rare wrong value is not a big deal: */ | 124 | /* No locking but a rare wrong value is not a big deal: */ |
| 125 | return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ); | 125 | return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ); |
| 126 | 126 | ||
| @@ -322,7 +322,6 @@ void mark_tsc_unstable(char *reason) | |||
| 322 | { | 322 | { |
| 323 | if (!tsc_unstable) { | 323 | if (!tsc_unstable) { |
| 324 | tsc_unstable = 1; | 324 | tsc_unstable = 1; |
| 325 | tsc_enabled = 0; | ||
| 326 | printk("Marking TSC unstable due to: %s.\n", reason); | 325 | printk("Marking TSC unstable due to: %s.\n", reason); |
| 327 | /* Can be called before registration */ | 326 | /* Can be called before registration */ |
| 328 | if (clocksource_tsc.mult) | 327 | if (clocksource_tsc.mult) |
| @@ -336,7 +335,7 @@ EXPORT_SYMBOL_GPL(mark_tsc_unstable); | |||
| 336 | static int __init dmi_mark_tsc_unstable(const struct dmi_system_id *d) | 335 | static int __init dmi_mark_tsc_unstable(const struct dmi_system_id *d) |
| 337 | { | 336 | { |
| 338 | printk(KERN_NOTICE "%s detected: marking TSC unstable.\n", | 337 | printk(KERN_NOTICE "%s detected: marking TSC unstable.\n", |
| 339 | d->ident); | 338 | d->ident); |
| 340 | tsc_unstable = 1; | 339 | tsc_unstable = 1; |
| 341 | return 0; | 340 | return 0; |
| 342 | } | 341 | } |
| @@ -403,14 +402,22 @@ void __init tsc_init(void) | |||
| 403 | { | 402 | { |
| 404 | int cpu; | 403 | int cpu; |
| 405 | 404 | ||
| 406 | if (!cpu_has_tsc) | 405 | if (!cpu_has_tsc || tsc_disabled) { |
| 406 | /* Disable the TSC in case of !cpu_has_tsc */ | ||
| 407 | tsc_disabled = 1; | ||
| 407 | return; | 408 | return; |
| 409 | } | ||
| 408 | 410 | ||
| 409 | cpu_khz = calculate_cpu_khz(); | 411 | cpu_khz = calculate_cpu_khz(); |
| 410 | tsc_khz = cpu_khz; | 412 | tsc_khz = cpu_khz; |
| 411 | 413 | ||
| 412 | if (!cpu_khz) { | 414 | if (!cpu_khz) { |
| 413 | mark_tsc_unstable("could not calculate TSC khz"); | 415 | mark_tsc_unstable("could not calculate TSC khz"); |
| 416 | /* | ||
| 417 | * We need to disable the TSC completely in this case | ||
| 418 | * to prevent sched_clock() from using it. | ||
| 419 | */ | ||
| 420 | tsc_disabled = 1; | ||
| 414 | return; | 421 | return; |
| 415 | } | 422 | } |
| 416 | 423 | ||
| @@ -441,8 +448,6 @@ void __init tsc_init(void) | |||
| 441 | if (check_tsc_unstable()) { | 448 | if (check_tsc_unstable()) { |
| 442 | clocksource_tsc.rating = 0; | 449 | clocksource_tsc.rating = 0; |
| 443 | clocksource_tsc.flags &= ~CLOCK_SOURCE_IS_CONTINUOUS; | 450 | clocksource_tsc.flags &= ~CLOCK_SOURCE_IS_CONTINUOUS; |
| 444 | } else | 451 | } |
| 445 | tsc_enabled = 1; | ||
| 446 | |||
| 447 | clocksource_register(&clocksource_tsc); | 452 | clocksource_register(&clocksource_tsc); |
| 448 | } | 453 | } |
diff --git a/arch/x86/kernel/tsc_64.c b/arch/x86/kernel/tsc_64.c index fcc16e58609e..1784b8077a12 100644 --- a/arch/x86/kernel/tsc_64.c +++ b/arch/x86/kernel/tsc_64.c | |||
| @@ -227,14 +227,14 @@ void __init tsc_calibrate(void) | |||
| 227 | /* hpet or pmtimer available ? */ | 227 | /* hpet or pmtimer available ? */ |
| 228 | if (!hpet && !pm1 && !pm2) { | 228 | if (!hpet && !pm1 && !pm2) { |
| 229 | printk(KERN_INFO "TSC calibrated against PIT\n"); | 229 | printk(KERN_INFO "TSC calibrated against PIT\n"); |
| 230 | return; | 230 | goto out; |
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | /* Check, whether the sampling was disturbed by an SMI */ | 233 | /* Check, whether the sampling was disturbed by an SMI */ |
| 234 | if (tsc1 == ULONG_MAX || tsc2 == ULONG_MAX) { | 234 | if (tsc1 == ULONG_MAX || tsc2 == ULONG_MAX) { |
| 235 | printk(KERN_WARNING "TSC calibration disturbed by SMI, " | 235 | printk(KERN_WARNING "TSC calibration disturbed by SMI, " |
| 236 | "using PIT calibration result\n"); | 236 | "using PIT calibration result\n"); |
| 237 | return; | 237 | goto out; |
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | tsc2 = (tsc2 - tsc1) * 1000000L; | 240 | tsc2 = (tsc2 - tsc1) * 1000000L; |
| @@ -255,6 +255,7 @@ void __init tsc_calibrate(void) | |||
| 255 | 255 | ||
| 256 | tsc_khz = tsc2 / tsc1; | 256 | tsc_khz = tsc2 / tsc1; |
| 257 | 257 | ||
| 258 | out: | ||
| 258 | for_each_possible_cpu(cpu) | 259 | for_each_possible_cpu(cpu) |
| 259 | set_cyc2ns_scale(tsc_khz, cpu); | 260 | set_cyc2ns_scale(tsc_khz, cpu); |
| 260 | } | 261 | } |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 36c5406b1813..7246b60afb96 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -1996,7 +1996,7 @@ static struct shrinker mmu_shrinker = { | |||
| 1996 | .seeks = DEFAULT_SEEKS * 10, | 1996 | .seeks = DEFAULT_SEEKS * 10, |
| 1997 | }; | 1997 | }; |
| 1998 | 1998 | ||
| 1999 | void mmu_destroy_caches(void) | 1999 | static void mmu_destroy_caches(void) |
| 2000 | { | 2000 | { |
| 2001 | if (pte_chain_cache) | 2001 | if (pte_chain_cache) |
| 2002 | kmem_cache_destroy(pte_chain_cache); | 2002 | kmem_cache_destroy(pte_chain_cache); |
diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c index 23476c2ebfc4..efa2ba7c6005 100644 --- a/arch/x86/vdso/vclock_gettime.c +++ b/arch/x86/vdso/vclock_gettime.c | |||
| @@ -106,9 +106,9 @@ int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz) | |||
| 106 | do_realtime((struct timespec *)tv); | 106 | do_realtime((struct timespec *)tv); |
| 107 | tv->tv_usec /= 1000; | 107 | tv->tv_usec /= 1000; |
| 108 | if (unlikely(tz != NULL)) { | 108 | if (unlikely(tz != NULL)) { |
| 109 | /* This relies on gcc inlining the memcpy. We'll notice | 109 | /* Avoid memcpy. Some old compilers fail to inline it */ |
| 110 | if it ever fails to do so. */ | 110 | tz->tz_minuteswest = gtod->sys_tz.tz_minuteswest; |
| 111 | memcpy(tz, >od->sys_tz, sizeof(struct timezone)); | 111 | tz->tz_dsttime = gtod->sys_tz.tz_dsttime; |
| 112 | } | 112 | } |
| 113 | return 0; | 113 | return 0; |
| 114 | } | 114 | } |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 126766d43aea..3525ef523a74 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -60,7 +60,7 @@ xmaddr_t arbitrary_virt_to_machine(unsigned long address) | |||
| 60 | { | 60 | { |
| 61 | unsigned int level; | 61 | unsigned int level; |
| 62 | pte_t *pte = lookup_address(address, &level); | 62 | pte_t *pte = lookup_address(address, &level); |
| 63 | unsigned offset = address & PAGE_MASK; | 63 | unsigned offset = address & ~PAGE_MASK; |
| 64 | 64 | ||
| 65 | BUG_ON(pte == NULL); | 65 | BUG_ON(pte == NULL); |
| 66 | 66 | ||
diff --git a/include/asm-x86/tlbflush.h b/include/asm-x86/tlbflush.h index 0c0674d94255..35c76ceb9f40 100644 --- a/include/asm-x86/tlbflush.h +++ b/include/asm-x86/tlbflush.h | |||
| @@ -22,12 +22,23 @@ static inline void __native_flush_tlb(void) | |||
| 22 | 22 | ||
| 23 | static inline void __native_flush_tlb_global(void) | 23 | static inline void __native_flush_tlb_global(void) |
| 24 | { | 24 | { |
| 25 | unsigned long cr4 = read_cr4(); | 25 | unsigned long flags; |
| 26 | unsigned long cr4; | ||
| 26 | 27 | ||
| 28 | /* | ||
| 29 | * Read-modify-write to CR4 - protect it from preemption and | ||
| 30 | * from interrupts. (Use the raw variant because this code can | ||
| 31 | * be called from deep inside debugging code.) | ||
| 32 | */ | ||
| 33 | raw_local_irq_save(flags); | ||
| 34 | |||
| 35 | cr4 = read_cr4(); | ||
| 27 | /* clear PGE */ | 36 | /* clear PGE */ |
| 28 | write_cr4(cr4 & ~X86_CR4_PGE); | 37 | write_cr4(cr4 & ~X86_CR4_PGE); |
| 29 | /* write old PGE again and flush TLBs */ | 38 | /* write old PGE again and flush TLBs */ |
| 30 | write_cr4(cr4); | 39 | write_cr4(cr4); |
| 40 | |||
| 41 | raw_local_irq_restore(flags); | ||
| 31 | } | 42 | } |
| 32 | 43 | ||
| 33 | static inline void __native_flush_tlb_single(unsigned long addr) | 44 | static inline void __native_flush_tlb_single(unsigned long addr) |
