From: Glauber Costa <glommer@redhat.com>
To: kvm@vger.kernel.org
Cc: avi@redhat.com, zamsden@redhat.com, mtosatti@redhat.com
Subject: [PATCH v2 2/2] turn off kvmclock when resetting cpu
Date: Wed, 5 May 2010 15:19:21 -0400 [thread overview]
Message-ID: <1273087161-32428-3-git-send-email-glommer@redhat.com> (raw)
In-Reply-To: <1273087161-32428-2-git-send-email-glommer@redhat.com>
Currently, in the linux kernel, we reset kvmclock if we are rebooting
into a crash kernel through kexec. The rationale, is that a new kernel
won't follow the same memory addresses, and the memory where kvmclock is
located in the first kernel, will be something else in the second one.
We don't do it in normal reboots, because the second kernel ends up
registering kvmclock again, which has the effect of turning off the
first instance.
This is, however, totally wrong. This assumes we're booting into
a kernel that also has kvmclock enabled. If by some reason we reboot
into something that doesn't do kvmclock including but not limited to:
* rebooting into an older kernel without kvmclock support,
* rebooting with no-kvmclock,
* rebootint into another O.S,
we'll simply have the hypervisor writting into a random memory position
into the guest. Neat, uh?
Moreover, I believe the fix belongs in qemu, since it is the entity
more prepared to detect all kinds of reboots (by means of a cpu_reset),
not to mention the presence of misbehaving guests, that can forget
to turn kvmclock off.
It is also necessary to reset other msrs, so this patch resets
everything that kvm exports through its MSR list.
This patch fixes the issue for me.
Signed-off-by: Glauber Costa <glommer@redhat.com>
---
qemu-kvm-x86.c | 23 +++++++++++++++++++++++
1 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 5a2b552..bd74316 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -1417,8 +1417,31 @@ void kvm_arch_push_nmi(void *opaque)
}
#endif /* KVM_CAP_USER_NMI */
+static int kvm_reset_msrs(CPUState *env)
+{
+ struct {
+ struct kvm_msrs info;
+ struct kvm_msr_entry entries[100];
+ } msr_data;
+ int n;
+ struct kvm_msr_entry *msrs = msr_data.entries;
+
+ if (!kvm_msr_list)
+ return -1;
+
+ for (n = 0; n < kvm_msr_list->nmsrs; n++) {
+ kvm_msr_entry_set(&msrs[n], kvm_msr_list->indices[n], 0);
+ }
+
+ msr_data.info.nmsrs = n;
+
+ return kvm_vcpu_ioctl(env, KVM_SET_MSRS, &msr_data);
+}
+
+
void kvm_arch_cpu_reset(CPUState *env)
{
+ kvm_reset_msrs(env);
kvm_arch_reset_vcpu(env);
kvm_reset_mpstate(env);
}
--
1.6.2.2
next prev parent reply other threads:[~2010-05-05 19:21 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-05 19:19 [PATCH v2 0/2] fix kvmclock bug - memory corruption (v2) Glauber Costa
2010-05-05 19:19 ` [PATCH v2 1/2] change header for kvm_get_msr_list Glauber Costa
2010-05-05 19:19 ` Glauber Costa [this message]
2010-05-05 20:33 ` [PATCH v2 2/2] turn off kvmclock when resetting cpu Zachary Amsden
2010-05-05 21:18 ` Glauber Costa
2010-05-11 4:12 ` [PATCH v2 0/2] fix kvmclock bug - memory corruption (v2) Marcelo Tosatti
2010-05-11 8:54 ` Avi Kivity
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=1273087161-32428-3-git-send-email-glommer@redhat.com \
--to=glommer@redhat.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=zamsden@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