From: Paolo Bonzini <pbonzini@redhat.com>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Jan Kiszka <jan.kiszka@web.de>, Glauber Costa <glommer@gmail.com>,
kvm-devel <kvm@vger.kernel.org>,
qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [PATCH] kvmclock: clock should count only if vm is running
Date: Tue, 18 Jun 2013 11:02:27 +0200 [thread overview]
Message-ID: <51C02223.5020106@redhat.com> (raw)
In-Reply-To: <20130608020048.GA1412@amt.cnet>
Hi Marcelo, sorry for the late review.
Il 08/06/2013 04:00, Marcelo Tosatti ha scritto:
> kvmclock should not count while vm is paused, because:
>
> 1) if the vm is paused for long periods, timekeeping
> math can overflow while converting the (large) clocksource
> delta to nanoseconds.
>
> 2) Users rely on CLOCK_MONOTONIC to count run time, that is,
> time which OS has been in a runnable state (see CLOCK_BOOTTIME).
Do you have any ideas on how to implement CLOCK_BOOTTIME for kvmclock?
I think we need to add more fields for the delta between CLOCK_MONOTONIC
and CLOCK_BOOTTIME.
> Change kvmclock driver so as to save clock value when vm transitions
> from runnable to stopped state, and to restore clock value from stopped
> to runnable transition.
>
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
>
> diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c
> index 87d4d0f..7d2d005 100644
> --- a/hw/i386/kvm/clock.c
> +++ b/hw/i386/kvm/clock.c
> @@ -28,38 +28,6 @@ typedef struct KVMClockState {
> bool clock_valid;
> } KVMClockState;
>
> -static void kvmclock_pre_save(void *opaque)
> -{
> - KVMClockState *s = opaque;
> - struct kvm_clock_data data;
> - int ret;
> -
> - if (s->clock_valid) {
> - return;
> - }
> - ret = kvm_vm_ioctl(kvm_state, KVM_GET_CLOCK, &data);
> - if (ret < 0) {
> - fprintf(stderr, "KVM_GET_CLOCK failed: %s\n", strerror(ret));
> - data.clock = 0;
> - }
> - s->clock = data.clock;
> - /*
> - * If the VM is stopped, declare the clock state valid to avoid re-reading
> - * it on next vmsave (which would return a different value). Will be reset
> - * when the VM is continued.
> - */
> - s->clock_valid = !runstate_is_running();
> -}
> -
> -static int kvmclock_post_load(void *opaque, int version_id)
> -{
> - KVMClockState *s = opaque;
> - struct kvm_clock_data data;
> -
> - data.clock = s->clock;
> - data.flags = 0;
> - return kvm_vm_ioctl(kvm_state, KVM_SET_CLOCK, &data);
> -}
>
> static void kvmclock_vm_state_change(void *opaque, int running,
> RunState state)
> @@ -70,8 +38,18 @@ static void kvmclock_vm_state_change(void *opaque, int running,
> int ret;
>
> if (running) {
> + struct kvm_clock_data data;
> +
Do we need an "if (!s->clock_valid) return;" here, or an assertion? (Or
alternatively, what happens if s->clock_valid == false?)
> s->clock_valid = false;
>
> + data.clock = s->clock;
> + data.flags = 0;
> + ret = kvm_vm_ioctl(kvm_state, KVM_SET_CLOCK, &data);
> + if (ret < 0) {
> + fprintf(stderr, "KVM_SET_CLOCK failed: %s\n", strerror(ret));
> + abort();
> + }
> +
> if (!cap_clock_ctrl) {
> return;
> }
> @@ -84,6 +62,26 @@ static void kvmclock_vm_state_change(void *opaque, int running,
> return;
> }
> }
> + } else {
> + struct kvm_clock_data data;
> + int ret;
> +
> + if (s->clock_valid) {
> + return;
> + }
> + ret = kvm_vm_ioctl(kvm_state, KVM_GET_CLOCK, &data);
> + if (ret < 0) {
> + fprintf(stderr, "KVM_GET_CLOCK failed: %s\n", strerror(ret));
> + abort();
> + }
> + s->clock = data.clock;
> +
> + /*
> + * If the VM is stopped, declare the clock state valid to
> + * avoid re-reading it on next vmsave (which would return
> + * a different value). Will be reset when the VM is continued.
> + */
> + s->clock_valid = !runstate_is_running();
Here we know that !runstate_is_running() is true (we're in the else
branch of "if (running)") so it can just be "s->clock_valid = true".
This matches the false assignment in the other branch. This is just a
nit, but it makes the code clearer.
Paolo
> }
> }
>
> @@ -100,8 +98,6 @@ static const VMStateDescription kvmclock_vmsd = {
> .version_id = 1,
> .minimum_version_id = 1,
> .minimum_version_id_old = 1,
> - .pre_save = kvmclock_pre_save,
> - .post_load = kvmclock_post_load,
> .fields = (VMStateField[]) {
> VMSTATE_UINT64(clock, KVMClockState),
> VMSTATE_END_OF_LIST()
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
WARNING: multiple messages have this Message-ID (diff)
From: Paolo Bonzini <pbonzini@redhat.com>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Glauber Costa <glommer@gmail.com>, Jan Kiszka <jan.kiszka@web.de>,
qemu-devel <qemu-devel@nongnu.org>,
kvm-devel <kvm@vger.kernel.org>
Subject: Re: [Qemu-devel] [PATCH] kvmclock: clock should count only if vm is running
Date: Tue, 18 Jun 2013 11:02:27 +0200 [thread overview]
Message-ID: <51C02223.5020106@redhat.com> (raw)
In-Reply-To: <20130608020048.GA1412@amt.cnet>
Hi Marcelo, sorry for the late review.
Il 08/06/2013 04:00, Marcelo Tosatti ha scritto:
> kvmclock should not count while vm is paused, because:
>
> 1) if the vm is paused for long periods, timekeeping
> math can overflow while converting the (large) clocksource
> delta to nanoseconds.
>
> 2) Users rely on CLOCK_MONOTONIC to count run time, that is,
> time which OS has been in a runnable state (see CLOCK_BOOTTIME).
Do you have any ideas on how to implement CLOCK_BOOTTIME for kvmclock?
I think we need to add more fields for the delta between CLOCK_MONOTONIC
and CLOCK_BOOTTIME.
> Change kvmclock driver so as to save clock value when vm transitions
> from runnable to stopped state, and to restore clock value from stopped
> to runnable transition.
>
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
>
> diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c
> index 87d4d0f..7d2d005 100644
> --- a/hw/i386/kvm/clock.c
> +++ b/hw/i386/kvm/clock.c
> @@ -28,38 +28,6 @@ typedef struct KVMClockState {
> bool clock_valid;
> } KVMClockState;
>
> -static void kvmclock_pre_save(void *opaque)
> -{
> - KVMClockState *s = opaque;
> - struct kvm_clock_data data;
> - int ret;
> -
> - if (s->clock_valid) {
> - return;
> - }
> - ret = kvm_vm_ioctl(kvm_state, KVM_GET_CLOCK, &data);
> - if (ret < 0) {
> - fprintf(stderr, "KVM_GET_CLOCK failed: %s\n", strerror(ret));
> - data.clock = 0;
> - }
> - s->clock = data.clock;
> - /*
> - * If the VM is stopped, declare the clock state valid to avoid re-reading
> - * it on next vmsave (which would return a different value). Will be reset
> - * when the VM is continued.
> - */
> - s->clock_valid = !runstate_is_running();
> -}
> -
> -static int kvmclock_post_load(void *opaque, int version_id)
> -{
> - KVMClockState *s = opaque;
> - struct kvm_clock_data data;
> -
> - data.clock = s->clock;
> - data.flags = 0;
> - return kvm_vm_ioctl(kvm_state, KVM_SET_CLOCK, &data);
> -}
>
> static void kvmclock_vm_state_change(void *opaque, int running,
> RunState state)
> @@ -70,8 +38,18 @@ static void kvmclock_vm_state_change(void *opaque, int running,
> int ret;
>
> if (running) {
> + struct kvm_clock_data data;
> +
Do we need an "if (!s->clock_valid) return;" here, or an assertion? (Or
alternatively, what happens if s->clock_valid == false?)
> s->clock_valid = false;
>
> + data.clock = s->clock;
> + data.flags = 0;
> + ret = kvm_vm_ioctl(kvm_state, KVM_SET_CLOCK, &data);
> + if (ret < 0) {
> + fprintf(stderr, "KVM_SET_CLOCK failed: %s\n", strerror(ret));
> + abort();
> + }
> +
> if (!cap_clock_ctrl) {
> return;
> }
> @@ -84,6 +62,26 @@ static void kvmclock_vm_state_change(void *opaque, int running,
> return;
> }
> }
> + } else {
> + struct kvm_clock_data data;
> + int ret;
> +
> + if (s->clock_valid) {
> + return;
> + }
> + ret = kvm_vm_ioctl(kvm_state, KVM_GET_CLOCK, &data);
> + if (ret < 0) {
> + fprintf(stderr, "KVM_GET_CLOCK failed: %s\n", strerror(ret));
> + abort();
> + }
> + s->clock = data.clock;
> +
> + /*
> + * If the VM is stopped, declare the clock state valid to
> + * avoid re-reading it on next vmsave (which would return
> + * a different value). Will be reset when the VM is continued.
> + */
> + s->clock_valid = !runstate_is_running();
Here we know that !runstate_is_running() is true (we're in the else
branch of "if (running)") so it can just be "s->clock_valid = true".
This matches the false assignment in the other branch. This is just a
nit, but it makes the code clearer.
Paolo
> }
> }
>
> @@ -100,8 +98,6 @@ static const VMStateDescription kvmclock_vmsd = {
> .version_id = 1,
> .minimum_version_id = 1,
> .minimum_version_id_old = 1,
> - .pre_save = kvmclock_pre_save,
> - .post_load = kvmclock_post_load,
> .fields = (VMStateField[]) {
> VMSTATE_UINT64(clock, KVMClockState),
> VMSTATE_END_OF_LIST()
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2013-06-18 9:02 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-08 2:00 [PATCH] kvmclock: clock should count only if vm is running Marcelo Tosatti
2013-06-08 2:00 ` [Qemu-devel] " Marcelo Tosatti
2013-06-18 9:02 ` Paolo Bonzini [this message]
2013-06-18 9:02 ` Paolo Bonzini
2013-06-18 23:20 ` Marcelo Tosatti
2013-06-18 23:20 ` [Qemu-devel] " Marcelo Tosatti
2013-06-18 23:38 ` [PATCH] kvmclock: clock should count only if vm is running (v2) Marcelo Tosatti
2013-06-18 23:38 ` [Qemu-devel] " Marcelo Tosatti
2013-06-25 12:18 ` Gleb Natapov
2013-06-25 12:18 ` [Qemu-devel] " Gleb Natapov
2013-07-01 11:44 ` Paolo Bonzini
2013-07-01 11:44 ` [Qemu-devel] " Paolo Bonzini
2013-07-01 11:53 ` Gleb Natapov
2013-07-01 11:53 ` [Qemu-devel] " Gleb Natapov
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=51C02223.5020106@redhat.com \
--to=pbonzini@redhat.com \
--cc=glommer@gmail.com \
--cc=jan.kiszka@web.de \
--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.