aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/vdso
diff options
context:
space:
mode:
authorMarcelo Tosatti <mtosatti@redhat.com>2015-03-23 19:21:51 -0400
committerMarcelo Tosatti <mtosatti@redhat.com>2015-03-23 19:22:48 -0400
commit0a4e6be9ca17c54817cf814b4b5aa60478c6df27 (patch)
tree461ed6cace26da5c75d1c01982fde2f3ccc5d4fa /arch/x86/vdso
parent58d2930f4ee335ab703d768cb0318331fc1bb62c (diff)
x86: kvm: Revert "remove sched notifier for cross-cpu migrations"
The following point: 2. per-CPU pvclock time info is updated if the underlying CPU changes. Is not true anymore since "KVM: x86: update pvclock area conditionally, on cpu migration". Add task migration notification back. Problem noticed by Andy Lutomirski. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> CC: stable@kernel.org # 3.11+
Diffstat (limited to 'arch/x86/vdso')
-rw-r--r--arch/x86/vdso/vclock_gettime.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c
index 9793322751e0..30933760ee5f 100644
--- a/arch/x86/vdso/vclock_gettime.c
+++ b/arch/x86/vdso/vclock_gettime.c
@@ -82,18 +82,15 @@ static notrace cycle_t vread_pvclock(int *mode)
82 cycle_t ret; 82 cycle_t ret;
83 u64 last; 83 u64 last;
84 u32 version; 84 u32 version;
85 u32 migrate_count;
85 u8 flags; 86 u8 flags;
86 unsigned cpu, cpu1; 87 unsigned cpu, cpu1;
87 88
88 89
89 /* 90 /*
90 * Note: hypervisor must guarantee that: 91 * When looping to get a consistent (time-info, tsc) pair, we
91 * 1. cpu ID number maps 1:1 to per-CPU pvclock time info. 92 * also need to deal with the possibility we can switch vcpus,
92 * 2. that per-CPU pvclock time info is updated if the 93 * so make sure we always re-fetch time-info for the current vcpu.
93 * underlying CPU changes.
94 * 3. that version is increased whenever underlying CPU
95 * changes.
96 *
97 */ 94 */
98 do { 95 do {
99 cpu = __getcpu() & VGETCPU_CPU_MASK; 96 cpu = __getcpu() & VGETCPU_CPU_MASK;
@@ -104,6 +101,8 @@ static notrace cycle_t vread_pvclock(int *mode)
104 101
105 pvti = get_pvti(cpu); 102 pvti = get_pvti(cpu);
106 103
104 migrate_count = pvti->migrate_count;
105
107 version = __pvclock_read_cycles(&pvti->pvti, &ret, &flags); 106 version = __pvclock_read_cycles(&pvti->pvti, &ret, &flags);
108 107
109 /* 108 /*
@@ -115,7 +114,8 @@ static notrace cycle_t vread_pvclock(int *mode)
115 cpu1 = __getcpu() & VGETCPU_CPU_MASK; 114 cpu1 = __getcpu() & VGETCPU_CPU_MASK;
116 } while (unlikely(cpu != cpu1 || 115 } while (unlikely(cpu != cpu1 ||
117 (pvti->pvti.version & 1) || 116 (pvti->pvti.version & 1) ||
118 pvti->pvti.version != version)); 117 pvti->pvti.version != version ||
118 pvti->migrate_count != migrate_count));
119 119
120 if (unlikely(!(flags & PVCLOCK_TSC_STABLE_BIT))) 120 if (unlikely(!(flags & PVCLOCK_TSC_STABLE_BIT)))
121 *mode = VCLOCK_NONE; 121 *mode = VCLOCK_NONE;