[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4C1738D4.3070008@redhat.com>
Date: Tue, 15 Jun 2010 11:24:52 +0300
From: Avi Kivity <avi@...hat.com>
To: Zachary Amsden <zamsden@...hat.com>
CC: mtosatti@...hat.com, glommer@...hat.com, kvm@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH 08/17] Add clock sync request to hardware enable
On 06/15/2010 10:34 AM, Zachary Amsden wrote:
> If there are active VCPUs which are marked as belonging to
> a particular hardware CPU, request a clock sync for them when
> enabling hardware; the TSC could be desynchronized on a newly
> arriving CPU, and we need to recompute guests system time
> relative to boot after a suspend event.
>
> This covers both cases.
>
> Note that it is acceptable to take the spinlock, as either
> no other tasks will be running and no locks held (BSP after
> resume), or other tasks will be guaranteed to drop the lock
> relatively quickly (AP on CPU_STARTING).
>
> Noting we now get clock synchronization requests for VCPUs
> which are starting up (or restarting), it is tempting to
> attempt to remove the arch/x86/kvm/x86.c CPU hot-notifiers
> at this time, however it is not correct to do so; they are
> required for systems with non-constant TSC as the frequency
> may not be known immediately after the processor has started
> until the cpufreq driver has had a chance to run and query
> the chipset.
>
> Updated: implement better locking semantics for hardware_enable
>
> Removed the hack of dropping and retaking the lock by adding the
> semantic that we always hold kvm_lock when hardware_enable is
> called. The one place that doesn't need to worry about it is
> resume, as resuming a frozen CPU, the spinlock won't be taken.
>
> Signed-off-by: Zachary Amsden<zamsden@...hat.com>
> ---
> arch/x86/kvm/x86.c | 8 ++++++++
> virt/kvm/kvm_main.c | 6 +++++-
> 2 files changed, 13 insertions(+), 1 deletions(-)
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 4b15d03..05c559d 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -5442,7 +5442,15 @@ int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu)
>
> int kvm_arch_hardware_enable(void *garbage)
> {
> + struct kvm *kvm;
> + struct kvm_vcpu *vcpu;
> + int i;
> +
> kvm_shared_msr_cpu_online();
> + list_for_each_entry(kvm,&vm_list, vm_list)
> + kvm_for_each_vcpu(i, vcpu, kvm)
> + if (vcpu->cpu == smp_processor_id())
> + kvm_request_guest_time_update(vcpu);
> return kvm_x86_ops->hardware_enable(garbage);
> }
>
>
An alternative to this loop (and a similar one in the cpu frequency
notifier earlier) is to have a per-cpu cpu_freq_generation_counter,
which is checked on every entry against a snapshot of the counter in the
vcpu. This would replace the loop with an O(1) mechanism, at the cost
of another compare.
I don't think it's worthwhile at this point though, just something to
keep in mind.
--
error compiling committee.c: too many arguments to function
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists