From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55076) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Zc9Vj-0004sj-1e for qemu-devel@nongnu.org; Wed, 16 Sep 2015 06:00:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Zc9Vc-0001FM-TT for qemu-devel@nongnu.org; Wed, 16 Sep 2015 06:00:18 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:17650 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Zc9Vc-00010h-BK for qemu-devel@nongnu.org; Wed, 16 Sep 2015 06:00:12 -0400 From: "Denis V. Lunev" Date: Wed, 16 Sep 2015 12:59:44 +0300 Message-Id: <1442397584-16698-4-git-send-email-den@openvz.org> In-Reply-To: <1442397584-16698-1-git-send-email-den@openvz.org> References: <1442397584-16698-1-git-send-email-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 3/3] target-i386/kvm: Hyper-V HV_X64_MSR_VP_RUNTIME support List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Eduardo Habkost , Marcelo Tosatti , qemu-devel@nongnu.org, Paolo Bonzini , Andrey Smetanin , "Denis V. Lunev" , =?UTF-8?q?Andreas=20F=C3=A4rber?= , Richard Henderson From: Andrey Smetanin HV_X64_MSR_VP_RUNTIME msr used by guest to get "the time the virtual processor consumes running guest code, and the time the associated logical processor spends running hypervisor code on behalf of that guest." Calculation of that time is performed by task_cputime_adjusted() for vcpu task by KVM side. Signed-off-by: Andrey Smetanin Signed-off-by: Denis V. Lunev CC: Paolo Bonzini CC: Richard Henderson CC: Eduardo Habkost CC: "Andreas F=C3=A4rber" CC: Marcelo Tosatti --- linux-headers/asm-x86/hyperv.h | 3 +++ target-i386/cpu-qom.h | 1 + target-i386/cpu.c | 1 + target-i386/cpu.h | 1 + target-i386/kvm.c | 21 ++++++++++++++++++++- target-i386/machine.c | 20 ++++++++++++++++++++ 6 files changed, 46 insertions(+), 1 deletion(-) diff --git a/linux-headers/asm-x86/hyperv.h b/linux-headers/asm-x86/hyper= v.h index ba3a63b..77ecfb9 100644 --- a/linux-headers/asm-x86/hyperv.h +++ b/linux-headers/asm-x86/hyperv.h @@ -152,6 +152,9 @@ /* MSR used to reset the guest OS. */ #define HV_X64_MSR_RESET 0x40000003 =20 +/* MSR used to provide vcpu runtime in 100ns units */ +#define HV_X64_MSR_VP_RUNTIME 0x40000010 + /* MSR used to read the per-partition time reference counter */ #define HV_X64_MSR_TIME_REF_COUNT 0x40000020 =20 diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h index 85b9bd2..97068ba 100644 --- a/target-i386/cpu-qom.h +++ b/target-i386/cpu-qom.h @@ -91,6 +91,7 @@ typedef struct X86CPU { bool hyperv_time; bool hyperv_reset; bool hyperv_vpindex; + bool hyperv_runtime; bool check_cpuid; bool enforce_cpuid; bool expose_kvm; diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 86dc8fa..f9e9b20 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -3123,6 +3123,7 @@ static Property x86_cpu_properties[] =3D { DEFINE_PROP_BOOL("hv-time", X86CPU, hyperv_time, false), DEFINE_PROP_BOOL("hv-reset", X86CPU, hyperv_reset, false), DEFINE_PROP_BOOL("hv-vpindex", X86CPU, hyperv_vpindex, false), + DEFINE_PROP_BOOL("hv-runtime", X86CPU, hyperv_runtime, false), DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, false), DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false), DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true), diff --git a/target-i386/cpu.h b/target-i386/cpu.h index af97772..4feede0 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -908,6 +908,7 @@ typedef struct CPUX86State { uint64_t msr_hv_guest_os_id; uint64_t msr_hv_vapic; uint64_t msr_hv_tsc; + uint64_t msr_hv_runtime; =20 /* exception/interrupt handling */ int error_code; diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 5bf2c51..9dc6057 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -82,6 +82,7 @@ static bool has_msr_hv_vapic; static bool has_msr_hv_tsc; static bool has_msr_hv_reset; static bool has_msr_hv_vpindex; +static bool has_msr_hv_runtime; static bool has_msr_mtrr; static bool has_msr_xss; =20 @@ -461,7 +462,8 @@ static bool hyperv_enabled(X86CPU *cpu) cpu->hyperv_time || cpu->hyperv_relaxed_timing || cpu->hyperv_reset || - cpu->hyperv_vpindex); + cpu->hyperv_vpindex || + cpu->hyperv_runtime); } =20 static Error *invtsc_mig_blocker; @@ -533,6 +535,9 @@ int kvm_arch_init_vcpu(CPUState *cs) if (cpu->hyperv_vpindex && has_msr_hv_vpindex) { c->eax |=3D HV_X64_MSR_VP_INDEX_AVAILABLE; } + if (cpu->hyperv_runtime && has_msr_hv_runtime) { + c->eax |=3D HV_X64_MSR_VP_RUNTIME_AVAILABLE; + } c =3D &cpuid_data.entries[cpuid_i++]; c->function =3D HYPERV_CPUID_ENLIGHTMENT_INFO; if (cpu->hyperv_relaxed_timing) { @@ -861,6 +866,10 @@ static int kvm_get_supported_msrs(KVMState *s) has_msr_hv_vpindex =3D true; continue; } + if (kvm_msr_list->indices[i] =3D=3D HV_X64_MSR_VP_RUNTIM= E) { + has_msr_hv_runtime =3D true; + continue; + } } } =20 @@ -1393,6 +1402,10 @@ static int kvm_put_msrs(X86CPU *cpu, int level) kvm_msr_entry_set(&msrs[n++], HV_X64_MSR_REFERENCE_TSC, env->msr_hv_tsc); } + if (has_msr_hv_runtime) { + kvm_msr_entry_set(&msrs[n++], HV_X64_MSR_VP_RUNTIME, + env->msr_hv_runtime); + } if (has_msr_mtrr) { kvm_msr_entry_set(&msrs[n++], MSR_MTRRdefType, env->mtrr_def= type); kvm_msr_entry_set(&msrs[n++], @@ -1748,6 +1761,9 @@ static int kvm_get_msrs(X86CPU *cpu) if (has_msr_hv_tsc) { msrs[n++].index =3D HV_X64_MSR_REFERENCE_TSC; } + if (has_msr_hv_runtime) { + msrs[n++].index =3D HV_X64_MSR_VP_RUNTIME; + } if (has_msr_mtrr) { msrs[n++].index =3D MSR_MTRRdefType; msrs[n++].index =3D MSR_MTRRfix64K_00000; @@ -1895,6 +1911,9 @@ static int kvm_get_msrs(X86CPU *cpu) case HV_X64_MSR_REFERENCE_TSC: env->msr_hv_tsc =3D msrs[i].data; break; + case HV_X64_MSR_VP_RUNTIME: + env->msr_hv_runtime =3D msrs[i].data; + break; case MSR_MTRRdefType: env->mtrr_deftype =3D msrs[i].data; break; diff --git a/target-i386/machine.c b/target-i386/machine.c index a0df64b..b219052 100644 --- a/target-i386/machine.c +++ b/target-i386/machine.c @@ -661,6 +661,25 @@ static const VMStateDescription vmstate_msr_hyperv_t= ime =3D { } }; =20 +static bool hyperv_runtime_enable_needed(void *opaque) +{ + X86CPU *cpu =3D opaque; + CPUX86State *env =3D &cpu->env; + + return env->msr_hv_runtime !=3D 0; +} + +static const VMStateDescription vmstate_msr_hyperv_runtime =3D { + .name =3D "cpu/msr_hyperv_runtime", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D hyperv_runtime_enable_needed, + .fields =3D (VMStateField[]) { + VMSTATE_UINT64(env.msr_hv_runtime, X86CPU), + VMSTATE_END_OF_LIST() + } +}; + static bool avx512_needed(void *opaque) { X86CPU *cpu =3D opaque; @@ -842,6 +861,7 @@ VMStateDescription vmstate_x86_cpu =3D { &vmstate_msr_hypercall_hypercall, &vmstate_msr_hyperv_vapic, &vmstate_msr_hyperv_time, + &vmstate_msr_hyperv_runtime, &vmstate_avx512, &vmstate_xss, NULL --=20 2.1.4