mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-03 19:24:02 +08:00
x86, paravirt: Enable pvclock flags in vcpu_time_info structure
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>
This commit is contained in:
parent
b69e8caef5
commit
424c32f1aa
@ -29,7 +29,8 @@ struct pvclock_vcpu_time_info {
|
|||||||
u64 system_time;
|
u64 system_time;
|
||||||
u32 tsc_to_system_mul;
|
u32 tsc_to_system_mul;
|
||||||
s8 tsc_shift;
|
s8 tsc_shift;
|
||||||
u8 pad[3];
|
u8 flags;
|
||||||
|
u8 pad[2];
|
||||||
} __attribute__((__packed__)); /* 32 bytes */
|
} __attribute__((__packed__)); /* 32 bytes */
|
||||||
|
|
||||||
struct pvclock_wall_clock {
|
struct pvclock_wall_clock {
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
/* some helper functions for xen and kvm pv clock sources */
|
/* some helper functions for xen and kvm pv clock sources */
|
||||||
cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src);
|
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);
|
unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src);
|
||||||
void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
|
void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
|
||||||
struct pvclock_vcpu_time_info *vcpu,
|
struct pvclock_vcpu_time_info *vcpu,
|
||||||
|
@ -31,8 +31,16 @@ struct pvclock_shadow_time {
|
|||||||
u32 tsc_to_nsec_mul;
|
u32 tsc_to_nsec_mul;
|
||||||
int tsc_shift;
|
int tsc_shift;
|
||||||
u32 version;
|
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,
|
* Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
|
||||||
* yielding a 64-bit result.
|
* 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->system_timestamp = src->system_time;
|
||||||
dst->tsc_to_nsec_mul = src->tsc_to_system_mul;
|
dst->tsc_to_nsec_mul = src->tsc_to_system_mul;
|
||||||
dst->tsc_shift = src->tsc_shift;
|
dst->tsc_shift = src->tsc_shift;
|
||||||
|
dst->flags = src->flags;
|
||||||
rmb(); /* test version after fetching data */
|
rmb(); /* test version after fetching data */
|
||||||
} while ((src->version & 1) || (dst->version != src->version));
|
} while ((src->version & 1) || (dst->version != src->version));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user