Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > fc11cd6e1c513a17304da94a5390f3cd > files > 3831

kernel-2.6.18-194.11.1.el5.src.rpm

From: Glauber Costa <glommer@redhat.com>
Date: Mon, 24 May 2010 20:08:07 -0400
Subject: [virt] enable pvclock flags in vcpu_time_info structure
Message-id: <1274731689-21363-4-git-send-email-glommer@redhat.com>
Patchwork-id: 25799
O-Subject: [PATCH RHEL5.6/5.5.z v2 3/5] Enable pvclock flags in vcpu_time_info
	structure
Bugzilla: 570824
RH-Acked-by: Zachary Amsden <zamsden@redhat.com>
RH-Acked-by: Rik van Riel <riel@redhat.com>
RH-Acked-by: Jes Sorensen <Jes.Sorensen@redhat.com>

RH-Author: Glauber Costa <glommer@redhat.com>
RH-Bugzilla: 570824 and many, many others
RH-Upstream-status: kvm/master

This patch removes one padding byte and transform it into a flags
field. New versions of guests using pvclock will query these flags
upon each read.

Flags, however, will only be interpreted when the guest decides to.
It uses the pvclock_valid_flags function to signal that a specific
set of flags should be taken into consideration. Which flags are valid
are usually devised via HV negotiation.

Signed-off-by: Glauber Costa <glommer@redhat.com>
CC: Jeremy Fitzhardinge <jeremy@goop.org>

flags

diff --git a/arch/i386/kernel/pvclock.c b/arch/i386/kernel/pvclock.c
index 94280dd..dfa8dd8 100644
--- a/arch/i386/kernel/pvclock.c
+++ b/arch/i386/kernel/pvclock.c
@@ -35,8 +35,16 @@ struct pvclock_shadow_time {
 	u32 tsc_to_nsec_mul;
 	int tsc_shift;
 	u32 version;
+	u8  flags;
 };
 
+static u8 valid_flags __read_mostly = 0;
+
+void pvclock_set_flags(u8 flags)
+{
+	valid_flags = flags;
+}
+
 /*
  * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
  * yielding a 64-bit result.
@@ -97,6 +105,7 @@ static unsigned pvclock_get_time_values(struct pvclock_shadow_time *dst,
 		dst->system_timestamp  = src->system_time;
 		dst->tsc_to_nsec_mul   = src->tsc_to_system_mul;
 		dst->tsc_shift         = src->tsc_shift;
+		dst->flags             = src->flags;
 		rmb();		/* test version after fetching data */
 	} while ((src->version & 1) || (dst->version != src->version));
 
diff --git a/include/asm-i386/pvclock-abi.h b/include/asm-i386/pvclock-abi.h
index 6d93508..ec5c41a 100644
--- a/include/asm-i386/pvclock-abi.h
+++ b/include/asm-i386/pvclock-abi.h
@@ -29,7 +29,8 @@ struct pvclock_vcpu_time_info {
 	u64   system_time;
 	u32   tsc_to_system_mul;
 	s8    tsc_shift;
-	u8    pad[3];
+	u8    flags;
+	u8    pad[2];
 } __attribute__((__packed__)); /* 32 bytes */
 
 struct pvclock_wall_clock {
diff --git a/include/asm-i386/pvclock.h b/include/asm-i386/pvclock.h
index 53235fd..cd02f32 100644
--- a/include/asm-i386/pvclock.h
+++ b/include/asm-i386/pvclock.h
@@ -6,6 +6,7 @@
 
 /* some helper functions for xen and kvm pv clock sources */
 cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src);
+void pvclock_set_flags(u8 flags);
 unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src);
 void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
 			    struct pvclock_vcpu_time_info *vcpu,
diff --git a/include/asm-x86_64/pvclock-abi.h b/include/asm-x86_64/pvclock-abi.h
index 6d93508..ec5c41a 100644
--- a/include/asm-x86_64/pvclock-abi.h
+++ b/include/asm-x86_64/pvclock-abi.h
@@ -29,7 +29,8 @@ struct pvclock_vcpu_time_info {
 	u64   system_time;
 	u32   tsc_to_system_mul;
 	s8    tsc_shift;
-	u8    pad[3];
+	u8    flags;
+	u8    pad[2];
 } __attribute__((__packed__)); /* 32 bytes */
 
 struct pvclock_wall_clock {
diff --git a/include/asm-x86_64/pvclock.h b/include/asm-x86_64/pvclock.h
index 53235fd..cd02f32 100644
--- a/include/asm-x86_64/pvclock.h
+++ b/include/asm-x86_64/pvclock.h
@@ -6,6 +6,7 @@
 
 /* some helper functions for xen and kvm pv clock sources */
 cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src);
+void pvclock_set_flags(u8 flags);
 unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src);
 void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
 			    struct pvclock_vcpu_time_info *vcpu,