From mboxrd@z Thu Jan 1 00:00:00 1970 From: Zachary Amsden Subject: Re: [RFC 3/7] measure time out of guest Date: Thu, 26 Aug 2010 10:54:53 -1000 Message-ID: <4C76D49D.8000301@redhat.com> References: <1282772597-4183-1-git-send-email-glommer@redhat.com> <1282772597-4183-2-git-send-email-glommer@redhat.com> <1282772597-4183-3-git-send-email-glommer@redhat.com> <1282772597-4183-4-git-send-email-glommer@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org, avi@redhat.com, mtosatti@redhat.com, riel@redhat.com To: Glauber Costa Return-path: Received: from mx1.redhat.com ([209.132.183.28]:6960 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752654Ab0HZUy4 (ORCPT ); Thu, 26 Aug 2010 16:54:56 -0400 Received: from int-mx03.intmail.prod.int.phx2.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o7QKsu6m025954 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 26 Aug 2010 16:54:56 -0400 In-Reply-To: <1282772597-4183-4-git-send-email-glommer@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 08/25/2010 11:43 AM, Glauber Costa wrote: > By measuring time between a vcpu_put and a vcpu_load, we can > estimate how much time did the guest stay out of the cpu. > This is exported to the guest at every clock update. > > Signed-off-by: Glauber Costa > --- > arch/x86/include/asm/kvm_host.h | 2 ++ > arch/x86/kvm/x86.c | 12 +++++++++++- > 2 files changed, 13 insertions(+), 1 deletions(-) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 502e53f..bc28aff 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -364,6 +364,8 @@ struct kvm_vcpu_arch { > u64 hv_vapic; > > cpumask_var_t wbinvd_dirty_mask; > + u64 time_out; > + u64 last_time_out; > }; > > struct kvm_arch { > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index e7e3b50..680feaa 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -925,8 +925,9 @@ static void kvm_write_guest_time(struct kvm_vcpu *v) > vcpu->hv_clock.system_time = ts.tv_nsec + > (NSEC_PER_SEC * (u64)ts.tv_sec) + v->kvm->arch.kvmclock_offset; > > - vcpu->hv_clock.flags = 0; > + vcpu->hv_clock.flags = PVCLOCK_STEAL_BIT; > > + vcpu->hv_clock.steal_time = vcpu->time_out / 1000000; > /* > * The interface expects us to write an even number signaling that the > * update is finished. Since the guest won't see the intermediate > @@ -1798,6 +1799,8 @@ static bool need_emulate_wbinvd(struct kvm_vcpu *vcpu) > > void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) > { > + s64 now; > + > /* Address WBINVD may be executed by guest */ > if (need_emulate_wbinvd(vcpu)) { > if (kvm_x86_ops->has_wbinvd_exit()) > @@ -1815,12 +1818,19 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) > per_cpu(cpu_tsc_khz, cpu) = khz; > } > kvm_request_guest_time_update(vcpu); > + > + now = getnsboottime(); > + > + if (vcpu->arch.last_time_out != 0) > + vcpu->arch.time_out += now - vcpu->arch.last_time_out; > > } > > void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) > { > kvm_x86_ops->vcpu_put(vcpu); > kvm_put_guest_fpu(vcpu); > + > + vcpu->arch.last_time_out = getnsboottime(); > } > > static int is_efer_nx(void) > I think I've added some of the same instrumentation in my series.