diff options
author | Marcelo Tosatti <mtosatti@redhat.com> | 2015-03-23 19:21:51 -0400 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2015-03-23 19:22:48 -0400 |
commit | 0a4e6be9ca17c54817cf814b4b5aa60478c6df27 (patch) | |
tree | 461ed6cace26da5c75d1c01982fde2f3ccc5d4fa /arch/x86/vdso | |
parent | 58d2930f4ee335ab703d768cb0318331fc1bb62c (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.c | 16 |
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; |