This patch introduces hrtimer_get_res64() function to get the timer resolution
with timespec64 type, and moves the hrtimer_get_res() function into
include/linux/hrtimer.h as a 'static inline' helper that just calls hrtimer_get_res64.
It is ready for 2038 year when getting the timer resolution by hrtimer_get_res64() function
with timespec64 type, and it is convenient to delete the old hrtimer_get_res() function
in hrtimer.h file.
Signed-off-by: Baolin Wang <baolin.wang(a)linaro.org>
---
include/linux/hrtimer.h | 12 +++++++++++-
kernel/time/hrtimer.c | 10 +++++-----
2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
index 05f6df1..ee8ed44 100644
--- a/include/linux/hrtimer.h
+++ b/include/linux/hrtimer.h
@@ -383,7 +383,17 @@ static inline int hrtimer_restart(struct hrtimer *timer)
/* Query timers: */
extern ktime_t hrtimer_get_remaining(const struct hrtimer *timer);
-extern int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp);
+extern int hrtimer_get_res64(const clockid_t which_clock,
+ struct timespec64 *tp);
+
+static inline int hrtimer_get_res(const clockid_t which_clock,
+ struct timespec *tp)
+{
+ struct timespec64 *ts64;
+
+ *ts64 = timespec_to_timespec64(*tp);
+ return hrtimer_get_res64(which_clock, ts64);
+}
extern ktime_t hrtimer_get_next_event(void);
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index bee0c1f..508d936 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -1175,24 +1175,24 @@ void hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
EXPORT_SYMBOL_GPL(hrtimer_init);
/**
- * hrtimer_get_res - get the timer resolution for a clock
+ * hrtimer_get_res64 - get the timer resolution for a clock
* @which_clock: which clock to query
- * @tp: pointer to timespec variable to store the resolution
+ * @tp: pointer to timespec64 variable to store the resolution
*
* Store the resolution of the clock selected by @which_clock in the
* variable pointed to by @tp.
*/
-int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp)
+int hrtimer_get_res64(const clockid_t which_clock, struct timespec64 *tp)
{
struct hrtimer_cpu_base *cpu_base;
int base = hrtimer_clockid_to_base(which_clock);
cpu_base = raw_cpu_ptr(&hrtimer_bases);
- *tp = ktime_to_timespec(cpu_base->clock_base[base].resolution);
+ *tp = ktime_to_timespec64(cpu_base->clock_base[base].resolution);
return 0;
}
-EXPORT_SYMBOL_GPL(hrtimer_get_res);
+EXPORT_SYMBOL_GPL(hrtimer_get_res64);
static void __run_hrtimer(struct hrtimer *timer, ktime_t *now)
{
--
1.7.9.5
This patch adds current_kernel_time64() function with timespec64 type,
and makes current_kernel_time() 'static inline' and moves it to timekeeping.h
file.
It is convenient for user to get the current kernel time with timespec64 type,
and delete the current_kernel_time() function easily in timekeeping.h file. That
is ready for 2038 when get the current time.
Signed-off-by: Baolin Wang <baolin.wang(a)linaro.org>
---
include/linux/timekeeping.h | 10 +++++++++-
kernel/time/timekeeping.c | 6 +++---
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h
index 3eaae47..c6d5ae9 100644
--- a/include/linux/timekeeping.h
+++ b/include/linux/timekeeping.h
@@ -18,10 +18,18 @@ extern int do_sys_settimeofday(const struct timespec *tv,
* Kernel time accessors
*/
unsigned long get_seconds(void);
-struct timespec current_kernel_time(void);
+struct timespec64 current_kernel_time64(void);
/* does not take xtime_lock */
struct timespec __current_kernel_time(void);
+static inline struct timespec current_kernel_time(void)
+{
+ struct timespec64 now;
+
+ now = current_kernel_time64();
+ return timespec64_to_timespec(now);
+}
+
/*
* timespec based interfaces
*/
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 91db941..8ccc02c 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -1721,7 +1721,7 @@ struct timespec __current_kernel_time(void)
return timespec64_to_timespec(tk_xtime(tk));
}
-struct timespec current_kernel_time(void)
+struct timespec64 current_kernel_time64(void)
{
struct timekeeper *tk = &tk_core.timekeeper;
struct timespec64 now;
@@ -1733,9 +1733,9 @@ struct timespec current_kernel_time(void)
now = tk_xtime(tk);
} while (read_seqcount_retry(&tk_core.seq, seq));
- return timespec64_to_timespec(now);
+ return now;
}
-EXPORT_SYMBOL(current_kernel_time);
+EXPORT_SYMBOL(current_kernel_time64);
struct timespec64 get_monotonic_coarse64(void)
{
--
1.7.9.5
This patch series changes the 32-bit time type (timespec/itimerspec) to the 64-bit one
(timespec64/itimerspec64), since 32-bit time types will break in the year 2038.
This patch series introduces new methods with timespec64/itimerspec64 type,
and removes the old ones with timespec/itimerspec type for posix_clock_operations
and k_clock structure.
Also introduces some new functions with timespec64/itimerspec64 type, like current_kernel_time64(),
hrtimer_get_res64(), cputime_to_timespec64() and timespec64_to_cputime().
Changes since v2:
-Split the syscall conversion patch into small some patches.
*** BLURB HERE ***
Baolin Wang (22):
linux/time64.h:Introduce the 'struct itimerspec64' for 64bit
timekeeping:Introduce the current_kernel_time64() function with
timespec64 type
time/hrtimer:Introduce hrtimer_get_res64() with timespec64 type for
getting the timer resolution
posix-timers:Split out the guts of the syscall and change the
implementation for timer_gettime
posix-timers:Convert to the 64bit methods for the timer_gettime
syscall function
posix-timers:Split out the guts of the syscall and change the
implementation for timer_settime
posix-timers:Convert to the 64bit methods for the timer_settime
syscall function
posix-timers:Split out the guts of the syscall and change the
implementation for clock_settime
posix-timers:Convert to the 64bit methods for the clock_settime
syscall function
posix-timers:Split out the guts of the syscall and change the
implementation for clock_gettime
posix-timers:Convert to the 64bit methods for the clock_gettime
syscall function
posix-timers:Split out the guts of the syscall and change the
implementation for clock_getres
posix-timers:Convert to the 64bit methods for the clock_getres
syscall function
time:Introduce the do_sys_settimeofday64() function with timespec64
type
time/posix-timers:Convert to the 64bit methods for k_clock callback
functions
char/mmtimer:Convert to the 64bit methods for k_clock callback
function
time/alarmtimer:Convert to the new 64bit methods for k_clock
structure
time/posix-clock:Convert to the 64bit methods for k_clock and
posix_clock_operations structure
time/time:Introduce the timespec64_to_jiffies/jiffies_to_timespec64
function
cputime:Introduce the cputime_to_timespec64/timespec64_to_cputime
function
time/posix-cpu-timers:Convert to the 64bit methods for k_clock
structure
k_clock:Remove the 32bit methods with timespec/itimerspec type
arch/powerpc/include/asm/cputime.h | 6 +-
arch/s390/include/asm/cputime.h | 8 +-
drivers/char/mmtimer.c | 36 +++--
drivers/ptp/ptp_clock.c | 26 +---
include/asm-generic/cputime_jiffies.h | 10 +-
include/asm-generic/cputime_nsecs.h | 4 +-
include/linux/cputime.h | 15 ++
include/linux/hrtimer.h | 12 +-
include/linux/jiffies.h | 21 ++-
include/linux/posix-clock.h | 10 +-
include/linux/posix-timers.h | 18 +--
include/linux/time64.h | 35 +++++
include/linux/timekeeping.h | 26 +++-
kernel/time/alarmtimer.c | 43 +++---
kernel/time/hrtimer.c | 10 +-
kernel/time/posix-clock.c | 20 +--
kernel/time/posix-cpu-timers.c | 83 +++++-----
kernel/time/posix-timers.c | 269 ++++++++++++++++++++++-----------
kernel/time/time.c | 22 +--
kernel/time/timekeeping.c | 6 +-
kernel/time/timekeeping.h | 2 +-
21 files changed, 428 insertions(+), 254 deletions(-)
--
1.7.9.5
Apologies for the overly long patch series, I was hoping this
would have been simpler.
This is my first draft of how we could modify the system call interface
in Linux to support user space with 64-bit time_t in addition to the
existing 32-bit time_t based interfaces. For the time being, I'm mainly
interested in feedback about the general approach, to see if this is
a reasonable concept, or whether we should do this in a completely
different way.
The current submission is for a relatively small group of people and
only for the y2038 mailing list, and if we can agree on the approach,
I will post it to a wider group of people and mailing lists next.
The overall approach I have taken here is as follows:
* Since 64-bit architectures already support two versions of each system
call that passes a time value in order to run 32-bit user space,
I'm not adding new system calls for the most part, but instead make
32-bit architectures use the same compat handlers that 64-bit
architectures already use.
* The existing syscall numbers are modified to point to the compat_sys_*
functions, and new numbers are assigned to point to the existing handlers
that now deal with 64-bit time_t based structures
* This series does not touch any ioctl implementation, but should be
otherwise complete regarding the system calls. We are still trying
to find out exactly which ioctls are affected and have not come
up with a complete list at this point. It's probably a good idea
though to do at least the essential ioctls before merging the series,
so we can have a better understanding of how it will be done in the
end.
* Each data structure we need to modify gets a new definition with a
__kernel_ prefix, e.g. struct __kernel_timespec to replace struct
timespec. This keeps the new structures out of the user libc
namespace, but still allows the structure to be integrated into
other data structures, e.g. for ioctl.
* There is no #ifdef in the UAPI headers at this point that would
check for the kind of user space that is in use. Unfortunately,
I believe we will need to add that in order to do some of the
particularly tricky ioctls later.
* At first, all system call implementations are modified, but this
is done in a way that is not supposed to have any ABI-visible
effect on existing architectures.
* After all system calls are converted, we can change one architecture
at a time to select ARCH_HAS_COMPAT_TIME, and modify its system
call table accordingly. In this version, I do it for ARM32, x86-32,
and x86-64 for demonstration purposes.
* A follow-up series changes over all other architectures.
* The last patch in the series changes the CONFIG_COMPAT_TIME
Kconfig symbol to be user visible. Disabling this symbol will
get you a kernel that intentionally breaks support for old tasks
in order to provide an interface that will survive 2038.
This is meant mostly as a debugging help for now, to let people
build a y2038 safe distro, but at some point in the 2030s, we
should remove that option and all the compat handling.
Arnd Bergmann (37):
initramfs: use vfs_stat/lstat directly
y2038: introduce linux/compat_time.h header
y2038: introduce CONFIG_COMPAT_TIME
y2038: make linux/compat_time.h usable on 32-bit
y2038: compile compat time code even when CONFIG_COMPAT is not set
y2038: add compat_sys_rt_sigtimedwait variants
y2038: introduce struct __kernel_rusage
y2038: introduce struct __kernel_timespec
y2038: introduce struct __kernel_stat
y2038: use timespec64 for poll/select/recvmmsg
y2038: add compat_{get,put}_timespec64
y2038: use __kernel_timespec in sys_aio_getevents
y2038: factor out compat fd_set and sigset handling
y2038: add compat handling for sys_recvmmsg
y2038: add compat handling for sys_semtimedop
y2038: extend sysvipc data structures for 64-bit time_t
y2038: ipc: report long times to user space
y2038: introduce {get,put}_itimerspec
y2038: use __kernel_itimerspec in timerfd
y2038: introduce compat_sys_pselect6_time64
y2038: introduce compat_sys_ppoll_time64
y2038: use __kernel_timespec for sys_mq_timed{send,receive}
y2038: make compat_sys_mq_timed{send,receive} usable on 32-bit
y2038: use __kernel_timespec in sys_utimensat
y2038: introduce timespec64_to_jiffies
y2038: use __kernel_timespec in sys_rt_sigtimedwait
y2038: use __kernel_timespec in sys_futex
y2038: introduce jiffies_to_timespec64
y2038: use __kernel_timespec in sys_sched_rr_get_interval
y2038: move compat posix time handling to posix-timers.c
y2038: introduce struct __kernel_timex
y2038: convert all timex users to use __kernel_timex
y2038: convert posix clock syscalls
y2038: ignore new syscalls for now
ARM: use CONFIG_COMPAT_TIME
x86: use COMPAT_SYS_TIME
[NOT YET] y2038: make CONFIG_COMPAT_TIME optional
arch/Kconfig | 12 ++
arch/alpha/include/asm/Kbuild | 4 +
arch/alpha/include/uapi/asm/ipcbuf.h | 1 -
arch/alpha/include/uapi/asm/msgbuf.h | 27 ---
arch/alpha/include/uapi/asm/sembuf.h | 22 --
arch/alpha/include/uapi/asm/shmbuf.h | 38 ----
arch/alpha/include/uapi/asm/stat.h | 4 +
arch/alpha/kernel/osf_sys.c | 8 +-
arch/arm/Kconfig | 1 +
arch/arm/include/asm/unistd.h | 11 +-
arch/arm/include/uapi/asm/stat.h | 2 +
arch/arm/include/uapi/asm/unistd.h | 22 ++
arch/arm/kernel/calls.S | 101 ++++++----
arch/arm/kernel/sys_oabi-compat.c | 9 +-
arch/arm64/include/asm/compat.h | 43 ++--
arch/avr32/include/asm/Kbuild | 4 +
arch/avr32/include/uapi/asm/Kbuild | 1 -
arch/avr32/include/uapi/asm/msgbuf.h | 31 ---
arch/avr32/include/uapi/asm/sembuf.h | 25 ---
arch/avr32/include/uapi/asm/shmbuf.h | 42 ----
arch/avr32/include/uapi/asm/stat.h | 2 +
arch/blackfin/include/uapi/asm/stat.h | 2 +
arch/cris/include/asm/Kbuild | 6 +-
arch/cris/include/uapi/asm/ipcbuf.h | 1 -
arch/cris/include/uapi/asm/msgbuf.h | 33 ---
arch/cris/include/uapi/asm/sembuf.h | 25 ---
arch/cris/include/uapi/asm/shmbuf.h | 42 ----
arch/cris/include/uapi/asm/stat.h | 2 +
arch/frv/include/asm/Kbuild | 4 +
arch/frv/include/uapi/asm/ipcbuf.h | 1 -
arch/frv/include/uapi/asm/msgbuf.h | 32 ---
arch/frv/include/uapi/asm/sembuf.h | 26 ---
arch/frv/include/uapi/asm/shmbuf.h | 43 ----
arch/frv/include/uapi/asm/stat.h | 2 +
arch/ia64/include/asm/Kbuild | 4 +
arch/ia64/include/uapi/asm/ipcbuf.h | 1 -
arch/ia64/include/uapi/asm/msgbuf.h | 27 ---
arch/ia64/include/uapi/asm/sembuf.h | 22 --
arch/ia64/include/uapi/asm/shmbuf.h | 38 ----
arch/ia64/include/uapi/asm/stat.h | 4 +
arch/m32r/include/asm/Kbuild | 4 +
arch/m32r/include/uapi/asm/ipcbuf.h | 1 -
arch/m32r/include/uapi/asm/msgbuf.h | 31 ---
arch/m32r/include/uapi/asm/sembuf.h | 25 ---
arch/m32r/include/uapi/asm/shmbuf.h | 42 ----
arch/m32r/include/uapi/asm/stat.h | 1 +
arch/m68k/include/uapi/asm/stat.h | 2 +
arch/mips/include/asm/compat.h | 49 ++---
arch/mips/include/uapi/asm/msgbuf.h | 56 ++++--
arch/mips/include/uapi/asm/sembuf.h | 15 +-
arch/mips/include/uapi/asm/shmbuf.h | 23 ++-
arch/mips/include/uapi/asm/stat.h | 1 +
arch/mn10300/include/asm/Kbuild | 4 +
arch/mn10300/include/uapi/asm/ipcbuf.h | 1 -
arch/mn10300/include/uapi/asm/msgbuf.h | 31 ---
arch/mn10300/include/uapi/asm/sembuf.h | 25 ---
arch/mn10300/include/uapi/asm/shmbuf.h | 42 ----
arch/mn10300/include/uapi/asm/stat.h | 2 +
arch/parisc/include/asm/compat.h | 43 ++--
arch/parisc/include/uapi/asm/msgbuf.h | 32 +--
arch/parisc/include/uapi/asm/sembuf.h | 13 +-
arch/parisc/include/uapi/asm/shmbuf.h | 18 +-
arch/parisc/include/uapi/asm/stat.h | 1 +
arch/powerpc/include/asm/compat.h | 43 ++--
arch/powerpc/include/uapi/asm/msgbuf.h | 18 +-
arch/powerpc/include/uapi/asm/sembuf.h | 14 +-
arch/powerpc/include/uapi/asm/shmbuf.h | 18 +-
arch/powerpc/include/uapi/asm/stat.h | 25 +++
arch/s390/include/asm/Kbuild | 4 +-
arch/s390/include/asm/compat.h | 43 ++--
arch/s390/include/uapi/asm/msgbuf.h | 37 ----
arch/s390/include/uapi/asm/sembuf.h | 29 ---
arch/s390/include/uapi/asm/shmbuf.h | 48 -----
arch/s390/include/uapi/asm/stat.h | 24 +++
arch/s390/kernel/time.c | 2 +-
arch/sh/include/uapi/asm/stat.h | 2 +
arch/sparc/include/asm/compat.h | 43 ++--
arch/sparc/include/uapi/asm/msgbuf.h | 21 +-
arch/sparc/include/uapi/asm/sembuf.h | 15 +-
arch/sparc/include/uapi/asm/shmbuf.h | 20 +-
arch/sparc/include/uapi/asm/stat.h | 28 +++
arch/tile/include/asm/compat.h | 43 ++--
arch/x86/Kconfig | 1 +
arch/x86/include/asm/compat.h | 44 ++--
arch/x86/include/asm/ftrace.h | 2 +-
arch/x86/include/asm/sys_ia32.h | 2 +-
arch/x86/include/asm/unistd.h | 21 +-
arch/x86/include/uapi/asm/msgbuf.h | 41 +++-
arch/x86/include/uapi/asm/sembuf.h | 10 +
arch/x86/include/uapi/asm/shmbuf.h | 58 +++++-
arch/x86/include/uapi/asm/stat.h | 49 +++--
arch/x86/kernel/cpu/perf_event.c | 2 +-
arch/x86/syscalls/syscall_32.tbl | 98 +++++----
arch/xtensa/include/uapi/asm/msgbuf.h | 24 +--
arch/xtensa/include/uapi/asm/sembuf.h | 16 +-
arch/xtensa/include/uapi/asm/shmbuf.h | 36 +---
arch/xtensa/include/uapi/asm/stat.h | 2 +
drivers/ptp/ptp_clock.c | 2 +-
fs/Makefile | 1 +
fs/aio.c | 54 +++--
fs/compat.c | 198 +++++++++++-------
fs/eventpoll.c | 12 +-
fs/select.c | 64 +++---
fs/stat.c | 12 +-
fs/timerfd.c | 13 +-
fs/utimes.c | 19 +-
include/linux/audit.h | 4 +-
include/linux/compat.h | 261 +++---------------------
include/linux/compat_time.h | 298 +++++++++++++++++++++++++++
include/linux/hrtimer.h | 2 +-
include/linux/jiffies.h | 23 ++-
include/linux/msg.h | 7 +-
include/linux/poll.h | 10 +-
include/linux/posix-clock.h | 2 +-
include/linux/posix-timers.h | 11 +-
include/linux/resource.h | 8 +-
include/linux/sem.h | 3 +-
include/linux/shm.h | 7 +-
include/linux/signal.h | 3 +-
include/linux/socket.h | 4 +-
include/linux/stat.h | 3 +
include/linux/syscalls.h | 73 ++++---
include/linux/thread_info.h | 8 +-
include/linux/time.h | 11 +-
include/linux/time64.h | 25 ++-
include/linux/timex.h | 6 +-
include/net/compat.h | 3 +
include/uapi/asm-generic/kernel_stat.h | 36 ++++
include/uapi/asm-generic/msgbuf.h | 16 +-
include/uapi/asm-generic/sembuf.h | 26 ++-
include/uapi/asm-generic/shmbuf.h | 16 +-
include/uapi/asm-generic/stat.h | 12 +-
include/uapi/linux/net.h | 1 +
include/uapi/linux/resource.h | 32 +++
include/uapi/linux/time.h | 17 ++
include/uapi/linux/timex.h | 45 +++++
init/do_mounts.h | 22 +-
init/initramfs.c | 14 +-
ipc/compat.c | 18 +-
ipc/compat_mq.c | 28 ---
ipc/mqueue.c | 140 +++++++++----
ipc/msg.c | 23 ++-
ipc/sem.c | 92 ++++++---
ipc/shm.c | 21 +-
ipc/syscall.c | 9 +-
kernel/Makefile | 1 +
kernel/audit.h | 2 +-
kernel/auditsc.c | 14 +-
kernel/compat.c | 340 +++++++++++++------------------
kernel/exit.c | 6 +-
kernel/futex.c | 10 +-
kernel/sched/core.c | 35 +++-
kernel/signal.c | 13 +-
kernel/sys.c | 23 ++-
kernel/sys_ni.c | 38 ++++
kernel/time/alarmtimer.c | 13 +-
kernel/time/hrtimer.c | 20 +-
kernel/time/ntp.c | 16 +-
kernel/time/ntp_internal.h | 4 +-
kernel/time/posix-clock.c | 2 +-
kernel/time/posix-cpu-timers.c | 14 +-
kernel/time/posix-timers.c | 357 ++++++++++++++++++++++++++++-----
kernel/time/time.c | 63 ++++--
kernel/time/timekeeping.c | 2 +-
net/compat.c | 18 +-
net/socket.c | 52 ++++-
scripts/checksyscalls.sh | 25 +++
167 files changed, 2564 insertions(+), 2289 deletions(-)
delete mode 100644 arch/alpha/include/uapi/asm/ipcbuf.h
delete mode 100644 arch/alpha/include/uapi/asm/msgbuf.h
delete mode 100644 arch/alpha/include/uapi/asm/sembuf.h
delete mode 100644 arch/alpha/include/uapi/asm/shmbuf.h
delete mode 100644 arch/avr32/include/uapi/asm/msgbuf.h
delete mode 100644 arch/avr32/include/uapi/asm/sembuf.h
delete mode 100644 arch/avr32/include/uapi/asm/shmbuf.h
delete mode 100644 arch/cris/include/uapi/asm/ipcbuf.h
delete mode 100644 arch/cris/include/uapi/asm/msgbuf.h
delete mode 100644 arch/cris/include/uapi/asm/sembuf.h
delete mode 100644 arch/cris/include/uapi/asm/shmbuf.h
delete mode 100644 arch/frv/include/uapi/asm/ipcbuf.h
delete mode 100644 arch/frv/include/uapi/asm/msgbuf.h
delete mode 100644 arch/frv/include/uapi/asm/sembuf.h
delete mode 100644 arch/frv/include/uapi/asm/shmbuf.h
delete mode 100644 arch/ia64/include/uapi/asm/ipcbuf.h
delete mode 100644 arch/ia64/include/uapi/asm/msgbuf.h
delete mode 100644 arch/ia64/include/uapi/asm/sembuf.h
delete mode 100644 arch/ia64/include/uapi/asm/shmbuf.h
delete mode 100644 arch/m32r/include/uapi/asm/ipcbuf.h
delete mode 100644 arch/m32r/include/uapi/asm/msgbuf.h
delete mode 100644 arch/m32r/include/uapi/asm/sembuf.h
delete mode 100644 arch/m32r/include/uapi/asm/shmbuf.h
delete mode 100644 arch/mn10300/include/uapi/asm/ipcbuf.h
delete mode 100644 arch/mn10300/include/uapi/asm/msgbuf.h
delete mode 100644 arch/mn10300/include/uapi/asm/sembuf.h
delete mode 100644 arch/mn10300/include/uapi/asm/shmbuf.h
delete mode 100644 arch/s390/include/uapi/asm/msgbuf.h
delete mode 100644 arch/s390/include/uapi/asm/sembuf.h
delete mode 100644 arch/s390/include/uapi/asm/shmbuf.h
create mode 100644 include/linux/compat_time.h
create mode 100644 include/uapi/asm-generic/kernel_stat.h
--
2.1.0.rc2
This patch introduces hrtimer_get_res64() function to get the timer resolution
with timespec64 type, and moves the hrtimer_get_res() function into
include/linux/hrtimer.h as a 'static inline' helper that just calls hrtimer_get_res64.
It is ready for 2038 year when getting the timer resolution by hrtimer_get_res64() function
with timespec64 type, and it is convenient to delete the old hrtimer_get_res() function
in hrtimer.h file.
Signed-off-by: Baolin Wang <baolin.wang(a)linaro.org>
---
include/linux/hrtimer.h | 12 +++++++++++-
kernel/time/hrtimer.c | 10 +++++-----
2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
index 05f6df1..ee8ed44 100644
--- a/include/linux/hrtimer.h
+++ b/include/linux/hrtimer.h
@@ -383,7 +383,17 @@ static inline int hrtimer_restart(struct hrtimer *timer)
/* Query timers: */
extern ktime_t hrtimer_get_remaining(const struct hrtimer *timer);
-extern int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp);
+extern int hrtimer_get_res64(const clockid_t which_clock,
+ struct timespec64 *tp);
+
+static inline int hrtimer_get_res(const clockid_t which_clock,
+ struct timespec *tp)
+{
+ struct timespec64 *ts64;
+
+ *ts64 = timespec_to_timespec64(*tp);
+ return hrtimer_get_res64(which_clock, ts64);
+}
extern ktime_t hrtimer_get_next_event(void);
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index bee0c1f..508d936 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -1175,24 +1175,24 @@ void hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
EXPORT_SYMBOL_GPL(hrtimer_init);
/**
- * hrtimer_get_res - get the timer resolution for a clock
+ * hrtimer_get_res64 - get the timer resolution for a clock
* @which_clock: which clock to query
- * @tp: pointer to timespec variable to store the resolution
+ * @tp: pointer to timespec64 variable to store the resolution
*
* Store the resolution of the clock selected by @which_clock in the
* variable pointed to by @tp.
*/
-int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp)
+int hrtimer_get_res64(const clockid_t which_clock, struct timespec64 *tp)
{
struct hrtimer_cpu_base *cpu_base;
int base = hrtimer_clockid_to_base(which_clock);
cpu_base = raw_cpu_ptr(&hrtimer_bases);
- *tp = ktime_to_timespec(cpu_base->clock_base[base].resolution);
+ *tp = ktime_to_timespec64(cpu_base->clock_base[base].resolution);
return 0;
}
-EXPORT_SYMBOL_GPL(hrtimer_get_res);
+EXPORT_SYMBOL_GPL(hrtimer_get_res64);
static void __run_hrtimer(struct hrtimer *timer, ktime_t *now)
{
--
1.7.9.5
This patch adds current_kernel_time64() function with timespec64 type,
and makes current_kernel_time() 'static inline' and moves it to timekeeping.h
file.
It is convenient for user to get the current kernel time with timespec64 type,
and delete the current_kernel_time() function easily in timekeeping.h file. That
is ready for 2038 when get the current time.
Signed-off-by: Baolin Wang <baolin.wang(a)linaro.org>
---
include/linux/timekeeping.h | 10 +++++++++-
kernel/time/timekeeping.c | 6 +++---
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h
index 3eaae47..c6d5ae9 100644
--- a/include/linux/timekeeping.h
+++ b/include/linux/timekeeping.h
@@ -18,10 +18,18 @@ extern int do_sys_settimeofday(const struct timespec *tv,
* Kernel time accessors
*/
unsigned long get_seconds(void);
-struct timespec current_kernel_time(void);
+struct timespec64 current_kernel_time64(void);
/* does not take xtime_lock */
struct timespec __current_kernel_time(void);
+static inline struct timespec current_kernel_time(void)
+{
+ struct timespec64 now;
+
+ now = current_kernel_time64();
+ return timespec64_to_timespec(now);
+}
+
/*
* timespec based interfaces
*/
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 91db941..8ccc02c 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -1721,7 +1721,7 @@ struct timespec __current_kernel_time(void)
return timespec64_to_timespec(tk_xtime(tk));
}
-struct timespec current_kernel_time(void)
+struct timespec64 current_kernel_time64(void)
{
struct timekeeper *tk = &tk_core.timekeeper;
struct timespec64 now;
@@ -1733,9 +1733,9 @@ struct timespec current_kernel_time(void)
now = tk_xtime(tk);
} while (read_seqcount_retry(&tk_core.seq, seq));
- return timespec64_to_timespec(now);
+ return now;
}
-EXPORT_SYMBOL(current_kernel_time);
+EXPORT_SYMBOL(current_kernel_time64);
struct timespec64 get_monotonic_coarse64(void)
{
--
1.7.9.5
This patch series changes the 32-bit time type (timespec/itimerspec) to the 64-bit one
(timespec64/itimerspec64), since 32-bit time types will break in the year 2038.
This patch series introduces new methods with timespec64/itimerspec64 type,
and removes the old ones with timespec/itimerspec type for posix_clock_operations
and k_clock structure.
Also introduces some new functions with timespec64/itimerspec64 type, like current_kernel_time64(),
hrtimer_get_res64(), cputime_to_timespec64() and timespec64_to_cputime().
Changes since V1:
-Split some patch into small patch.
-Change the methods for converting the syscall and add some default function for new 64bit methods for syscall function.
-Introduce the new function do_sys_settimeofday64() and move do_sys_settimeofday() function to head file.
-Modify the EXPORT_SYMPOL issue.
-Add new 64bit methods in cputime_nsecs.h file.
-Modify some patch logs.
Baolin Wang (15):
linux/time64.h:Introduce the 'struct itimerspec64' for 64bit
timekeeping:Introduce the current_kernel_time64() function with
timespec64 type
time/hrtimer:Introduce hrtimer_get_res64() with timespec64 type for
getting the timer resolution
posix timers:Introduce the 64bit methods with timespec64 type for
k_clock structure
posix-timers:Split out the guts of the syscall and change the
implementation
posix-timers:Convert to the 64bit methods for the syscall function
time:Introduce the do_sys_settimeofday64() function with timespec64
type
time/posix-timers:Convert to the 64bit methods for k_clock callback
functions
char/mmtimer:Convert to the 64bit methods for k_clock callback
function
time/alarmtimer:Convert to the new methods for k_clock structure
time/posix-clock:Convert to the 64bit methods for k_clock and
posix_clock_operations structure
time/time:Introduce the timespec64_to_jiffies/jiffies_to_timespec64
function
cputime:Introduce the cputime_to_timespec64/timespec64_to_cputime
function
time/posix-cpu-timers:Convert to the 64bit methods for k_clock
structure
k_clock:Remove the 32bit methods with timespec/itimerspec type
arch/powerpc/include/asm/cputime.h | 6 +-
arch/s390/include/asm/cputime.h | 8 +-
drivers/char/mmtimer.c | 36 +++--
drivers/ptp/ptp_clock.c | 26 +---
include/asm-generic/cputime_jiffies.h | 10 +-
include/asm-generic/cputime_nsecs.h | 4 +-
include/linux/cputime.h | 15 ++
include/linux/hrtimer.h | 12 +-
include/linux/jiffies.h | 21 ++-
include/linux/posix-clock.h | 10 +-
include/linux/posix-timers.h | 18 +--
include/linux/time64.h | 35 +++++
include/linux/timekeeping.h | 26 +++-
kernel/time/alarmtimer.c | 43 +++---
kernel/time/hrtimer.c | 10 +-
kernel/time/posix-clock.c | 20 +--
kernel/time/posix-cpu-timers.c | 83 +++++-----
kernel/time/posix-timers.c | 269 ++++++++++++++++++++++-----------
kernel/time/time.c | 22 +--
kernel/time/timekeeping.c | 6 +-
kernel/time/timekeeping.h | 2 +-
21 files changed, 428 insertions(+), 254 deletions(-)
--
1.7.9.5
On 30 April 2015 at 00:31, Mark Brown <broonie(a)kernel.org> wrote:
> On Wed, Apr 29, 2015 at 06:04:58PM +0200, Arnd Bergmann wrote:
> > On Wednesday 29 April 2015 22:55:23 Baolin Wang wrote:
>
> > Last time, you actually had more people than necessary on Cc, and that
> can
> > end up in spam filters. If someone is a maintainer for just one or two
> patches
> > out of the series, it can be better to add an explicit 'Cc:
> person(a)example.org'
> > statement in those patches, and not Cc them for the whole series.
>
> But do include people on the cover letter or otherwise make sure they've
> got some idea what the series overall is all about (especially if
> there's interdependencies) to avoid confusions.
>
Ok, Thanks for your suggestions, and i'll send out the patch series asap.
--
Baolin.wang
Best Regards
This patch series changes the 32-bit time type (timespec/itimerspec) to the 64-bit one
(timespec64/itimerspec64), since 32-bit time types will break in the year 2038.
This patch series introduces new methods with timespec64/itimerspec64 type,
and removes the old ones with timespec/itimerspec type for posix_clock_operations
and k_clock structure.
Also introduces some new functions with timespec64/itimerspec64 type, like current_kernel_time64(),
hrtimer_get_res64(), cputime_to_timespec64() and timespec64_to_cputime().
Changes since V1:
-Split some patch into small patch.
-Add some default function for new 64bit methods for syscall function.
-Move do_sys_settimeofday() function to head file.
-Modify the EXPORT_SYMPOL issue.
-Add new 64bit methods in cputime_nsecs.h file.
Baolin Wang (15):
linux/time64.h:Introduce the 'struct itimerspec64' for 64bit
timekeeping:Introduce the current_kernel_time64() function with
timespec64 type
time/hrtimer:Introduce hrtimer_get_res64() with timespec64 type for
getting the timer resolution
posix timers:Introduce the 64bit methods with timespec64 type for
k_clock structure
posix-timers:Split out the guts of the syscall and change the
implementation
posix-timers:Convert to the 64bit methods for the syscall function
time:Introduce the do_sys_settimeofday64() function with timespec64
type
time/posix-timers:Convert to the 64bit methods for k_clock callback
functions
char/mmtimer:Convert to the 64bit methods for k_clock callback
function
time/alarmtimer:Convert to the new methods for k_clock structure
time/posix-clock:Convert to the 64bit methods for k_clock and
posix_clock_operations structure
time/time:Introduce the timespec64_to_jiffies/jiffies_to_timespec64
function
cputime:Introduce the cputime_to_timespec64/timespec64_to_cputime
function
time/posix-cpu-timers:Convert to the 64bit methods for k_clock
structure
k_clock:Remove the 32bit methods with timespec/itimerspec type
arch/powerpc/include/asm/cputime.h | 6 +-
arch/s390/include/asm/cputime.h | 8 +-
drivers/char/mmtimer.c | 36 +++--
drivers/ptp/ptp_clock.c | 26 +---
include/asm-generic/cputime_jiffies.h | 10 +-
include/asm-generic/cputime_nsecs.h | 4 +-
include/linux/cputime.h | 15 ++
include/linux/hrtimer.h | 12 +-
include/linux/jiffies.h | 21 ++-
include/linux/posix-clock.h | 10 +-
include/linux/posix-timers.h | 18 +--
include/linux/time64.h | 35 +++++
include/linux/timekeeping.h | 26 +++-
kernel/time/alarmtimer.c | 43 +++---
kernel/time/hrtimer.c | 10 +-
kernel/time/posix-clock.c | 20 +--
kernel/time/posix-cpu-timers.c | 83 +++++-----
kernel/time/posix-timers.c | 269 ++++++++++++++++++++++-----------
kernel/time/time.c | 22 +--
kernel/time/timekeeping.c | 6 +-
kernel/time/timekeeping.h | 2 +-
21 files changed, 428 insertions(+), 254 deletions(-)
--
1.7.9.5
This patch series changes the 32-bit time type (timespec/itimerspec) to the 64-bit one
(timespec64/itimerspec64), since 32-bit time types will break in the year 2038.
This patch series introduces new methods with timespec64/itimerspec64 type,
and removes the old ones with timespec/itimerspec type for posix_clock_operations
and k_clock structure.
Also introduces some new functions with timespec64/itimerspec64 type, like current_kernel_time64(),
hrtimer_get_res64(), cputime_to_timespec64() and timespec64_to_cputime().
Changes since V0:
-Split some patch into small patch.
-Modify some patch logs.
-Change the methods for converting the syscall function.
-Introduce the new function do_sys_settimeofday64().
Baolin Wang (14):
linux/time64.h:Introduce the 'struct itimerspec64' for 64bit
timekeeping:Introduce the current_kernel_time64() function with
timespec64 type
time/hrtimer:Introduce hrtimer_get_res64() with timespec64 type for
getting the timer resolution
posix timers:Introduce the 64bit methods with timespec64 type for
k_clock structure
posix-timers:Introduce the 64bit methods for posix-timer.c file
time:Introduce the do_sys_settimeofday64() function with timespec64
type
time/posix-timers:Convert to the 64bit methods for k_clock callback
functions
char/mmtimer:Convert to the 64bit methods for k_clock callback
function
time/alarmtimer:Convert to the new methods for k_clock structure
time/posix-clock:Convert to the 64bit methods for k_clock and
posix_clock_operations structure
time/time:Introduce the timespec64_to_jiffies/jiffies_to_timespec64
function
cputime:Introduce the cputime_to_timespec64/timespec64_to_cputime
function
time/posix-cpu-timers:Convert to the 64bit methods for k_clock
structure
k_clock:Remove the 32bit methods with timespec type
arch/powerpc/include/asm/cputime.h | 6 +-
arch/s390/include/asm/cputime.h | 8 +-
drivers/char/mmtimer.c | 36 +++--
drivers/ptp/ptp_clock.c | 26 +---
include/asm-generic/cputime_jiffies.h | 10 +-
include/linux/cputime.h | 15 ++
include/linux/hrtimer.h | 12 +-
include/linux/jiffies.h | 3 +
include/linux/posix-clock.h | 10 +-
include/linux/posix-timers.h | 18 +--
include/linux/time64.h | 25 +++
include/linux/timekeeping.h | 16 +-
kernel/time/alarmtimer.c | 43 +++---
kernel/time/hrtimer.c | 10 +-
kernel/time/posix-clock.c | 20 +--
kernel/time/posix-cpu-timers.c | 83 +++++-----
kernel/time/posix-timers.c | 269 ++++++++++++++++++++++-----------
kernel/time/time.c | 41 ++++-
kernel/time/timekeeping.c | 6 +-
kernel/time/timekeeping.h | 2 +-
20 files changed, 414 insertions(+), 245 deletions(-)
--
1.7.9.5
This patch series changes the 32-bit time type (timespec/itimerspec) to the 64-bit one
(timespec64/itimerspec64), since 32-bit time types will break in the year 2038.
This patch series introduces new methods with timespec64/itimerspec64 type,
and removes the old ones with timespec/itimerspec type for posix_clock_operations
and k_clock structure.
Also introduces some new functions with timespec64/itimerspec64 type, like current_kernel_time64(),
hrtimer_get_res64(), cputime_to_timespec64() and timespec64_to_cputime().
Baolin Wang (11):
linux/time64.h:Introduce the 'struct itimerspec64' for 64bit
timekeeping:Introduce the current_kernel_time64() function with
timespec64 type
time/hrtimer:Introduce hrtimer_get_res64() with timespec64 type for
getting the timer resolution
posix timers:Introduce the 64bit methods with timespec64 type for
k_clock structure
time/posix-timers:Convert to the 64bit methods for k_clock callback
functions
char/mmtimer:Convert to the 64bit methods for k_clock callback
function
time/alarmtimer:Convert to the new methods for k_clock structure
time/posix-clock:Convert to the 64bit methods for k_clock and
posix_clock_operations structure
cputime:Introduce the cputime_to_timespec64/timespec64_to_cputime
function
time/posix-cpu-timers:Convert to the 64bit methods for k_clock
structure
k_clock:Remove the 32bit methods with timespec type
arch/powerpc/include/asm/cputime.h | 6 +-
arch/s390/include/asm/cputime.h | 8 +-
drivers/char/mmtimer.c | 36 ++++----
drivers/ptp/ptp_clock.c | 26 ++----
include/asm-generic/cputime_jiffies.h | 10 +--
include/linux/cputime.h | 15 ++++
include/linux/hrtimer.h | 12 ++-
include/linux/jiffies.h | 3 +
include/linux/posix-clock.h | 10 +--
include/linux/posix-timers.h | 18 ++--
include/linux/time64.h | 13 +++
include/linux/timekeeping.h | 14 ++-
kernel/time/alarmtimer.c | 43 ++++-----
kernel/time/hrtimer.c | 10 +--
kernel/time/posix-clock.c | 20 ++---
kernel/time/posix-cpu-timers.c | 83 +++++++++--------
kernel/time/posix-timers.c | 157 +++++++++++++++++++--------------
kernel/time/time.c | 21 +++++
kernel/time/timekeeping.c | 6 +-
kernel/time/timekeeping.h | 2 +-
20 files changed, 302 insertions(+), 211 deletions(-)
--
1.7.9.5
This patch series change the 32-bit time type (timespec/itimerspec) to the 64-bit one
(timespec64/itimerspec64), since 32-bit time types will break in the year 2038.
This patch series introduce new methods with timespec64/itimerspec64 type,
and remove the old ones with timespec/itimerspec type for posix_clock_operations
and k_clock structure.
Changes since v4:
- Modify the conversion between the itimerspec64 and itimerspec for 64bit.
- Continue to split up and merge the patch.
- Explain more for the patch log.
- Re-order the patch of the patch series.
Next step will replace the other callback pointers of k_clock structure.
Baolin Wang (11):
linux/time64.h:Introduce the 'struct itimerspec64' for 64bit
timekeeping:Introduce the current_kernel_time64() function with
timespec64 type
time/hrtimer:Introduce hrtimer_get_res64() with timespec64 type for
getting the timer resolution
posix timers:Introduce the 64bit methods with timespec64 type for
k_clock structure
time/posix-timers:Convert to the 64bit methods for k_clock callback
functions
char/mmtimer:Convert to the 64bit methods for k_clock callback
function
time/alarmtimer:Convert to the new methods for k_clock structure
time/posix-clock:Convert to the 64bit methods for k_clock and
posix_clock_operations structure
cputime:Introduce the cputime_to_timespec64/timespec64_to_cputime
function
time/posix-cpu-timers:Convert to the 64bit methods for k_clock
structure
k_clock:Remove the 32bit methods with timespec type
arch/powerpc/include/asm/cputime.h | 24 +++++
arch/s390/include/asm/cputime.h | 26 ++++++
drivers/char/mmtimer.c | 36 ++++----
drivers/ptp/ptp_clock.c | 26 ++----
include/asm-generic/cputime_jiffies.h | 8 ++
include/linux/hrtimer.h | 12 ++-
include/linux/jiffies.h | 3 +
include/linux/posix-clock.h | 10 +--
include/linux/posix-timers.h | 18 ++--
include/linux/time64.h | 45 ++++++++++
include/linux/timekeeping.h | 14 ++-
kernel/time/alarmtimer.c | 43 ++++-----
kernel/time/hrtimer.c | 10 +--
kernel/time/posix-clock.c | 20 ++---
kernel/time/posix-cpu-timers.c | 83 +++++++++--------
kernel/time/posix-timers.c | 157 +++++++++++++++++++--------------
kernel/time/time.c | 21 +++++
kernel/time/timekeeping.c | 6 +-
kernel/time/timekeeping.h | 2 +-
19 files changed, 365 insertions(+), 199 deletions(-)
--
1.7.9.5
This patch series change the 32-bit time type (timespec/itimerspec) to the 64-bit one
(timespec64/itimerspec64), since 32-bit time types will break in the year 2038.
This patch series introduce new methods with timespec64/itimerspec64 type,
and remove the old ones with timespec/itimerspec type for posix clock operation
and k_clock structure.
Changes since v3:
- Introduce the new structure 'itimerspec64' for 64bit and the conversion function.
- Separate original one patch into two patches.
- Remove the 32bit unused code
- Re-order the patch of the patch series.
Next step will replace the other callback pointers of k_clock structure.
Baolin Wang (12):
linux/time64.h:Introduce the 'struct itimerspec64' for 64bit
posix_clock:Introduce the new methods with explicit 64 bit seconds
timekeeping:Introduce the current_kernel_time64() function with
timespec64 type
time/hrtimer:Introduce hrtimer_get_res64() with timespec64 type for
getting the timer resolution
posix timers:Introduce the 64bit methods with timespec64 type for
k_clock structure
time/posix-timers:Convert to the 64bit methods for k_clock callback
functions
char/mmtimer:Convert to the 64bit methods for k_clock callback
function
time/alarmtimer:Convert to the new methods for k_clock structure
time/posix-clock:Convert to the 64bit methods for k_clock structure
time:Introduce the cputime_to_timespec64/timespec64_to_cputime
function
time/posix-cpu-timers:Convert to the 64bit methods for k_clock
structure
k_clock:Remove the 32bit methods with timespec type
arch/powerpc/include/asm/cputime.h | 24 +++++
arch/s390/include/asm/cputime.h | 26 ++++++
drivers/char/mmtimer.c | 38 ++++----
drivers/ptp/ptp_clock.c | 26 ++----
include/asm-generic/cputime_jiffies.h | 8 ++
include/linux/hrtimer.h | 12 ++-
include/linux/jiffies.h | 3 +
include/linux/posix-clock.h | 10 +--
include/linux/posix-timers.h | 18 ++--
include/linux/time64.h | 37 ++++++++
include/linux/timekeeping.h | 14 ++-
kernel/time/alarmtimer.c | 43 ++++-----
kernel/time/hrtimer.c | 10 +--
kernel/time/posix-clock.c | 21 ++---
kernel/time/posix-cpu-timers.c | 83 +++++++++--------
kernel/time/posix-timers.c | 159 +++++++++++++++++++--------------
kernel/time/time.c | 21 +++++
kernel/time/timekeeping.c | 6 +-
kernel/time/timekeeping.h | 2 +-
19 files changed, 361 insertions(+), 200 deletions(-)
--
1.7.9.5
On Wednesday 15 April 2015 17:41:28 Miroslav Lichvar wrote:
> On systems with 32-bit time_t, it seems there are quite a few problems
> that applications may have with time overflowing in year 2038. Beside
> getting in an unexpected state by not checking integer operations with
> time_t variables, some system calls have unexpected behavior, e.g. the
> system time can't be set back to the current time (negative value),
> timers with the ABSTIME flag can't be set (negative value) or they
> expire immediately (current time is always larger).
>
> It would be unrealistic to expect all applications to be able to handle
> all these problems. Year 2038 is still many years away, but this can be
> a problem even now. The clock can be set close to the overflow
> accidentally or maliciously, e.g. when the clock is synchronized over
> network by NTP or PTP.
>
> This patch sets a maximum value of the system time to prevent the system
> time from getting too close to the overflow. The time can't be set to a
> larger value. When the maximum is reached in normal time accumulation,
> the clock will be stepped back by one week.
>
> A new kernel sysctl time_max is added to select the maximum time. It can
> be set to 0 for no limit, 1 for one week before 32-bit time_t overflow,
> and 2 for one week before ktime_t overflow. The default value is 1 with
> 32-bit time_t and 2 with 64-bit time_t. This can be changed later to be
> always 2 when 64-bit versions of system calls using 32-bit time_t are
> available.
>
> Signed-off-by: Miroslav Lichvar <mlichvar(a)redhat.com>
I have just created a y2038(a)lists.linaro.org mailing list, added to Cc in
this reply.
The patch looks basically ok to me, though I have no opinion on whether
a sysctl is the best API for configuring this.
Arnd
> ---
> Documentation/sysctl/kernel.txt | 19 +++++++++++++
> include/linux/timekeeping.h | 5 ++++
> include/uapi/linux/sysctl.h | 1 +
> kernel/sysctl.c | 9 ++++++
> kernel/sysctl_binary.c | 1 +
> kernel/time/timekeeping.c | 62 +++++++++++++++++++++++++++++++++++++----
> 6 files changed, 91 insertions(+), 6 deletions(-)
>
> diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
> index 83ab256..08e4f28 100644
> --- a/Documentation/sysctl/kernel.txt
> +++ b/Documentation/sysctl/kernel.txt
> @@ -82,6 +82,7 @@ show up in /proc/sys/kernel:
> - sysctl_writes_strict
> - tainted
> - threads-max
> +- time_max
> - unknown_nmi_panic
> - watchdog_thresh
> - version
> @@ -847,6 +848,24 @@ can be ORed together:
>
> ==============================================================
>
> +time_max:
> +
> +Select the maximum allowed value of the system time. The system clock cannot be
> +set to a larger value and when it reaches the maximum on its own, it will be
> +stepped back by one week.
> +
> +0: No limit.
> +
> +1: One week before 32-bit time_t overflows, i.e. Jan 12 03:14:07 UTC 2038.
> + This is currently the default value with 32-bit time_t, but it will likely
> + change when 64-bit versions of system calls using time_t are available.
> +
> +2: One week before time in the internal kernel representation (ktime_t)
> + overflows, i.e. Apr 4 23:47:16 UTC 2262. This is the default value with
> + 64-bit time_t.
> +
> +==============================================================
> +
> unknown_nmi_panic:
>
> The value in this file affects behavior of handling NMI. When the
> diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h
> index 99176af..51fc970 100644
> --- a/include/linux/timekeeping.h
> +++ b/include/linux/timekeeping.h
> @@ -5,6 +5,11 @@
>
> void timekeeping_init(void);
> extern int timekeeping_suspended;
> +extern int sysctl_time_max;
> +
> +struct ctl_table;
> +extern int sysctl_time_max_handler(struct ctl_table *table, int write,
> + void __user *buffer, size_t *length, loff_t *ppos);
>
> /*
> * Get and set timeofday
> diff --git a/include/uapi/linux/sysctl.h b/include/uapi/linux/sysctl.h
> index 0956373..8fd2aab 100644
> --- a/include/uapi/linux/sysctl.h
> +++ b/include/uapi/linux/sysctl.h
> @@ -154,6 +154,7 @@ enum
> KERN_NMI_WATCHDOG=75, /* int: enable/disable nmi watchdog */
> KERN_PANIC_ON_NMI=76, /* int: whether we will panic on an unrecovered */
> KERN_PANIC_ON_WARN=77, /* int: call panic() in WARN() functions */
> + KERN_TIMEMAX=78, /* int: select maximum allowed system time */
> };
>
>
> diff --git a/kernel/sysctl.c b/kernel/sysctl.c
> index ce410bb..6713a5b 100644
> --- a/kernel/sysctl.c
> +++ b/kernel/sysctl.c
> @@ -1120,6 +1120,15 @@ static struct ctl_table kern_table[] = {
> .extra1 = &zero,
> .extra2 = &one,
> },
> + {
> + .procname = "time_max",
> + .data = &sysctl_time_max,
> + .maxlen = sizeof(int),
> + .mode = 0644,
> + .proc_handler = sysctl_time_max_handler,
> + .extra1 = &zero,
> + .extra2 = &two,
> + },
> { }
> };
>
> diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
> index 7e7746a..66c0946 100644
> --- a/kernel/sysctl_binary.c
> +++ b/kernel/sysctl_binary.c
> @@ -138,6 +138,7 @@ static const struct bin_table bin_kern_table[] = {
> { CTL_INT, KERN_MAX_LOCK_DEPTH, "max_lock_depth" },
> { CTL_INT, KERN_PANIC_ON_NMI, "panic_on_unrecovered_nmi" },
> { CTL_INT, KERN_PANIC_ON_WARN, "panic_on_warn" },
> + { CTL_INT, KERN_TIMEMAX, "time_max" },
> {}
> };
>
> diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
> index 946acb7..112932f 100644
> --- a/kernel/time/timekeeping.c
> +++ b/kernel/time/timekeeping.c
> @@ -32,6 +32,9 @@
> #define TK_MIRROR (1 << 1)
> #define TK_CLOCK_WAS_SET (1 << 2)
>
> +#define SEC_PER_DAY (24 * 3600)
> +#define SEC_PER_WEEK (7 * SEC_PER_DAY)
> +
> /*
> * The most important data for readout fits into a single 64 byte
> * cache line.
> @@ -884,6 +887,37 @@ EXPORT_SYMBOL(getnstime_raw_and_real);
>
> #endif /* CONFIG_NTP_PPS */
>
> +/* Maximum allowed system time as a sysctl setting and in seconds */
> +int sysctl_time_max __read_mostly;
> +static u64 time_max_sec __read_mostly;
> +
> +static void update_time_max_sec(int tm)
> +{
> + if (tm > 1) {
> + /* One week before ktime_t overflow */
> + time_max_sec = KTIME_SEC_MAX - SEC_PER_WEEK;
> + } else if (tm == 1) {
> + /* One week before 32-bit time_t overflow */
> + time_max_sec = 0x7fffffff - SEC_PER_WEEK;
> + } else {
> + /* No limit */
> + time_max_sec = -1;
> + }
> +}
> +
> +int sysctl_time_max_handler(struct ctl_table *table, int write,
> + void __user *buffer, size_t *length, loff_t *ppos)
> +{
> + int rc;
> +
> + rc = proc_dointvec_minmax(table, write, buffer, length, ppos);
> + if (rc)
> + return rc;
> +
> + update_time_max_sec(sysctl_time_max);
> + return 0;
> +}
> +
> /**
> * do_gettimeofday - Returns the time of day in a timeval
> * @tv: pointer to the timeval to be set
> @@ -912,7 +946,7 @@ int do_settimeofday64(const struct timespec64 *ts)
> struct timespec64 ts_delta, xt;
> unsigned long flags;
>
> - if (!timespec64_valid_strict(ts))
> + if (!timespec64_valid_strict(ts) || ts->tv_sec >= time_max_sec)
> return -EINVAL;
>
> raw_spin_lock_irqsave(&timekeeper_lock, flags);
> @@ -965,7 +999,7 @@ int timekeeping_inject_offset(struct timespec *ts)
>
> /* Make sure the proposed value is valid */
> tmp = timespec64_add(tk_xtime(tk), ts64);
> - if (!timespec64_valid_strict(&tmp)) {
> + if (!timespec64_valid_strict(&tmp) || tmp.tv_sec >= time_max_sec) {
> ret = -EINVAL;
> goto error;
> }
> @@ -1238,6 +1272,10 @@ void __init timekeeping_init(void)
> write_seqcount_begin(&tk_core.seq);
> ntp_init();
>
> + /* For now, prevent 32-bit time_t overflow by default */
> + sysctl_time_max = sizeof(time_t) > 4 ? 2 : 1;
> + update_time_max_sec(sysctl_time_max);
> +
> clock = clocksource_default_clock();
> if (clock->enable)
> clock->enable(clock);
> @@ -1687,23 +1725,35 @@ static inline unsigned int accumulate_nsecs_to_secs(struct timekeeper *tk)
>
> while (tk->tkr_mono.xtime_nsec >= nsecps) {
> int leap;
> + s64 step;
>
> tk->tkr_mono.xtime_nsec -= nsecps;
> tk->xtime_sec++;
>
> /* Figure out if its a leap sec and apply if needed */
> leap = second_overflow(tk->xtime_sec);
> - if (unlikely(leap)) {
> + step = leap;
> +
> + /* If the system time reached the maximum, step it back */
> + if (unlikely(tk->xtime_sec >= time_max_sec)) {
> + step = time_max_sec - tk->xtime_sec - SEC_PER_WEEK;
> + printk(KERN_NOTICE
> + "Clock: maximum time reached, stepping back\n");
> + }
> +
> + if (unlikely(step)) {
> struct timespec64 ts;
>
> - tk->xtime_sec += leap;
> + tk->xtime_sec += step;
>
> - ts.tv_sec = leap;
> + ts.tv_sec = step;
> ts.tv_nsec = 0;
> tk_set_wall_to_mono(tk,
> timespec64_sub(tk->wall_to_monotonic, ts));
>
> - __timekeeping_set_tai_offset(tk, tk->tai_offset - leap);
> + if (leap)
> + __timekeeping_set_tai_offset(tk,
> + tk->tai_offset - leap);
>
> clock_set = TK_CLOCK_WAS_SET;
> }
>
Hi,
I've created a new mailing list on the Linaro mailing list server for
discussing the kernel patches for y2038:
https://lists.linaro.org/mailman/listinfo/y2038
Please join if you are interested in discussing these or want to send
patches. The intention at the moment much to keep this list explicitly
open to newbies, so we will get a lot of incorrect patches there along
with other patches. Patches can get sent here for an initial review
before they get sent to the real maintainers, or you can put the list
on Cc when sending a patch that should be applied and you already know
what you are doing.
We already got a lot of patches last year through the Outreachy
(then known as OPW) application process, and John and I also use
this work as part of our Linaro job to train new kernel developers.
There also a wiki page at http://kernelnewbies.org/y2038 to describe
what we are doing, and anybody who wants to help out here is
welcome to contribute patches on this list.
Arnd
On Saturday 11 April 2015 18:46:54 Baolin Wang wrote:
> This patch introduces the cputime_to_timespec64() function and
> jiffies_to_timespec64() function for converting the jiffies
> value to timespec64 value.
>
> Signed-off-by: Baolin Wang <baolin.wang(a)linaro.org>
> ---
> include/asm-generic/cputime_jiffies.h | 6 ++++++
> include/linux/jiffies.h | 2 ++
> kernel/time/time.c | 14 ++++++++++++++
> 3 files changed, 22 insertions(+)
>
> diff --git a/include/asm-generic/cputime_jiffies.h b/include/asm-generic/cputime_jiffies.h
> index fe386fc..c0c4fcb 100644
> --- a/include/asm-generic/cputime_jiffies.h
> +++ b/include/asm-generic/cputime_jiffies.h
> @@ -52,6 +52,12 @@ typedef u64 __nocast cputime64_t;
> jiffies_to_timespec(cputime_to_jiffies(__ct),__val)
>
> /*
> + * Convert cputime to timespec64.
> + */
> +#define cputime_to_timespec64(__ct,__val) \
> + jiffies_to_timespec64(cputime_to_jiffies(__ct),__val)
> +
> +/*
> * Convert cputime to timeval and back.
You missed an important piece here: cputime_to_timespec64 is architecture
specific, and arch/s390 as well as arch/powerpc have their own implementations,
so you have to introduce all three cputime_to_timespec64 implementations
before using it.
Arnd
On Saturday 11 April 2015 18:46:50 Baolin Wang wrote:
> This patch introduces the new methods with timespec64 type for k_clcok structure,
> converts the timepsec type to timespec64 type in k_clock structure and implements
> some callback function.
>
> This patch also converts the timespec type to timespec64 type for timekeeping_clocktai
> function which is used only in the posix-timers.c file.
>
> Next step will migrate all the k_clock users to use the new methods with timespec64 type,
> and it contains the files of mmtimer.c, alarmtimer.c, posix-clock.c and
> posix-cpu-timers.c.
>
> Signed-off-by: Baolin Wang <baolin.wang(a)linaro.org>
The changes in this patch all look good, but as I mentioned, I would
separate the two things you do here:
> struct k_clock {
> int (*clock_getres) (const clockid_t which_clock, struct timespec *tp);
> + int (*clock_getres64) (const clockid_t which_clock,
> + struct timespec64 *tp);
> int (*clock_set) (const clockid_t which_clock,
> const struct timespec *tp);
> + int (*clock_set64) (const clockid_t which_clock,
> + const struct timespec64 *tp);
> int (*clock_get) (const clockid_t which_clock, struct timespec * tp);
> + int (*clock_get64) (const clockid_t which_clock, struct timespec64 *tp);
> int (*clock_adj) (const clockid_t which_clock, struct timex *tx);
> int (*timer_create) (struct k_itimer *timer);
> int (*nsleep) (const clockid_t which_clock, int flags,
a) introducing and using the function pointers
> @@ -278,9 +284,9 @@ static int posix_get_tai(clockid_t which_clock, struct timespec *tp)
> static __init int init_posix_timers(void)
> {
> struct k_clock clock_realtime = {
> - .clock_getres = hrtimer_get_res,
> - .clock_get = posix_clock_realtime_get,
> - .clock_set = posix_clock_realtime_set,
> + .clock_getres64 = hrtimer_get_res64,
> + .clock_get64 = posix_clock_realtime_get,
> + .clock_set64 = posix_clock_realtime_set,
> .clock_adj = posix_clock_realtime_adj,
> .nsleep = common_nsleep,
and b) converting some of the k_clock definitions.
Arnd
On Saturday 11 April 2015 18:46:49 Baolin Wang wrote:
> This patch introduces hrtimer_get_res64() function to get the timer resolution
> with timespec64 type, and moves the hrtimer_get_res() function into
> include/linux/hrtimer.h as a 'static inline' helper that just calls hrtimer_get_res64.
>
> Signed-off-by: Baolin Wang <baolin.wang(a)linaro.org>
>
Looks good.
Arnd