From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH] target-i386: clear guest TSC on reset Date: Thu, 05 Dec 2013 17:32:54 +0100 Message-ID: <52A0AAB6.3090104@redhat.com> References: <1386054500.25757.10.camel@nexus> <529D90A6.2080801@lab.ntt.co.jp> <52A0186A.2050207@lab.ntt.co.jp> <1386224104.3091.3.camel@nexus> <52A04732.4040105@redhat.com> <20131205161234.GA17277@amt.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: =?ISO-8859-1?Q?Fernando_Luis_V=E1zquez_Cao?= , Gleb Natapov , Will Auld , qemu-devel@nongnu.org, kvm@vger.kernel.org To: Marcelo Tosatti Return-path: Received: from mx1.redhat.com ([209.132.183.28]:32155 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932734Ab3LEQdF (ORCPT ); Thu, 5 Dec 2013 11:33:05 -0500 In-Reply-To: <20131205161234.GA17277@amt.cnet> Sender: kvm-owner@vger.kernel.org List-ID: Il 05/12/2013 17:12, Marcelo Tosatti ha scritto: >> > - call kvm_set_ticks() from cpu_set_ticks() and cpu_enable_ticks() > env->tsc is just a placeholder for the vcpu TSC. > > A vcpus TSC from QEMU's point of view is a register initialized to zero, > which requires read/write from KVM, and migration. QEMU already tracks the TSC in cpu_get_ticks(). So far this is used only for TCG, but for example the code is there that preserves the TSC when you stop/resume the VM and when you migrate the VM. Reset is not yet there, which is a bug similar to the one Fernando is trying to solve for KVM. So, from QEMU's point of view the TSC should be a global value across the whole system (timer_state.cpu_ticks_offset) + a per-VCPU TSC offset (env->tsc_adjust). When talking to KVM, the per-VCPU TSC offset in turn has two parts, both set with KVM_SET_MSRS: one is computed from MSR_IA32_TSC, the other comes from MSR_IA32_TSC_ADJUST. The point here would be to treat it as such. With this change, env->tsc need not be migrated. The global value timer_state.cpu_ticks_offset is migrated already. The host-side TSC adjust can be computed from rdtsc()-timer_state.cpu_ticks_offset on the destination machine and/or at reset time. The guest-side TSC adjust is env->tsc_adjust as it is now. Paolo