From: Paolo Bonzini <pbonzini@redhat.com>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>,
kvm@vger.kernel.org, Juan Quintela <quintela@redhat.com>,
Radim Krcmar <rkrcmar@redhat.com>,
qemu-devel@nongnu.org,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>
Subject: Re: [qemu patch 2/2] kvmclock: reduce kvmclock difference on migration
Date: Mon, 14 Nov 2016 16:00:38 +0100 [thread overview]
Message-ID: <67bffd95-2e4e-7273-c154-a3fdfe622387@redhat.com> (raw)
In-Reply-To: <20161114145054.GA28663@amt.cnet>
On 14/11/2016 15:50, Marcelo Tosatti wrote:
> Well, i didnt want to mix the meaning of the variables:
>
> + /* whether machine supports reliable KVM_GET_CLOCK */
> + bool mach_use_reliable_get_clock;
> +
> + /* whether source host supported reliable KVM_GET_CLOCK */
> + bool src_use_reliable_get_clock;
>
> See the comments on top (later if you look at the variable,
> then have to think: well it has one name, but its disabled
> by that other path as well, so its more than its
> name,etc...).
>
>> I'm thinking "mach_use_reliable_get_clock is just for migration,
>
> Thats whether the machine supports it. New machines have it enabled,
> olders don't.
Yes.
>> src_use_reliable_get_clock is the state".
>
> Thats whether the migration source supported it.
But it's not used only for migration. It's used on every vmstate change
(running->stop and stop->running, isn't it? I think that, apart from
the migration case, it's better to use s->clock if kvmclock is stable,
even on older machine types.
>>>>> +static bool kvmclock_src_use_reliable_get_clock(void *opaque)
>>>>> +{
>>>>> + KVMClockState *s = opaque;
>>>>> +
>>>>> + /*
>>>>> + * On machine types that support reliable KVM_GET_CLOCK,
>>>>> + * if host kernel does provide reliable KVM_GET_CLOCK,
>>>>> + * set src_use_reliable_get_clock=true so that destination
>>>>> + * avoids reading kvmclock from memory.
>>>>> + */
>>>>> + if (s->mach_use_reliable_get_clock && kvm_has_adjust_clock_stable()) {
>>>>> + s->src_use_reliable_get_clock = true;
>>>>> + }
>>>>> +
>>>>> + return s->src_use_reliable_get_clock;
>>>>> +}
>>>>
>>>> Here you can just return s->mach_use_reliable_get_clock.
>>>
>>> mach_use_reliable_get_clock can be true but host might not support it.
>>
>> Yes, but the "needed" function is only required to avoid breaking
>> pc-i440fx-2.7 and earlier.
>
> "needed" is required so that the migration between:
>
> SRC DEST BEHAVIOUR
> ~support supports on migration read from guest,
> on stop/cont use
> kvm_get_clock/kvm_set_clock
>
> Destination does not use KVM_GET_CLOCK value (which is
> broken and should not be used).
If needed returns false, the destination will see
src_use_reliable_get_clock = false anyway.
If needed returns true, the destination can still see
src_use_reliable_get_clock = false if that's the value.
needed src_use_reliable_get_clock effect
false false use kvmclock_current_nsec
false true use kvmclock_current_nsec
true false use kvmclock_current_nsec
true true use s->clock
So the idea is:
- set s->clock and s->reliable_get_clock on every KVM_GET_CLOCK
- on migration source, use subsections and
s->mach_use_reliable_get_clock to avoid breaking migration on pre-2.8
machine types
- on migration destination, use .pre_load so that s->reliable_get_clock
is initialized to false on older machine types
>> If you return true here, you can still
>> migrate a "false" value for src_use_reliable_get_clock.
>
> But the source only uses a reliable KVM_GET_CLOCK if
> both conditions are true.
>
> And the subsection is only needed if the source
> uses a reliable KVM_GET_CLOCK.
Yes, but the point of the subsection is just to avoid breaking migration
format.
>> It is the same as "is using masterclock", which is actually a stricter
>> condition than the KVM_CHECK_EXTENSION return value. The right check to
>> use is whether masterclock is in use,
>
> Actually its "has a reliable KVM_GET_CLOCK" (which returns
> get_kernel_clock() + (rdtsc() - tsc_timestamp),
>
> "broken KVM_GET_CLOCK" = get_kernel_clock()
Yes. And these end up being the same.
Paolo
next prev parent reply other threads:[~2016-11-14 15:00 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-14 12:36 [qemu patch 0/2] improve kvmclock difference on migration Marcelo Tosatti
2016-11-14 12:36 ` [qemu patch 1/2] kvm: sync linux headers Marcelo Tosatti
2016-11-14 12:36 ` [qemu patch 2/2] kvmclock: reduce kvmclock difference on migration Marcelo Tosatti
2016-11-14 13:54 ` Paolo Bonzini
2016-11-14 14:00 ` Marcelo Tosatti
2016-11-14 14:22 ` Paolo Bonzini
2016-11-14 14:50 ` Marcelo Tosatti
2016-11-14 15:00 ` Paolo Bonzini [this message]
2016-11-14 15:40 ` Marcelo Tosatti
2016-11-14 16:43 ` Paolo Bonzini
2016-11-14 17:13 ` Marcelo Tosatti
2016-11-14 17:20 ` Paolo Bonzini
2016-11-14 18:15 ` Marcelo Tosatti
2016-11-17 12:16 ` Marcelo Tosatti
2016-11-17 13:03 ` Paolo Bonzini
2016-11-28 13:47 ` Paolo Bonzini
2016-11-28 14:28 ` Eduardo Habkost
2016-11-28 15:12 ` Paolo Bonzini
2016-11-28 16:36 ` Marcelo Tosatti
2016-11-28 17:30 ` Paolo Bonzini
2016-11-14 14:11 ` Juan Quintela
2016-11-14 14:09 ` Juan Quintela
2016-11-14 15:37 ` 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=67bffd95-2e4e-7273-c154-a3fdfe622387@redhat.com \
--to=pbonzini@redhat.com \
--cc=dgilbert@redhat.com \
--cc=ehabkost@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=rkrcmar@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).