linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] kvm: robustify steal time record
@ 2016-05-03  3:43 Wanpeng Li
  0 siblings, 0 replies; 2+ messages in thread
From: Wanpeng Li @ 2016-05-03  3:43 UTC (permalink / raw)
  To: Paolo Bonzini, Radim; +Cc: Wincy Van, kvm, linux-kernel, Wanpeng Li

From: Wanpeng Li <wanpeng.li@hotmail.com>

Guest should only trust data to be valid when version haven't changed 
before and after reads of steal time. Besides not changing, it has to 
be an even number. Hypervisor may write an odd number to version field 
to indicate that an update is in progress.

kvm_steal_clock() in guest has already done the read side, make write 
side in hypervisor more robust by following the above rule.

Reviewed-by: Wincy Van <fanwenyi0529@gmail.com>
Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
---
 arch/x86/kvm/x86.c |   18 +++++++++++++++++-
 1 files changed, 17 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 96e81d2..f935868 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2010,11 +2010,27 @@ static void record_steal_time(struct kvm_vcpu *vcpu)
 	if (unlikely(kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.st.stime,
 		&vcpu->arch.st.steal, sizeof(struct kvm_steal_time))))
 		return;
+
+	if (vcpu->arch.st.steal.version & 1)
+		vcpu->arch.st.steal.version += 1;  /* first time write, random junk */
+
+	vcpu->arch.st.steal.version += 1;
+
+	kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.st.stime,
+		&vcpu->arch.st.steal, sizeof(struct kvm_steal_time));
+
+	smp_wmb();
 
 	vcpu->arch.st.steal.steal += current->sched_info.run_delay -
 		vcpu->arch.st.last_steal;
 	vcpu->arch.st.last_steal = current->sched_info.run_delay;
-	vcpu->arch.st.steal.version += 2;
+
+	kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.st.stime,
+		&vcpu->arch.st.steal, sizeof(struct kvm_steal_time));
+
+	smp_wmb();
+
+	vcpu->arch.st.steal.version += 1;
 
 	kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.st.stime,
 		&vcpu->arch.st.steal, sizeof(struct kvm_steal_time));
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] kvm: robustify steal time record
       [not found] <SG2PR02MB15505F09CE84881969A53848807A0@SG2PR02MB1550.apcprd02.prod.outlook.com>
@ 2016-05-03 15:30 ` Radim
  0 siblings, 0 replies; 2+ messages in thread
From: Radim @ 2016-05-03 15:30 UTC (permalink / raw)
  To: Wanpeng Li; +Cc: Paolo Bonzini, Wincy Van, kvm, linux-kernel

2016-05-03 03:19+0000, Wanpeng Li:
> From: Wanpeng Li <wanpeng.li@hotmail.com>
> 
> Guest should only trust data to be valid when version haven't changed 
> before and after reads of steal time. Besides not changing, it has to 
> be an even number. Hypervisor may write an odd number to version field 
> to indicate that an update is in progress.
> 
> kvm_steal_clock() in guest has already done the read side, make write 
> side in hypervisor more robust by following the above rule.
> 
> Reviewed-by: Wincy Van <fanwenyi0529@gmail.com>
> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
> ---

Queued, thanks.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-05-03 15:30 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-03  3:43 [PATCH] kvm: robustify steal time record Wanpeng Li
     [not found] <SG2PR02MB15505F09CE84881969A53848807A0@SG2PR02MB1550.apcprd02.prod.outlook.com>
2016-05-03 15:30 ` Radim

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).