x86, paravirt: Enable pvclock flags in vcpu_time_info structure
authorGlauber Costa <glommer@redhat.com>
Tue, 11 May 2010 16:17:39 +0000 (12:17 -0400)
committerAvi Kivity <avi@redhat.com>
Wed, 19 May 2010 08:40:59 +0000 (11:40 +0300)
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>
Acked-by: Zachary Amsden <zamsden@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
arch/x86/include/asm/pvclock-abi.h
arch/x86/include/asm/pvclock.h
arch/x86/kernel/pvclock.c

index 6d93508f262602eba40417dda7a0357d1ff47cb6..ec5c41ac4befec204ceef3ca0b825f7546de5b74 100644 (file)
@@ -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 {
index 53235fd5f8ce67cf4f085c092e611fa19fa04684..cd02f324aa6b39c8ba1d149b7646f356043fa77c 100644 (file)
@@ -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,
index 03801f2f761fc312ba80353425c1cc7243a0105f..f7fdd56bc0ab8a83c86a278be4cfda980293855a 100644 (file)
@@ -31,8 +31,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.
@@ -91,6 +99,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));