linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Zachary Amsden <zamsden@redhat.com>
To: KVM <kvm@vger.kernel.org>, Avi Kivity <avi@redhat.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Glauber Costa <glommer@redhat.com>
Cc: Linux-kernel <linux-kernel@vger.kernel.org>,
	Zachary Amsden <zamsden@redhat.com>
Subject: [PATCH 12/18] Add clock sync request to hardware enable
Date: Mon, 12 Jul 2010 16:08:06 -1000	[thread overview]
Message-ID: <1278986892-11733-13-git-send-email-zamsden@redhat.com> (raw)
In-Reply-To: <1278986892-11733-1-git-send-email-zamsden@redhat.com>

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@redhat.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 dcaece4..574cb69 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -5532,7 +5532,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);
 }
 
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index d4853a5..c0f4e70 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1961,7 +1961,9 @@ static int kvm_cpu_hotplug(struct notifier_block *notifier, unsigned long val,
 	case CPU_STARTING:
 		printk(KERN_INFO "kvm: enabling virtualization on CPU%d\n",
 		       cpu);
+		spin_lock(&kvm_lock);
 		hardware_enable(NULL);
+		spin_unlock(&kvm_lock);
 		break;
 	}
 	return NOTIFY_OK;
@@ -2166,8 +2168,10 @@ static int kvm_suspend(struct sys_device *dev, pm_message_t state)
 
 static int kvm_resume(struct sys_device *dev)
 {
-	if (kvm_usage_count)
+	if (kvm_usage_count) {
+		WARN_ON(spin_is_locked(&kvm_lock));
 		hardware_enable(NULL);
+	}
 	return 0;
 }
 
-- 
1.7.1


  parent reply	other threads:[~2010-07-13  2:11 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-13  2:07 KVM timekeeping fixes Zachary Amsden
2010-07-13  2:07 ` [PATCH 01/18] Make TSC offset writes non-preemptible Zachary Amsden
2010-07-13  2:07 ` [PATCH 02/18] Fix SVM VMCB reset Zachary Amsden
2010-07-13  2:07 ` [PATCH 03/18] TSC reset compensation Zachary Amsden
2010-07-13  2:07 ` [PATCH 04/18] Robust TSC compensation Zachary Amsden
2010-07-13  2:07 ` [PATCH 05/18] Make cpu_tsc_khz updates use local CPU Zachary Amsden
2010-07-13  2:08 ` [PATCH 06/18] Warn about unstable TSC Zachary Amsden
2010-07-13  2:08 ` [PATCH 07/18] Unify TSC logic Zachary Amsden
2010-07-13  2:08 ` [PATCH 08/18] Fix deep C-state TSC desynchronization Zachary Amsden
2010-07-13  2:08 ` [PATCH 09/18] Add helper functions for time computation Zachary Amsden
2010-07-13  2:08 ` [PATCH 10/18] Keep SMP VMs more in sync on unstable TSC Zachary Amsden
2010-07-13  2:08 ` [PATCH 11/18] Perform hardware_enable in CPU_STARTING callback Zachary Amsden
2010-07-13  2:08 ` Zachary Amsden [this message]
2010-07-13  2:08 ` [PATCH 13/18] Move scale_delta into common header Zachary Amsden
2010-07-13  2:08 ` [PATCH 14/18] Fix a possible backwards warp of kvmclock Zachary Amsden
2010-07-13  2:08 ` [PATCH 15/18] Implement getnsboottime kernel API Zachary Amsden
2010-07-13  2:08 ` [PATCH 16/18] Use getnsboottime in KVM Zachary Amsden
2010-07-13  2:08 ` [PATCH 17/18] Indicate reliable TSC in kvmclock Zachary Amsden
2010-07-13  2:08 ` [PATCH 18/18] Add timekeeping documentation Zachary Amsden
  -- strict thread matches above, loose matches on Subject: below --
2010-07-13  2:25 KVM timekeeping fixes, V2 Zachary Amsden
2010-07-13  2:25 ` [PATCH 12/18] Add clock sync request to hardware enable Zachary Amsden
2010-07-15  2:32   ` Rik van Riel

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=1278986892-11733-13-git-send-email-zamsden@redhat.com \
    --to=zamsden@redhat.com \
    --cc=avi@redhat.com \
    --cc=glommer@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mtosatti@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).