From: Jan Kiszka <jan.kiszka@siemens.com>
To: Glauber Costa <glommer@redhat.com>
Cc: kvm@vger.kernel.org, qemu-devel@nongnu.org, avi@redhat.com,
mtosatti@redhat.com
Subject: Re: [PATCH v2] make tsc stable over migration and machine start
Date: Wed, 02 Feb 2011 14:07:04 +0100 [thread overview]
Message-ID: <4D4956F8.7080602@siemens.com> (raw)
In-Reply-To: <1296648980-28883-1-git-send-email-glommer@redhat.com>
On 2011-02-02 13:16, Glauber Costa wrote:
> If the machine is stopped, we should not record two different tsc values
> upon a save operation. The same problem happens with kvmclock.
>
> But kvmclock is taking a different diretion, being now seen as a separate
> device. Since this is unlikely to happen with the tsc, I am taking the
> approach here of simply registering a handler for state change, and
> using a per-CPUState variable that prevents double updates for the TSC.
>
> Signed-off-by: Glauber Costa <glommer@redhat.com>
> CC: Jan Kiszka <jan.kiszka@web.de>
>
> ---
> v2: updated tsc validation logic, as asked by Jan
> ---
> target-i386/cpu.h | 1 +
> target-i386/kvm.c | 18 +++++++++++++++++-
> 2 files changed, 18 insertions(+), 1 deletions(-)
>
> diff --git a/target-i386/cpu.h b/target-i386/cpu.h
> index 6d619e8..6bb2e87 100644
> --- a/target-i386/cpu.h
> +++ b/target-i386/cpu.h
> @@ -732,6 +732,7 @@ typedef struct CPUX86State {
> uint32_t sipi_vector;
> uint32_t cpuid_kvm_features;
> uint32_t cpuid_svm_features;
> + bool tsc_valid;
>
> /* in order to simplify APIC support, we leave this pointer to the
> user */
> diff --git a/target-i386/kvm.c b/target-i386/kvm.c
> index ecb8405..9cc198a 100644
> --- a/target-i386/kvm.c
> +++ b/target-i386/kvm.c
> @@ -302,6 +302,15 @@ void kvm_inject_x86_mce(CPUState *cenv, int bank, uint64_t status,
>
> static int _kvm_arch_init_vcpu(CPUState *env);
>
> +static void cpu_update_state(void *opaque, int running, int reason)
> +{
> + CPUState *env = opaque;
> +
> + if (running) {
> + env->tsc_valid = false;
> + }
> +}
> +
> int kvm_arch_init_vcpu(CPUState *env)
> {
> int r;
> @@ -444,6 +453,8 @@ int kvm_arch_init_vcpu(CPUState *env)
> }
> #endif
>
> + qemu_add_vm_change_state_handler(cpu_update_state, env);
> +
> return kvm_vcpu_ioctl(env, KVM_SET_CPUID2, &cpuid_data);
> }
>
> @@ -1093,7 +1104,12 @@ static int kvm_get_msrs(CPUState *env)
> msrs[n++].index = MSR_STAR;
> if (kvm_has_msr_hsave_pa(env))
> msrs[n++].index = MSR_VM_HSAVE_PA;
> - msrs[n++].index = MSR_IA32_TSC;
> +
> + if (!env->tsc_valid) {
> + msrs[n++].index = MSR_IA32_TSC;
> + env->tsc_valid = !vm_running;
> + }
> +
> #ifdef TARGET_X86_64
> if (lm_capable_kernel) {
> msrs[n++].index = MSR_CSTAR;
Yep.
Reviewed-by: Jan Kiszka <jan.kiszka@siemens.com>
--
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
WARNING: multiple messages have this Message-ID (diff)
From: Jan Kiszka <jan.kiszka@siemens.com>
To: Glauber Costa <glommer@redhat.com>
Cc: mtosatti@redhat.com, qemu-devel@nongnu.org, kvm@vger.kernel.org,
avi@redhat.com
Subject: [Qemu-devel] Re: [PATCH v2] make tsc stable over migration and machine start
Date: Wed, 02 Feb 2011 14:07:04 +0100 [thread overview]
Message-ID: <4D4956F8.7080602@siemens.com> (raw)
In-Reply-To: <1296648980-28883-1-git-send-email-glommer@redhat.com>
On 2011-02-02 13:16, Glauber Costa wrote:
> If the machine is stopped, we should not record two different tsc values
> upon a save operation. The same problem happens with kvmclock.
>
> But kvmclock is taking a different diretion, being now seen as a separate
> device. Since this is unlikely to happen with the tsc, I am taking the
> approach here of simply registering a handler for state change, and
> using a per-CPUState variable that prevents double updates for the TSC.
>
> Signed-off-by: Glauber Costa <glommer@redhat.com>
> CC: Jan Kiszka <jan.kiszka@web.de>
>
> ---
> v2: updated tsc validation logic, as asked by Jan
> ---
> target-i386/cpu.h | 1 +
> target-i386/kvm.c | 18 +++++++++++++++++-
> 2 files changed, 18 insertions(+), 1 deletions(-)
>
> diff --git a/target-i386/cpu.h b/target-i386/cpu.h
> index 6d619e8..6bb2e87 100644
> --- a/target-i386/cpu.h
> +++ b/target-i386/cpu.h
> @@ -732,6 +732,7 @@ typedef struct CPUX86State {
> uint32_t sipi_vector;
> uint32_t cpuid_kvm_features;
> uint32_t cpuid_svm_features;
> + bool tsc_valid;
>
> /* in order to simplify APIC support, we leave this pointer to the
> user */
> diff --git a/target-i386/kvm.c b/target-i386/kvm.c
> index ecb8405..9cc198a 100644
> --- a/target-i386/kvm.c
> +++ b/target-i386/kvm.c
> @@ -302,6 +302,15 @@ void kvm_inject_x86_mce(CPUState *cenv, int bank, uint64_t status,
>
> static int _kvm_arch_init_vcpu(CPUState *env);
>
> +static void cpu_update_state(void *opaque, int running, int reason)
> +{
> + CPUState *env = opaque;
> +
> + if (running) {
> + env->tsc_valid = false;
> + }
> +}
> +
> int kvm_arch_init_vcpu(CPUState *env)
> {
> int r;
> @@ -444,6 +453,8 @@ int kvm_arch_init_vcpu(CPUState *env)
> }
> #endif
>
> + qemu_add_vm_change_state_handler(cpu_update_state, env);
> +
> return kvm_vcpu_ioctl(env, KVM_SET_CPUID2, &cpuid_data);
> }
>
> @@ -1093,7 +1104,12 @@ static int kvm_get_msrs(CPUState *env)
> msrs[n++].index = MSR_STAR;
> if (kvm_has_msr_hsave_pa(env))
> msrs[n++].index = MSR_VM_HSAVE_PA;
> - msrs[n++].index = MSR_IA32_TSC;
> +
> + if (!env->tsc_valid) {
> + msrs[n++].index = MSR_IA32_TSC;
> + env->tsc_valid = !vm_running;
> + }
> +
> #ifdef TARGET_X86_64
> if (lm_capable_kernel) {
> msrs[n++].index = MSR_CSTAR;
Yep.
Reviewed-by: Jan Kiszka <jan.kiszka@siemens.com>
--
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
next prev parent reply other threads:[~2011-02-02 13:07 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-02 12:16 [PATCH v2] make tsc stable over migration and machine start Glauber Costa
2011-02-02 12:16 ` [Qemu-devel] " Glauber Costa
2011-02-02 13:07 ` Jan Kiszka [this message]
2011-02-02 13:07 ` [Qemu-devel] " Jan Kiszka
2011-02-03 16:00 ` Marcelo Tosatti
2011-02-03 16:00 ` [Qemu-devel] " Marcelo Tosatti
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4D4956F8.7080602@siemens.com \
--to=jan.kiszka@siemens.com \
--cc=avi@redhat.com \
--cc=glommer@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.