[3.8.y.z,extended,stable] Patch "x86: kvmclock: zero initialize pvclock shared memory area" has been added to staging queue

Message ID 1372198807-19138-1-git-send-email-kamal@canonical.com
State New
Headers show

Commit Message

Kamal Mostafa June 25, 2013, 10:20 p.m.
This is a note to let you know that I have just added a patch titled

    x86: kvmclock: zero initialize pvclock shared memory area

to the linux-3.8.y-queue branch of the 3.8.y.z extended stable tree 
which can be found at:


This patch is scheduled to be released in version

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.8.y.z tree, see



From 0a3387fd602f90aa2692cae49735155b9fb87233 Mon Sep 17 00:00:00 2001
From: Igor Mammedov <imammedo@redhat.com>
Date: Mon, 10 Jun 2013 18:31:11 +0200
Subject: x86: kvmclock: zero initialize pvclock shared memory area

commit 07868fc6aaf57847b0f3a3d53086b7556eb83f4a upstream.

kernel might hung in pvclock_clocksource_read() due to
uninitialized memory might contain odd version value in
following cycle:

        do {
                version = __pvclock_read_cycles(src, &ret, &flags);
        } while ((src->version & 1) || version != src->version);

if secondary kvmclock is accessed before it's registered with kvm.

Clear garbage in pvclock shared memory area right after it's
allocated to avoid this issue.

Ref: https://bugzilla.kernel.org/show_bug.cgi?id=59521
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
[See BZ for analysis.  We may want a different fix for 3.11, but
 this is the safest for now - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
 arch/x86/kernel/kvmclock.c | 1 +
 1 file changed, 1 insertion(+)



diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c
index 5bedbdd..a855a2e 100644
--- a/arch/x86/kernel/kvmclock.c
+++ b/arch/x86/kernel/kvmclock.c
@@ -238,6 +238,7 @@  void __init kvmclock_init(void)
 	if (!mem)
 	hv_clock = __va(mem);
+	memset(hv_clock, 0, size);

 	if (kvm_register_clock("boot clock")) {
 		hv_clock = NULL;