x86/vdso: Introduce and use vgtod_ts
It's desired to support more clocks in the VDSO, e.g. CLOCK_TAI. This results either in indirect calls due to the larger switch case, which then requires retpolines or when the compiler is forced to avoid jump tables it results in even more conditionals. To avoid both variants which are bad for performance the high resolution functions and the coarse grained functions will be collapsed into one for each. That requires to store the clock specific base time in an array. Introcude struct vgtod_ts for storage and convert the data store, the update function and the individual clock functions over to use it. The new storage does not longer use gtod_long_t for seconds depending on 32 or 64 bit compile because this needs to be the full 64bit value even for 32bit when a Y2038 function is added. No point in keeping the distinction alive in the internal representation. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Andy Lutomirski <luto@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Matt Rickard <matt@softrans.com.au> Cc: Stephen Boyd <sboyd@kernel.org> Cc: John Stultz <john.stultz@linaro.org> Cc: Florian Weimer <fweimer@redhat.com> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Vitaly Kuznetsov <vkuznets@redhat.com> Cc: devel@linuxdriverproject.org Cc: virtualization@lists.linux-foundation.org Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Juergen Gross <jgross@suse.com> Link: https://lkml.kernel.org/r/20180917130707.324679401@linutronix.de
This commit is contained in:
@@ -5,33 +5,37 @@
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/clocksource.h>
|
||||
|
||||
#include <uapi/linux/time.h>
|
||||
|
||||
#ifdef BUILD_VDSO32_64
|
||||
typedef u64 gtod_long_t;
|
||||
#else
|
||||
typedef unsigned long gtod_long_t;
|
||||
#endif
|
||||
|
||||
struct vgtod_ts {
|
||||
u64 sec;
|
||||
u64 nsec;
|
||||
};
|
||||
|
||||
#define VGTOD_BASES (CLOCK_MONOTONIC_COARSE + 1)
|
||||
#define VGTOD_HRES (BIT(CLOCK_REALTIME) | BIT(CLOCK_MONOTONIC))
|
||||
#define VGTOD_COARSE (BIT(CLOCK_REALTIME_COARSE) | BIT(CLOCK_MONOTONIC_COARSE))
|
||||
|
||||
/*
|
||||
* vsyscall_gtod_data will be accessed by 32 and 64 bit code at the same time
|
||||
* so be carefull by modifying this structure.
|
||||
*/
|
||||
struct vsyscall_gtod_data {
|
||||
unsigned int seq;
|
||||
unsigned int seq;
|
||||
|
||||
int vclock_mode;
|
||||
u64 cycle_last;
|
||||
u64 mask;
|
||||
u32 mult;
|
||||
u32 shift;
|
||||
int vclock_mode;
|
||||
u64 cycle_last;
|
||||
u64 mask;
|
||||
u32 mult;
|
||||
u32 shift;
|
||||
|
||||
/* open coded 'struct timespec' */
|
||||
u64 wall_time_snsec;
|
||||
gtod_long_t wall_time_sec;
|
||||
gtod_long_t monotonic_time_sec;
|
||||
u64 monotonic_time_snsec;
|
||||
gtod_long_t wall_time_coarse_sec;
|
||||
gtod_long_t wall_time_coarse_nsec;
|
||||
gtod_long_t monotonic_time_coarse_sec;
|
||||
gtod_long_t monotonic_time_coarse_nsec;
|
||||
struct vgtod_ts basetime[VGTOD_BASES];
|
||||
|
||||
int tz_minuteswest;
|
||||
int tz_dsttime;
|
||||
|
Reference in New Issue
Block a user