From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32818) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZgR9h-0007ea-TJ for qemu-devel@nongnu.org; Mon, 28 Sep 2015 01:39:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZgR9e-0002Mg-NM for qemu-devel@nongnu.org; Mon, 28 Sep 2015 01:39:17 -0400 Received: from mga14.intel.com ([192.55.52.115]:60699) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZgR9e-0002M5-Iu for qemu-devel@nongnu.org; Mon, 28 Sep 2015 01:39:14 -0400 From: Haozhong Zhang Date: Mon, 28 Sep 2015 13:38:31 +0800 Message-Id: <1443418711-24106-4-git-send-email-haozhong.zhang@intel.com> In-Reply-To: <1443418711-24106-1-git-send-email-haozhong.zhang@intel.com> References: <1443418711-24106-1-git-send-email-haozhong.zhang@intel.com> Subject: [Qemu-devel] [PATCH 3/3] kvm-all: notice KVM of vcpu's TSC rate after migration List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Haozhong Zhang , Eduardo Habkost , kvm@vger.kernel.org, Marcelo Tosatti , Paolo Bonzini , Richard Henderson When a vcpu is created in KVM, its TSC rate is initially identical to the host TSC rate. If its state is migrated to a vcpu on another machine (target machine) which may uses a different host TSC rate, QEMU on the target machine should notice KVM of the migrated vcpu's TSC rate. In case that KVM on the target machine supports TSC scaling, guest programs running on the migrated vcpu will observe the same TSC rate before and after the migration. Signed-off-by: Haozhong Zhang --- kvm-all.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/kvm-all.c b/kvm-all.c index 0be4615..e8de038 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -1769,6 +1769,19 @@ void kvm_cpu_synchronize_post_reset(CPUState *cpu) static void do_kvm_cpu_synchronize_post_init(void *arg) { CPUState *cpu = arg; + CPUX86State *env = &X86_CPU(cpu)->env; + int r; + + /* + * XXX: KVM_SET_TSC_KHZ must be done before kvm_arch_put_registers(). + */ + r = kvm_check_extension(cpu->kvm_state, KVM_CAP_TSC_CONTROL); + if (r && env->tsc_khz) { + r = kvm_vcpu_ioctl(cpu, KVM_SET_TSC_KHZ, env->tsc_khz); + if (r < 0) { + fprintf(stderr, "KVM_SET_TSC_KHZ failed\n"); + } + } kvm_arch_put_registers(cpu, KVM_PUT_FULL_STATE); cpu->kvm_vcpu_dirty = false; -- 2.4.8