timer fixes
Linus,
Please pull the latest timers-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers-urgent-for-linus
HEAD: 4e250fdde9be50581c7dd5fed88c9b9960615314 time: Remove all direct references to timekeeper
One regression fix, and a couple of cleanups that clean up the code flow in areas that had high-profile bugs recently.
Thanks,
Ingo
------------------>
Catalin Marinas (1):
time/jiffies: Allow CLOCK_TICK_RATE to be undefined
John Stultz (5):
time: Fix casting issue in tk_set_xtime and tk_xtime_add time/jiffies: Rename ACTHZ to SHIFTED_HZ
time: Clean up stray newlines
time: Clean up offs_real/wall_to_mono and offs_boot/total_sleep_time updates
time: Remove all direct references to timekeeper
include/linux/jiffies.h | 29 ++-- include/linux/timex.h | 2 +- kernel/time/jiffies.c | 2 +- kernel/time/ntp.c | 2 +- kernel/time/timekeeping.c | 376 ++++++++++++++++++++++++--------------------- 5 files changed, 227 insertions(+), 184 deletions(-)
include/linux/jiffies.h +19 -10
@@ -39,9 +39,6 @@# error Invalid value of HZ.#endif -/* LATCH is used in the interval timer and ftape setup. */ -#define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ)/* For divider */ -/* Suppose we want to divide two numbers NOM and DEN: NOM/DEN, then we can * improve accuracy by shifting LSH bits, hence calculating: * (NOM << LSH) / DEN
@@ -54,18 +51,30 @@#define SH_DIV (NOM ,DEN ,LSH ) ( (((NOM) / (DEN)) << (LSH)) \ + ((((NOM) % (DEN)) << (LSH)) + (DEN) / 2) / (DEN)) -/* HZ is the requested value. ACTHZ is actual HZ ("<< 8" is for accuracy) */ -#define ACTHZ (SH_DIV (CLOCK_TICK_RATE, LATCH, 8)) +#ifdef CLOCK_TICK_RATE +/* LATCH is used in the interval timer and ftape setup. */ +# define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ)/* For divider */ + +/* +* HZ is the requested value. However the CLOCK_TICK_RATE may not allow +* for exactly HZ. So SHIFTED_HZ is high res HZ ("<< 8" is for accuracy) +*/ +# define SHIFTED_HZ (SH_DIV(CLOCK_TICK_RATE, LATCH, 8)) +#else +# define SHIFTED_HZ (HZ << 8) +#endif -/* TICK_NSEC is the time between ticks in nsec assuming real ACTHZ */ -#define TICK_NSEC (SH_DIV (1000000UL * 1000, ACTHZ, 8)) +/* TICK_NSEC is the time between ticks in nsec assuming SHIFTED_HZ */ +#define TICK_NSEC (SH_DIV(1000000UL * 1000, SHIFTED_HZ, 8))/* TICK_USEC is the time between ticks in usec assuming fake USER_HZ */ #define TICK_USEC ((1000000UL + USER_HZ/2) / USER_HZ) -/* TICK_USEC_TO_NSEC is the time between ticks in nsec assuming real ACTHZ and */ -/* a value TUSEC for TICK_USEC (can be set bij adjtimex) */ -#define TICK_USEC_TO_NSEC (TUSEC ) (SH_DIV (TUSEC * USER_HZ * 1000, ACTHZ, 8)) +/* +* TICK_USEC_TO_NSEC is the time between ticks in nsec assuming SHIFTED_HZ and +* a value TUSEC for TICK_USEC (can be set bij adjtimex) +*/ +#define TICK_USEC_TO_NSEC (TUSEC ) (SH_DIV(TUSEC * USER_HZ * 1000, SHIFTED_HZ, 8))/* some arch's have a small-data section that can be accessed register-relative * but that can only take up to, say, 4-byte variables. jiffies being part of
include/linux/timex.h +1 -1
@@ -232,7 +232,7 @@ struct timex {* estimated error = NTP dispersion. */ extern unsigned long tick_usec;/* USER_HZ period (usec) */ -extern unsigned long tick_nsec;/* ACTHZ period (nsec) */ +extern unsigned long tick_nsec;/* SHIFTED_HZ period (nsec) */ extern void ntp_init (void );extern void ntp_clear (void );
kernel/time/jiffies.c +1 -1
@@ -37,7 +37,7 @@* requested HZ value. It is also not recommended * for "tick-less" systems. */ -#define NSEC_PER_JIFFY ((u32)((((u64)NSEC_PER_SEC)<<8)/ACTHZ)) +#define NSEC_PER_JIFFY ((u32)((((u64)NSEC_PER_SEC)<<8)/SHIFTED_HZ))/* Since jiffies uses a simple NSEC_PER_JIFFY multiplier * conversion, the .shift value could be zero. However
kernel/time/ntp.c +1 -1
@@ -28,7 +28,7 @@ DEFINE_SPINLOCK(ntp_lock);/* USER_HZ period (usecs): */ unsigned long tick_usec =TICK_USEC ; -/* ACTHZ period (nsecs): */ +/* SHIFTED_HZ period (nsecs): */ unsigned long tick_nsec;static u64 tick_length;
kernel/time/timekeeping.c +205 -171
843 lines not on this page · raw message