Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 5 Jun 2018 03:27:54 +0000 (20:27 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 5 Jun 2018 03:27:54 +0000 (20:27 -0700)
Pull timers and timekeeping updates from Thomas Gleixner:

 - Core infrastucture work for Y2038 to address the COMPAT interfaces:

     + Add a new Y2038 safe __kernel_timespec and use it in the core
       code

     + Introduce config switches which allow to control the various
       compat mechanisms

     + Use the new config switch in the posix timer code to control the
       32bit compat syscall implementation.

 - Prevent bogus selection of CPU local clocksources which causes an
   endless reselection loop

 - Remove the extra kthread in the clocksource code which has no value
   and just adds another level of indirection

 - The usual bunch of trivial updates, cleanups and fixlets all over the
   place

 - More SPDX conversions

* 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (24 commits)
  clocksource/drivers/mxs_timer: Switch to SPDX identifier
  clocksource/drivers/timer-imx-tpm: Switch to SPDX identifier
  clocksource/drivers/timer-imx-gpt: Switch to SPDX identifier
  clocksource/drivers/timer-imx-gpt: Remove outdated file path
  clocksource/drivers/arc_timer: Add comments about locking while read GFRC
  clocksource/drivers/mips-gic-timer: Add pr_fmt and reword pr_* messages
  clocksource/drivers/sprd: Fix Kconfig dependency
  clocksource: Move inline keyword to the beginning of function declarations
  timer_list: Remove unused function pointer typedef
  timers: Adjust a kernel-doc comment
  tick: Prefer a lower rating device only if it's CPU local device
  clocksource: Remove kthread
  time: Change nanosleep to safe __kernel_* types
  time: Change types to new y2038 safe __kernel_* types
  time: Fix get_timespec64() for y2038 safe compat interfaces
  time: Add new y2038 safe __kernel_timespec
  posix-timers: Make compat syscalls depend on CONFIG_COMPAT_32BIT_TIME
  time: Introduce CONFIG_COMPAT_32BIT_TIME
  time: Introduce CONFIG_64BIT_TIME in architectures
  compat: Enable compat_get/put_timespec64 always
  ...

67 files changed:
arch/Kconfig
arch/alpha/include/asm/Kbuild
arch/arc/include/asm/Kbuild
arch/arm/include/asm/Kbuild
arch/arm64/include/asm/compat.h
arch/arm64/include/asm/stat.h
arch/arm64/kernel/hw_breakpoint.c
arch/arm64/kernel/perf_regs.c
arch/c6x/include/asm/Kbuild
arch/h8300/include/asm/Kbuild
arch/hexagon/include/asm/Kbuild
arch/ia64/include/asm/Kbuild
arch/m68k/include/asm/Kbuild
arch/microblaze/include/asm/Kbuild
arch/mips/include/asm/compat.h
arch/mips/kernel/signal32.c
arch/nds32/include/asm/Kbuild
arch/nios2/include/asm/Kbuild
arch/openrisc/include/asm/Kbuild
arch/parisc/include/asm/compat.h
arch/powerpc/include/asm/compat.h
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/oprofile/backtrace.c
arch/s390/hypfs/hypfs_sprp.c
arch/s390/include/asm/compat.h
arch/s390/include/asm/elf.h
arch/s390/kvm/priv.c
arch/s390/pci/pci_clp.c
arch/sh/include/asm/Kbuild
arch/sparc/include/asm/compat.h
arch/um/include/asm/Kbuild
arch/unicore32/include/asm/Kbuild
arch/x86/events/core.c
arch/x86/include/asm/compat.h
arch/x86/include/asm/ftrace.h
arch/x86/kernel/sys_x86_64.c
arch/xtensa/include/asm/Kbuild
drivers/clocksource/Kconfig
drivers/clocksource/arc_timer.c
drivers/clocksource/mips-gic-timer.c
drivers/clocksource/mxs_timer.c
drivers/clocksource/timer-imx-gpt.c
drivers/clocksource/timer-imx-tpm.c
drivers/s390/block/dasd_ioctl.c
drivers/s390/char/fs3270.c
drivers/s390/char/sclp_ctl.c
drivers/s390/char/vmcp.c
drivers/s390/cio/chsc_sch.c
drivers/s390/net/qeth_core_main.c
include/asm-generic/compat.h [new file with mode: 0644]
include/linux/compat.h
include/linux/compat_time.h [new file with mode: 0644]
include/linux/restart_block.h
include/linux/syscalls.h
include/linux/time.h
include/linux/time64.h
include/uapi/asm-generic/posix_types.h
include/uapi/linux/time.h
kernel/compat.c
kernel/time/clocksource.c
kernel/time/hrtimer.c
kernel/time/posix-stubs.c
kernel/time/posix-timers.c
kernel/time/tick-common.c
kernel/time/time.c
kernel/time/timer.c
kernel/time/timer_list.c

index b624634daea65c2dc58429455d623b7068ff6e33..b695a3e3e92216fae9b7165093240622cee10819 100644 (file)
@@ -871,6 +871,21 @@ config OLD_SIGACTION
 config COMPAT_OLD_SIGACTION
        bool
 
+config 64BIT_TIME
+       def_bool ARCH_HAS_64BIT_TIME
+       help
+         This should be selected by all architectures that need to support
+         new system calls with a 64-bit time_t. This is relevant on all 32-bit
+         architectures, and 64-bit architectures as part of compat syscall
+         handling.
+
+config COMPAT_32BIT_TIME
+       def_bool (!64BIT && 64BIT_TIME) || COMPAT
+       help
+         This enables 32 bit time_t support in addition to 64 bit time_t support.
+         This is relevant on all 32-bit architectures, and 64-bit architectures
+         as part of compat syscall handling.
+
 config ARCH_NO_COHERENT_DMA_MMAP
        bool
 
index 9b68790013e2fe8840f9a13b32ef497664e7d0e5..0580cb8c84b2a0390873f803cc2d1101aa622678 100644 (file)
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 
 
+generic-y += compat.h
 generic-y += exec.h
 generic-y += export.h
 generic-y += fb.h
index bbdcb955e18f063aff11c7c305df3abea66e3c30..feed50ce89fadfc1291080dffb16b969370553d8 100644 (file)
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 generic-y += bugs.h
+generic-y += compat.h
 generic-y += device.h
 generic-y += div64.h
 generic-y += dma-mapping.h
index 873e3c18927960324ef9426c0a34d64b2dcd7ff3..1d66db9c9db532f3c23b2ace02a18fbce7e66da5 100644 (file)
@@ -1,3 +1,4 @@
+generic-y += compat.h
 generic-y += current.h
 generic-y += early_ioremap.h
 generic-y += emergency-restart.h
index c00c62e1a4a3e03d5d0f8c3d0145ad7fb14309b3..0030f79808b32c7a722dc4ca74ea577604fbf631 100644 (file)
@@ -34,7 +34,6 @@
 
 typedef u32            compat_size_t;
 typedef s32            compat_ssize_t;
-typedef s32            compat_time_t;
 typedef s32            compat_clock_t;
 typedef s32            compat_pid_t;
 typedef u16            __compat_uid_t;
@@ -66,16 +65,6 @@ typedef u32          compat_ulong_t;
 typedef u64            compat_u64;
 typedef u32            compat_uptr_t;
 
-struct compat_timespec {
-       compat_time_t   tv_sec;
-       s32             tv_nsec;
-};
-
-struct compat_timeval {
-       compat_time_t   tv_sec;
-       s32             tv_usec;
-};
-
 struct compat_stat {
 #ifdef __AARCH64EB__
        short           st_dev;
index 15e35598ac407a99fb7d48770f00b298ee52ea0e..eab7380197071b87692ddbea7f560510ef5cf4e3 100644 (file)
@@ -20,6 +20,7 @@
 
 #ifdef CONFIG_COMPAT
 
+#include <linux/compat_time.h>
 #include <asm/compat.h>
 
 /*
index 74bb56f656eff024839df19897ba06512128e9bb..413dbe530da836d3dc1119830628454168921064 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/smp.h>
 #include <linux/uaccess.h>
 
-#include <asm/compat.h>
 #include <asm/current.h>
 #include <asm/debug-monitors.h>
 #include <asm/hw_breakpoint.h>
index 1d091d048d046cc6a5fc66debbba8e21c2c873a6..0bbac612146eabecdc1c78a4aa12f602bf8f9ccb 100644 (file)
@@ -1,11 +1,11 @@
 // SPDX-License-Identifier: GPL-2.0
+#include <linux/compat.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/perf_event.h>
 #include <linux/bug.h>
 #include <linux/sched/task_stack.h>
 
-#include <asm/compat.h>
 #include <asm/perf_regs.h>
 #include <asm/ptrace.h>
 
index 434600e47662968a36b69768ffc041821ba4f053..33a2c94fed0dec731da4ee2a182b2acba6dd8d37 100644 (file)
@@ -1,6 +1,7 @@
 generic-y += atomic.h
 generic-y += barrier.h
 generic-y += bugs.h
+generic-y += compat.h
 generic-y += current.h
 generic-y += device.h
 generic-y += div64.h
index 14bac06b71169327e00e6f8b73ef7278ecda7cf1..a5d0b2991f474bac3460ab59f7a2cfc655d95bd2 100644 (file)
@@ -3,6 +3,7 @@ generic-y += barrier.h
 generic-y += bugs.h
 generic-y += cacheflush.h
 generic-y += checksum.h
+generic-y += compat.h
 generic-y += current.h
 generic-y += delay.h
 generic-y += device.h
index e9743f689fb8b7d0d532bf9895b0f63008a9af74..dd2fd9c0d292b3c3bcf13a4007c5824e420d08ff 100644 (file)
@@ -2,6 +2,7 @@
 generic-y += barrier.h
 generic-y += bug.h
 generic-y += bugs.h
+generic-y += compat.h
 generic-y += current.h
 generic-y += device.h
 generic-y += div64.h
index 6dd867873364a9808980e79d0c148a91a17871a6..557bbc8ba9f5ef34e9d368be4d20e6fb5b2f11d0 100644 (file)
@@ -1,3 +1,4 @@
+generic-y += compat.h
 generic-y += exec.h
 generic-y += irq_work.h
 generic-y += mcs_spinlock.h
index 88a9d27df1ace2348aaa9aba3384e87601cfd2c3..4d8d68c4e3ddd5193c9826680b60a3b009c7aa91 100644 (file)
@@ -1,4 +1,5 @@
 generic-y += barrier.h
+generic-y += compat.h
 generic-y += device.h
 generic-y += emergency-restart.h
 generic-y += exec.h
index 3c80a5a308ed1ef5b9a03e665dafb86ab6447a88..fe6a6c6e5003c30624ab37d63b2b29d3cab2de82 100644 (file)
@@ -2,6 +2,7 @@ generic-y += barrier.h
 generic-y += bitops.h
 generic-y += bug.h
 generic-y += bugs.h
+generic-y += compat.h
 generic-y += device.h
 generic-y += div64.h
 generic-y += emergency-restart.h
index 9a0fa66b81aca6c47dab0189cbba57b7c413a952..3e548ee99a2f4ade32a38f13ef3ca87b78be2b94 100644 (file)
@@ -14,7 +14,6 @@
 
 typedef u32            compat_size_t;
 typedef s32            compat_ssize_t;
-typedef s32            compat_time_t;
 typedef s32            compat_clock_t;
 typedef s32            compat_suseconds_t;
 
@@ -46,16 +45,6 @@ typedef u32          compat_ulong_t;
 typedef u64            compat_u64;
 typedef u32            compat_uptr_t;
 
-struct compat_timespec {
-       compat_time_t   tv_sec;
-       s32             tv_nsec;
-};
-
-struct compat_timeval {
-       compat_time_t   tv_sec;
-       s32             tv_usec;
-};
-
 struct compat_stat {
        compat_dev_t    st_dev;
        s32             st_pad1[3];
index c4db910a8794df541ec4c2f5b8ed1763340cf71a..b5d9e1784aff35ef0724a96e2784d11eb9e15057 100644 (file)
@@ -8,13 +8,13 @@
  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  * Copyright (C) 2016, Imagination Technologies Ltd.
  */
+#include <linux/compat.h>
 #include <linux/compiler.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/signal.h>
 #include <linux/syscalls.h>
 
-#include <asm/compat.h>
 #include <asm/compat-signal.h>
 #include <linux/uaccess.h>
 #include <asm/unistd.h>
index 6f5cc29ed07f5056b3654771c4f417f327bbc112..dbc4e5422550dfcea4134e00bc810e0c175e26cd 100644 (file)
@@ -9,6 +9,7 @@ generic-y += checksum.h
 generic-y += clkdev.h
 generic-y += cmpxchg.h
 generic-y += cmpxchg-local.h
+generic-y += compat.h
 generic-y += cputime.h
 generic-y += device.h
 generic-y += div64.h
index d232da2cbb3872b5cce30bdf6c31e6492a5ae41e..64ed3d6569562b6aa508fef90c193ca5a621de88 100644 (file)
@@ -4,6 +4,7 @@ generic-y += bitops.h
 generic-y += bug.h
 generic-y += bugs.h
 generic-y += cmpxchg.h
+generic-y += compat.h
 generic-y += current.h
 generic-y += device.h
 generic-y += div64.h
index f05c722a21f813deff9d2e75447b2cbff07b5bcd..65964d390b10c79ba12805005b90ef311b925d18 100644 (file)
@@ -2,6 +2,7 @@ generic-y += barrier.h
 generic-y += bug.h
 generic-y += bugs.h
 generic-y += checksum.h
+generic-y += compat.h
 generic-y += current.h
 generic-y += device.h
 generic-y += div64.h
index 57b8b2a2fd4e0b0bb6fe6e5ea2279e525e986e78..0cdfec8857bd9144678e3c1af537c8a1b82ad3f3 100644 (file)
@@ -13,7 +13,6 @@
 
 typedef u32    compat_size_t;
 typedef s32    compat_ssize_t;
-typedef s32    compat_time_t;
 typedef s32    compat_clock_t;
 typedef s32    compat_pid_t;
 typedef u32    __compat_uid_t;
@@ -40,16 +39,6 @@ typedef u32  compat_ulong_t;
 typedef u64    compat_u64;
 typedef u32    compat_uptr_t;
 
-struct compat_timespec {
-       compat_time_t           tv_sec;
-       s32                     tv_nsec;
-};
-
-struct compat_timeval {
-       compat_time_t           tv_sec;
-       s32                     tv_usec;
-};
-
 struct compat_stat {
        compat_dev_t            st_dev; /* dev_t is 32 bits on parisc */
        compat_ino_t            st_ino; /* 32 bits */
index 62168e1158f1b4ade5a2058080b0d9d6b25666a5..b4773c81f7d53ab30aa0b6c56dcd24847e3b00af 100644 (file)
@@ -17,7 +17,6 @@
 
 typedef u32            compat_size_t;
 typedef s32            compat_ssize_t;
-typedef s32            compat_time_t;
 typedef s32            compat_clock_t;
 typedef s32            compat_pid_t;
 typedef u32            __compat_uid_t;
@@ -45,16 +44,6 @@ typedef u32          compat_ulong_t;
 typedef u64            compat_u64;
 typedef u32            compat_uptr_t;
 
-struct compat_timespec {
-       compat_time_t   tv_sec;
-       s32             tv_nsec;
-};
-
-struct compat_timeval {
-       compat_time_t   tv_sec;
-       s32             tv_usec;
-};
-
 struct compat_stat {
        compat_dev_t    st_dev;
        compat_ino_t    st_ino;
index 373dc1d6ef44e99854200208466f741489944423..8817c5a6bcc26891e54f5a111e516ae19fafa87d 100644 (file)
@@ -13,6 +13,7 @@
  * 2 of the License, or (at your option) any later version.
  */
 
+#include <linux/compat.h>
 #include <linux/signal.h>
 #include <linux/sched.h>
 #include <linux/kernel.h>
@@ -42,7 +43,6 @@
 #include <asm/paca.h>
 #include <asm/lppaca.h>
 #include <asm/cache.h>
-#include <asm/compat.h>
 #include <asm/mmu.h>
 #include <asm/hvcall.h>
 #include <asm/xics.h>
index ecc66d5f02c9075e2c97225895d840ba5775e3ec..ad054dd0d6666332b68476d51e2f4ec49637d800 100644 (file)
@@ -7,6 +7,7 @@
  * 2 of the License, or (at your option) any later version.
 **/
 
+#include <linux/compat_time.h>
 #include <linux/oprofile.h>
 #include <linux/sched.h>
 #include <asm/processor.h>
index ae0ed8dd5f1b362eb3c93ee58ed10d947a587c83..5d85a039391c6193454b40addda2319ea66a6ffe 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/string.h>
 #include <linux/types.h>
 #include <linux/uaccess.h>
-#include <asm/compat.h>
 #include <asm/diag.h>
 #include <asm/sclp.h>
 #include "hypfs.h"
index 9830fb6b076eaa957ecd6123ac9d8ca83482453d..501aaff853047d4f1da7cfa251fe7d9e97df798b 100644 (file)
@@ -53,7 +53,6 @@
 
 typedef u32            compat_size_t;
 typedef s32            compat_ssize_t;
-typedef s32            compat_time_t;
 typedef s32            compat_clock_t;
 typedef s32            compat_pid_t;
 typedef u16            __compat_uid_t;
@@ -97,16 +96,6 @@ typedef struct {
        u32 gprs_high[NUM_GPRS];
 } s390_compat_regs_high;
 
-struct compat_timespec {
-       compat_time_t   tv_sec;
-       s32             tv_nsec;
-};
-
-struct compat_timeval {
-       compat_time_t   tv_sec;
-       s32             tv_usec;
-};
-
 struct compat_stat {
        compat_dev_t    st_dev;
        u16             __pad1;
index 1a61b1b997f2a0da08882411a8b701780fffba9a..7d22a474a040ddd3d0e76c84075db6ab17bb2263 100644 (file)
  * ELF register definitions..
  */
 
+#include <linux/compat.h>
+
 #include <asm/ptrace.h>
-#include <asm/compat.h>
 #include <asm/syscall.h>
 #include <asm/user.h>
 
@@ -136,7 +137,6 @@ typedef s390_regs elf_gregset_t;
 typedef s390_fp_regs compat_elf_fpregset_t;
 typedef s390_compat_regs compat_elf_gregset_t;
 
-#include <linux/compat.h>
 #include <linux/sched/mm.h>    /* for task_struct */
 #include <asm/mmu_context.h>
 
index ebfa0442e569af65fae1a46a4736024555721b80..a3bce0e8434628a1c8d05404149e6573a71bd4ab 100644 (file)
@@ -26,7 +26,6 @@
 #include <asm/gmap.h>
 #include <asm/io.h>
 #include <asm/ptrace.h>
-#include <asm/compat.h>
 #include <asm/sclp.h>
 #include "gaccess.h"
 #include "kvm-s390.h"
index 93cd0f1ca12bb4788cb79354940defd397de1f1a..19b2d2a9b43db346a4ac3e308582c7a322c9d01c 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/uaccess.h>
 #include <asm/pci_debug.h>
 #include <asm/pci_clp.h>
-#include <asm/compat.h>
 #include <asm/clp.h>
 #include <uapi/asm/clp.h>
 
index 1efcce74997bc34c46e3af3bd4926c97f42ec3c9..46dd82ab2c29053692a0f0b174cf302231b3a113 100644 (file)
@@ -1,3 +1,4 @@
+generic-y += compat.h
 generic-y += current.h
 generic-y += delay.h
 generic-y += div64.h
index 615283e16f22a1ac0abd6e9b8eb5ed50d8165d66..1910c44521e3f889cf2763db7eb084a9811b7a90 100644 (file)
@@ -11,7 +11,6 @@
 
 typedef u32            compat_size_t;
 typedef s32            compat_ssize_t;
-typedef s32            compat_time_t;
 typedef s32            compat_clock_t;
 typedef s32            compat_pid_t;
 typedef u16            __compat_uid_t;
@@ -39,16 +38,6 @@ typedef u32          compat_ulong_t;
 typedef u64            compat_u64;
 typedef u32            compat_uptr_t;
 
-struct compat_timespec {
-       compat_time_t   tv_sec;
-       s32             tv_nsec;
-};
-
-struct compat_timeval {
-       compat_time_t   tv_sec;
-       s32             tv_usec;
-};
-
 struct compat_stat {
        compat_dev_t    st_dev;
        compat_ino_t    st_ino;
@@ -168,6 +157,7 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr)
        return (u32)(unsigned long)uptr;
 }
 
+#ifdef CONFIG_COMPAT
 static inline void __user *arch_compat_alloc_user_space(long len)
 {
        struct pt_regs *regs = current_thread_info()->kregs;
@@ -184,6 +174,7 @@ static inline void __user *arch_compat_alloc_user_space(long len)
 
        return (void __user *) usp;
 }
+#endif
 
 struct compat_ipc64_perm {
        compat_key_t key;
@@ -243,6 +234,7 @@ struct compat_shmid64_ds {
        unsigned int    __unused2;
 };
 
+#ifdef CONFIG_COMPAT
 static inline int is_compat_task(void)
 {
        return test_thread_flag(TIF_32BIT);
@@ -254,5 +246,6 @@ static inline bool in_compat_syscall(void)
        return pt_regs_trap_type(current_pt_regs()) == 0x110;
 }
 #define in_compat_syscall in_compat_syscall
+#endif
 
 #endif /* _ASM_SPARC64_COMPAT_H */
index bb5a196c3061f278e55a6cf7ffed970891a9cc98..b10dde6cb793b059f03e6432185050f3937aed01 100644 (file)
@@ -1,6 +1,7 @@
 generic-y += barrier.h
 generic-y += bpf_perf_event.h
 generic-y += bug.h
+generic-y += compat.h
 generic-y += current.h
 generic-y += delay.h
 generic-y += device.h
index 6f70c76c81fc78c1cbdf3cf3c2ac91c47d45b6f9..bfc7abe7790579cc2aeb657c57b94520a5b92ac0 100644 (file)
@@ -1,5 +1,6 @@
 generic-y += atomic.h
 generic-y += bugs.h
+generic-y += compat.h
 generic-y += current.h
 generic-y += device.h
 generic-y += div64.h
index 45b2b1c93d042231979e621970167f583cb444f5..6e461fb1e0d476f80def177b43c7cc01726d89ce 100644 (file)
@@ -2397,7 +2397,7 @@ static unsigned long get_segment_base(unsigned int segment)
 
 #ifdef CONFIG_IA32_EMULATION
 
-#include <asm/compat.h>
+#include <linux/compat.h>
 
 static inline int
 perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *entry)
index e1c8dab8667097dcbb69ec6808df9f287a720487..7cd314b71c513154c2e13253791898c5c4807319 100644 (file)
@@ -17,7 +17,6 @@
 
 typedef u32            compat_size_t;
 typedef s32            compat_ssize_t;
-typedef s32            compat_time_t;
 typedef s32            compat_clock_t;
 typedef s32            compat_pid_t;
 typedef u16            __compat_uid_t;
@@ -46,16 +45,6 @@ typedef u32          compat_u32;
 typedef u64 __attribute__((aligned(4))) compat_u64;
 typedef u32            compat_uptr_t;
 
-struct compat_timespec {
-       compat_time_t   tv_sec;
-       s32             tv_nsec;
-};
-
-struct compat_timeval {
-       compat_time_t   tv_sec;
-       s32             tv_usec;
-};
-
 struct compat_stat {
        compat_dev_t    st_dev;
        u16             __pad1;
index cc8f8fcf9b4aad1031b80a37717e3fcbb7aced98..c18ed65287d5eda607c009bf747fc67f81743dfc 100644 (file)
@@ -63,7 +63,7 @@ static inline bool arch_syscall_match_sym_name(const char *sym, const char *name
 #ifndef COMPILE_OFFSETS
 
 #if defined(CONFIG_FTRACE_SYSCALLS) && defined(CONFIG_IA32_EMULATION)
-#include <asm/compat.h>
+#include <linux/compat.h>
 
 /*
  * Because ia32 syscalls do not map to x86_64 syscall numbers
index a3f15ed545b560759fda579f1e3bd29f752269a3..6a78d4b36a7974ad4d4b4d75500c566529e4d227 100644 (file)
@@ -1,4 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
+#include <linux/compat.h>
 #include <linux/errno.h>
 #include <linux/sched.h>
 #include <linux/sched/mm.h>
@@ -19,7 +20,6 @@
 #include <linux/elf.h>
 
 #include <asm/elf.h>
-#include <asm/compat.h>
 #include <asm/ia32.h>
 #include <asm/syscalls.h>
 #include <asm/mpx.h>
index 436b20337168c320a9e48db8698e34b2aa8d5ef6..e5e1e61c538c3dc06e49d7868f538bb4e01a9f3e 100644 (file)
@@ -1,4 +1,5 @@
 generic-y += bug.h
+generic-y += compat.h
 generic-y += device.h
 generic-y += div64.h
 generic-y += dma-contiguous.h
index 8e8a09755d10431e27f42479a08c8a6fb842ab0c..dec0dd88ec15fdf8ca81e01a0a9692572f1cef21 100644 (file)
@@ -450,8 +450,10 @@ config MTK_TIMER
          Support for Mediatek timer driver.
 
 config SPRD_TIMER
-       bool "Spreadtrum timer driver" if COMPILE_TEST
+       bool "Spreadtrum timer driver" if EXPERT
        depends on HAS_IOMEM
+       depends on (ARCH_SPRD || COMPILE_TEST)
+       default ARCH_SPRD
        select TIMER_OF
        help
          Enables support for the Spreadtrum timer driver.
index 471b428d8034ce5af3e2fc8993fca63df27b68f9..20da9b1d7f7d01c0a537dd6a421b3eb7ea2e547e 100644 (file)
@@ -61,6 +61,20 @@ static u64 arc_read_gfrc(struct clocksource *cs)
        unsigned long flags;
        u32 l, h;
 
+       /*
+        * From a programming model pov, there seems to be just one instance of
+        * MCIP_CMD/MCIP_READBACK however micro-architecturally there's
+        * an instance PER ARC CORE (not per cluster), and there are dedicated
+        * hardware decode logic (per core) inside ARConnect to handle
+        * simultaneous read/write accesses from cores via those two registers.
+        * So several concurrent commands to ARConnect are OK if they are
+        * trying to access two different sub-components (like GFRC,
+        * inter-core interrupt, etc...). HW also supports simultaneously
+        * accessing GFRC by multiple cores.
+        * That's why it is safe to disable hard interrupts on the local CPU
+        * before access to GFRC instead of taking global MCIP spinlock
+        * defined in arch/arc/kernel/mcip.c
+        */
        local_irq_save(flags);
 
        __mcip_cmd(CMD_GFRC_READ_LO, 0);
index 986b6796b631f77daa26e3b300d901c2ae00da22..54f8a331b53a0735e21e6befb4c894dae8f76f97 100644 (file)
@@ -5,6 +5,9 @@
  *
  * Copyright (C) 2012 MIPS Technologies, Inc.  All rights reserved.
  */
+
+#define pr_fmt(fmt) "mips-gic-timer: " fmt
+
 #include <linux/clk.h>
 #include <linux/clockchips.h>
 #include <linux/cpu.h>
@@ -136,8 +139,7 @@ static int gic_clockevent_init(void)
 
        ret = setup_percpu_irq(gic_timer_irq, &gic_compare_irqaction);
        if (ret < 0) {
-               pr_err("GIC timer IRQ %d setup failed: %d\n",
-                      gic_timer_irq, ret);
+               pr_err("IRQ %d setup failed (%d)\n", gic_timer_irq, ret);
                return ret;
        }
 
@@ -176,7 +178,7 @@ static int __init __gic_clocksource_init(void)
 
        ret = clocksource_register_hz(&gic_clocksource, gic_frequency);
        if (ret < 0)
-               pr_warn("GIC: Unable to register clocksource\n");
+               pr_warn("Unable to register clocksource\n");
 
        return ret;
 }
@@ -188,7 +190,7 @@ static int __init gic_clocksource_of_init(struct device_node *node)
 
        if (!mips_gic_present() || !node->parent ||
            !of_device_is_compatible(node->parent, "mti,gic")) {
-               pr_warn("No DT definition for the mips gic driver\n");
+               pr_warn("No DT definition\n");
                return -ENXIO;
        }
 
@@ -196,7 +198,7 @@ static int __init gic_clocksource_of_init(struct device_node *node)
        if (!IS_ERR(clk)) {
                ret = clk_prepare_enable(clk);
                if (ret < 0) {
-                       pr_err("GIC failed to enable clock\n");
+                       pr_err("Failed to enable clock\n");
                        clk_put(clk);
                        return ret;
                }
@@ -204,12 +206,12 @@ static int __init gic_clocksource_of_init(struct device_node *node)
                gic_frequency = clk_get_rate(clk);
        } else if (of_property_read_u32(node, "clock-frequency",
                                        &gic_frequency)) {
-               pr_err("GIC frequency not specified.\n");
+               pr_err("Frequency not specified\n");
                return -EINVAL;
        }
        gic_timer_irq = irq_of_parse_and_map(node, 0);
        if (!gic_timer_irq) {
-               pr_err("GIC timer IRQ not specified.\n");
+               pr_err("IRQ not specified\n");
                return -EINVAL;
        }
 
@@ -220,7 +222,7 @@ static int __init gic_clocksource_of_init(struct device_node *node)
        ret = gic_clockevent_init();
        if (!ret && !IS_ERR(clk)) {
                if (clk_notifier_register(clk, &gic_clk_nb) < 0)
-                       pr_warn("GIC: Unable to register clock notifier\n");
+                       pr_warn("Unable to register clock notifier\n");
        }
 
        /* And finally start the counter */
index a03434e9fe8f47146f3f0f7047482f5d878ea1b0..f6ddae30933f7cc71455eb9285392c23fd45703e 100644 (file)
@@ -1,24 +1,10 @@
-/*
- *  Copyright (C) 2000-2001 Deep Blue Solutions
- *  Copyright (C) 2002 Shane Nay (shane@minirl.com)
- *  Copyright (C) 2006-2007 Pavel Pisa (ppisa@pikron.com)
- *  Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
- *  Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+//  Copyright (C) 2000-2001 Deep Blue Solutions
+//  Copyright (C) 2002 Shane Nay (shane@minirl.com)
+//  Copyright (C) 2006-2007 Pavel Pisa (ppisa@pikron.com)
+//  Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
+//  Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.
 
 #include <linux/err.h>
 #include <linux/interrupt.h>
index 6ec6d79b237cedac8a4a0f71d56c825ce1acf491..165fbbb1c9a049335456cc197392d197c54e93a6 100644 (file)
@@ -1,25 +1,9 @@
-/*
- *  linux/arch/arm/plat-mxc/time.c
- *
- *  Copyright (C) 2000-2001 Deep Blue Solutions
- *  Copyright (C) 2002 Shane Nay (shane@minirl.com)
- *  Copyright (C) 2006-2007 Pavel Pisa (ppisa@pikron.com)
- *  Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+//  Copyright (C) 2000-2001 Deep Blue Solutions
+//  Copyright (C) 2002 Shane Nay (shane@minirl.com)
+//  Copyright (C) 2006-2007 Pavel Pisa (ppisa@pikron.com)
+//  Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
 
 #include <linux/interrupt.h>
 #include <linux/irq.h>
index 6c8318470b48774efefd09437dac7cb365c92d33..b7aa2b81707821292b6ded8ab8ccfeee5c01775c 100644 (file)
@@ -1,12 +1,7 @@
-/*
- * Copyright 2016 Freescale Semiconductor, Inc.
- * Copyright 2017 NXP
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+// Copyright 2016 Freescale Semiconductor, Inc.
+// Copyright 2017 NXP
 
 #include <linux/clk.h>
 #include <linux/clockchips.h>
index 7bdc6aaa0ba3622c33ad33235131a7ba0b86c580..2016e0ed5865726011742227de740053d492b337 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/fs.h>
 #include <linux/blkpg.h>
 #include <linux/slab.h>
-#include <asm/compat.h>
 #include <asm/ccwdev.h>
 #include <asm/schid.h>
 #include <asm/cmb.h>
index 61822480a2a0bdfa808e4f9d3e19965857e7700d..16a4e8528bbc34198677f1e9f879790192fb4f33 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/slab.h>
 #include <linux/types.h>
 
-#include <asm/compat.h>
 #include <asm/ccwdev.h>
 #include <asm/cio.h>
 #include <asm/ebcdic.h>
index a78cea0c3a09b8a6be200c80352fe89c31b28cd7..248b5db3eaa8c0de73caf360b45f5690453c675d 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/init.h>
 #include <linux/ioctl.h>
 #include <linux/fs.h>
-#include <asm/compat.h>
 #include <asm/sclp_ctl.h>
 #include <asm/sclp.h>
 
index 17e411c575768164c43ea47184e7bdfa2162fb28..948ce82a7725a349157b892b55e4892d6a344f77 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/mutex.h>
 #include <linux/cma.h>
 #include <linux/mm.h>
-#include <asm/compat.h>
 #include <asm/cpcmd.h>
 #include <asm/debug.h>
 #include <asm/vmcp.h>
index 0015729d917d90e049a1def14cba883ec2c31cc3..8d9f36625ba5eb2efed79a4e2d8485a16db4ce29 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/miscdevice.h>
 #include <linux/kernel_stat.h>
 
-#include <asm/compat.h>
 #include <asm/cio.h>
 #include <asm/chsc.h>
 #include <asm/isc.h>
index dffd820731f2a53f9a5c58f0f9da78df72c2a0cf..f5a0d894d9add3841dede0ad16303165910220e7 100644 (file)
@@ -10,6 +10,7 @@
 #define KMSG_COMPONENT "qeth"
 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
 
+#include <linux/compat.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/string.h>
@@ -32,7 +33,6 @@
 #include <asm/chpid.h>
 #include <asm/io.h>
 #include <asm/sysinfo.h>
-#include <asm/compat.h>
 #include <asm/diag.h>
 #include <asm/cio.h>
 #include <asm/ccwdev.h>
diff --git a/include/asm-generic/compat.h b/include/asm-generic/compat.h
new file mode 100644 (file)
index 0000000..2881945
--- /dev/null
@@ -0,0 +1,3 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+/* This is an empty stub for 32-bit-only architectures */
index ad192057b8879902b9d57f40d8dc0e048b3c6081..b1a5562b3215b71302422b7a727bbb2cf499d8f3 100644 (file)
@@ -7,8 +7,7 @@
  */
 
 #include <linux/types.h>
-
-#ifdef CONFIG_COMPAT
+#include <linux/compat_time.h>
 
 #include <linux/stat.h>
 #include <linux/param.h>       /* for HZ */
 #include <linux/unistd.h>
 
 #include <asm/compat.h>
+
+#ifdef CONFIG_COMPAT
 #include <asm/siginfo.h>
 #include <asm/signal.h>
+#endif
 
 #ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER
 /*
@@ -83,6 +85,8 @@
        static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
 #endif /* COMPAT_SYSCALL_DEFINEx */
 
+#ifdef CONFIG_COMPAT
+
 #ifndef compat_user_stack_pointer
 #define compat_user_stack_pointer() current_user_stack_pointer()
 #endif
@@ -290,8 +294,6 @@ extern int compat_get_timespec(struct timespec *, const void __user *);
 extern int compat_put_timespec(const struct timespec *, void __user *);
 extern int compat_get_timeval(struct timeval *, const void __user *);
 extern int compat_put_timeval(const struct timeval *, void __user *);
-extern int compat_get_timespec64(struct timespec64 *, const void __user *);
-extern int compat_put_timespec64(const struct timespec64 *, void __user *);
 extern int get_compat_itimerspec64(struct itimerspec64 *its,
                        const struct compat_itimerspec __user *uits);
 extern int put_compat_itimerspec64(const struct itimerspec64 *its,
@@ -1023,7 +1025,9 @@ static inline struct compat_timeval ns_to_compat_timeval(s64 nsec)
 #else /* !CONFIG_COMPAT */
 
 #define is_compat_task() (0)
+#ifndef in_compat_syscall
 static inline bool in_compat_syscall(void) { return false; }
+#endif
 
 #endif /* CONFIG_COMPAT */
 
diff --git a/include/linux/compat_time.h b/include/linux/compat_time.h
new file mode 100644 (file)
index 0000000..31f2774
--- /dev/null
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_COMPAT_TIME_H
+#define _LINUX_COMPAT_TIME_H
+
+#include <linux/types.h>
+#include <linux/time64.h>
+
+typedef s32            compat_time_t;
+
+struct compat_timespec {
+       compat_time_t   tv_sec;
+       s32             tv_nsec;
+};
+
+struct compat_timeval {
+       compat_time_t   tv_sec;
+       s32             tv_usec;
+};
+
+extern int compat_get_timespec64(struct timespec64 *, const void __user *);
+extern int compat_put_timespec64(const struct timespec64 *, void __user *);
+
+#endif /* _LINUX_COMPAT_TIME_H */
index bcfdb918cd810ec5e7b006764e3be936edea34b7..5d83d0c1d06cc22507d8b8e03d75e0bf8de32fd8 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <linux/compiler.h>
 #include <linux/types.h>
+#include <linux/time64.h>
 
 struct timespec;
 struct compat_timespec;
@@ -15,9 +16,7 @@ struct pollfd;
 enum timespec_type {
        TT_NONE         = 0,
        TT_NATIVE       = 1,
-#ifdef CONFIG_COMPAT
        TT_COMPAT       = 2,
-#endif
 };
 
 /*
@@ -40,10 +39,8 @@ struct restart_block {
                        clockid_t clockid;
                        enum timespec_type type;
                        union {
-                               struct timespec __user *rmtp;
-#ifdef CONFIG_COMPAT
+                               struct __kernel_timespec __user *rmtp;
                                struct compat_timespec __user *compat_rmtp;
-#endif
                        };
                        u64 expires;
                } nanosleep;
index 811172fcb916bb580e0d55d06869e618d385d435..796ea267f1c7d6e0058c8e80f138b88b6ee8b5f2 100644 (file)
@@ -542,7 +542,8 @@ asmlinkage long sys_set_robust_list(struct robust_list_head __user *head,
                                    size_t len);
 
 /* kernel/hrtimer.c */
-asmlinkage long sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp);
+asmlinkage long sys_nanosleep(struct __kernel_timespec __user *rqtp,
+                             struct __kernel_timespec __user *rmtp);
 
 /* kernel/itimer.c */
 asmlinkage long sys_getitimer(int which, struct itimerval __user *value);
@@ -573,14 +574,14 @@ asmlinkage long sys_timer_settime(timer_t timer_id, int flags,
                                struct itimerspec __user *old_setting);
 asmlinkage long sys_timer_delete(timer_t timer_id);
 asmlinkage long sys_clock_settime(clockid_t which_clock,
-                               const struct timespec __user *tp);
+                               const struct __kernel_timespec __user *tp);
 asmlinkage long sys_clock_gettime(clockid_t which_clock,
-                               struct timespec __user *tp);
+                               struct __kernel_timespec __user *tp);
 asmlinkage long sys_clock_getres(clockid_t which_clock,
-                               struct timespec __user *tp);
+                               struct __kernel_timespec __user *tp);
 asmlinkage long sys_clock_nanosleep(clockid_t which_clock, int flags,
-                               const struct timespec __user *rqtp,
-                               struct timespec __user *rmtp);
+                               const struct __kernel_timespec __user *rqtp,
+                               struct __kernel_timespec __user *rmtp);
 
 /* kernel/printk.c */
 asmlinkage long sys_syslog(int type, char __user *buf, int len);
index 4b62a2c0a66129c7615fd60e36852be02a642a14..aed74463592d8121f2a38c83ad15602aa1af252f 100644 (file)
@@ -10,9 +10,9 @@
 extern struct timezone sys_tz;
 
 int get_timespec64(struct timespec64 *ts,
-               const struct timespec __user *uts);
+               const struct __kernel_timespec __user *uts);
 int put_timespec64(const struct timespec64 *ts,
-               struct timespec __user *uts);
+               struct __kernel_timespec __user *uts);
 int get_itimerspec64(struct itimerspec64 *it,
                        const struct itimerspec __user *uit);
 int put_itimerspec64(const struct itimerspec64 *it,
index 93d39499838e06d168dbcefb970d23b047a288ad..0d96887ba4e0bfc95d0523f01aa20117fd8ef3ab 100644 (file)
@@ -2,12 +2,20 @@
 #ifndef _LINUX_TIME64_H
 #define _LINUX_TIME64_H
 
-#include <uapi/linux/time.h>
 #include <linux/math64.h>
 
 typedef __s64 time64_t;
 typedef __u64 timeu64_t;
 
+/* CONFIG_64BIT_TIME enables new 64 bit time_t syscalls in the compat path
+ * and 32-bit emulation.
+ */
+#ifndef CONFIG_64BIT_TIME
+#define __kernel_timespec timespec
+#endif
+
+#include <uapi/linux/time.h>
+
 #if __BITS_PER_LONG == 64
 /* this trick allows us to optimize out timespec64_to_timespec */
 # define timespec64 timespec
index 5e6ea22bd525ff1772ef278d40f5baa350e8387b..f0733a26ebfc220c163d0fee11f637fedc40e033 100644 (file)
@@ -87,6 +87,7 @@ typedef struct {
 typedef __kernel_long_t        __kernel_off_t;
 typedef long long      __kernel_loff_t;
 typedef __kernel_long_t        __kernel_time_t;
+typedef long long __kernel_time64_t;
 typedef __kernel_long_t        __kernel_clock_t;
 typedef int            __kernel_timer_t;
 typedef int            __kernel_clockid_t;
index 4c0338ea308a67b3f7dfe179651c7a55322ce6fb..fcf9366564936d5026c6e27cc56804debfb8eefb 100644 (file)
@@ -42,6 +42,13 @@ struct itimerval {
        struct timeval it_value;        /* current value */
 };
 
+#ifndef __kernel_timespec
+struct __kernel_timespec {
+       __kernel_time64_t       tv_sec;                 /* seconds */
+       long long               tv_nsec;                /* nanoseconds */
+};
+#endif
+
 /*
  * legacy timeval structure, only embedded in structures that
  * traditionally used 'timeval' to pass time intervals (not absolute
index 92d8c98c0f57ac92aacd888d9342debcdec46cdb..702aa846ddacabde1fdf4c0e29c491f5c9c10d00 100644 (file)
@@ -121,50 +121,6 @@ static int __compat_put_timespec(const struct timespec *ts, struct compat_timesp
                        __put_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0;
 }
 
-static int __compat_get_timespec64(struct timespec64 *ts64,
-                                  const struct compat_timespec __user *cts)
-{
-       struct compat_timespec ts;
-       int ret;
-
-       ret = copy_from_user(&ts, cts, sizeof(ts));
-       if (ret)
-               return -EFAULT;
-
-       ts64->tv_sec = ts.tv_sec;
-       ts64->tv_nsec = ts.tv_nsec;
-
-       return 0;
-}
-
-static int __compat_put_timespec64(const struct timespec64 *ts64,
-                                  struct compat_timespec __user *cts)
-{
-       struct compat_timespec ts = {
-               .tv_sec = ts64->tv_sec,
-               .tv_nsec = ts64->tv_nsec
-       };
-       return copy_to_user(cts, &ts, sizeof(ts)) ? -EFAULT : 0;
-}
-
-int compat_get_timespec64(struct timespec64 *ts, const void __user *uts)
-{
-       if (COMPAT_USE_64BIT_TIME)
-               return copy_from_user(ts, uts, sizeof(*ts)) ? -EFAULT : 0;
-       else
-               return __compat_get_timespec64(ts, uts);
-}
-EXPORT_SYMBOL_GPL(compat_get_timespec64);
-
-int compat_put_timespec64(const struct timespec64 *ts, void __user *uts)
-{
-       if (COMPAT_USE_64BIT_TIME)
-               return copy_to_user(uts, ts, sizeof(*ts)) ? -EFAULT : 0;
-       else
-               return __compat_put_timespec64(ts, uts);
-}
-EXPORT_SYMBOL_GPL(compat_put_timespec64);
-
 int compat_get_timeval(struct timeval *tv, const void __user *utv)
 {
        if (COMPAT_USE_64BIT_TIME)
@@ -368,6 +324,14 @@ COMPAT_SYSCALL_DEFINE3(sched_getaffinity, compat_pid_t,  pid, unsigned int, len,
        return ret;
 }
 
+/* Todo: Delete these extern declarations when get/put_compat_itimerspec64()
+ * are moved to kernel/time/time.c .
+ */
+extern int __compat_get_timespec64(struct timespec64 *ts64,
+                                  const struct compat_timespec __user *cts);
+extern int __compat_put_timespec64(const struct timespec64 *ts64,
+                                  struct compat_timespec __user *cts);
+
 int get_compat_itimerspec64(struct itimerspec64 *its,
                        const struct compat_itimerspec __user *uits)
 {
index 84f37420fcf544c09e12f730f05a8a85411b36f1..f89a78e2792b645ea8b8abc540988569c560799b 100644 (file)
@@ -129,31 +129,19 @@ static void inline clocksource_watchdog_unlock(unsigned long *flags)
        spin_unlock_irqrestore(&watchdog_lock, *flags);
 }
 
-static int clocksource_watchdog_kthread(void *data);
-static void __clocksource_change_rating(struct clocksource *cs, int rating);
-
 /*
  * Interval: 0.5sec Threshold: 0.0625s
  */
 #define WATCHDOG_INTERVAL (HZ >> 1)
 #define WATCHDOG_THRESHOLD (NSEC_PER_SEC >> 4)
 
-static void clocksource_watchdog_work(struct work_struct *work)
-{
-       /*
-        * If kthread_run fails the next watchdog scan over the
-        * watchdog_list will find the unstable clock again.
-        */
-       kthread_run(clocksource_watchdog_kthread, NULL, "kwatchdog");
-}
-
 static void __clocksource_unstable(struct clocksource *cs)
 {
        cs->flags &= ~(CLOCK_SOURCE_VALID_FOR_HRES | CLOCK_SOURCE_WATCHDOG);
        cs->flags |= CLOCK_SOURCE_UNSTABLE;
 
        /*
-        * If the clocksource is registered clocksource_watchdog_kthread() will
+        * If the clocksource is registered clocksource_watchdog_work() will
         * re-rate and re-select.
         */
        if (list_empty(&cs->list)) {
@@ -164,7 +152,7 @@ static void __clocksource_unstable(struct clocksource *cs)
        if (cs->mark_unstable)
                cs->mark_unstable(cs);
 
-       /* kick clocksource_watchdog_kthread() */
+       /* kick clocksource_watchdog_work() */
        if (finished_booting)
                schedule_work(&watchdog_work);
 }
@@ -174,7 +162,7 @@ static void __clocksource_unstable(struct clocksource *cs)
  * @cs:                clocksource to be marked unstable
  *
  * This function is called by the x86 TSC code to mark clocksources as unstable;
- * it defers demotion and re-selection to a kthread.
+ * it defers demotion and re-selection to a work.
  */
 void clocksource_mark_unstable(struct clocksource *cs)
 {
@@ -399,7 +387,9 @@ static void clocksource_dequeue_watchdog(struct clocksource *cs)
        }
 }
 
-static int __clocksource_watchdog_kthread(void)
+static void __clocksource_change_rating(struct clocksource *cs, int rating);
+
+static int __clocksource_watchdog_work(void)
 {
        struct clocksource *cs, *tmp;
        unsigned long flags;
@@ -424,13 +414,12 @@ static int __clocksource_watchdog_kthread(void)
        return select;
 }
 
-static int clocksource_watchdog_kthread(void *data)
+static void clocksource_watchdog_work(struct work_struct *work)
 {
        mutex_lock(&clocksource_mutex);
-       if (__clocksource_watchdog_kthread())
+       if (__clocksource_watchdog_work())
                clocksource_select();
        mutex_unlock(&clocksource_mutex);
-       return 0;
 }
 
 static bool clocksource_is_watchdog(struct clocksource *cs)
@@ -449,12 +438,12 @@ static void clocksource_enqueue_watchdog(struct clocksource *cs)
 static void clocksource_select_watchdog(bool fallback) { }
 static inline void clocksource_dequeue_watchdog(struct clocksource *cs) { }
 static inline void clocksource_resume_watchdog(void) { }
-static inline int __clocksource_watchdog_kthread(void) { return 0; }
+static inline int __clocksource_watchdog_work(void) { return 0; }
 static bool clocksource_is_watchdog(struct clocksource *cs) { return false; }
 void clocksource_mark_unstable(struct clocksource *cs) { }
 
-static void inline clocksource_watchdog_lock(unsigned long *flags) { }
-static void inline clocksource_watchdog_unlock(unsigned long *flags) { }
+static inline void clocksource_watchdog_lock(unsigned long *flags) { }
+static inline void clocksource_watchdog_unlock(unsigned long *flags) { }
 
 #endif /* CONFIG_CLOCKSOURCE_WATCHDOG */
 
@@ -683,7 +672,7 @@ static int __init clocksource_done_booting(void)
        /*
         * Run the watchdog first to eliminate unstable clock sources
         */
-       __clocksource_watchdog_kthread();
+       __clocksource_watchdog_work();
        clocksource_select();
        mutex_unlock(&clocksource_mutex);
        return 0;
index 14e858753d7689d96392402ebce61e0116574efa..055a4a728c00cce3945afc04b9bee692b243896b 100644 (file)
@@ -1759,8 +1759,10 @@ out:
        return ret;
 }
 
-SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp,
-               struct timespec __user *, rmtp)
+#if !defined(CONFIG_64BIT_TIME) || defined(CONFIG_64BIT)
+
+SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp,
+               struct __kernel_timespec __user *, rmtp)
 {
        struct timespec64 tu;
 
@@ -1775,7 +1777,9 @@ SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp,
        return hrtimer_nanosleep(&tu, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
 }
 
-#ifdef CONFIG_COMPAT
+#endif
+
+#ifdef CONFIG_COMPAT_32BIT_TIME
 
 COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp,
                       struct compat_timespec __user *, rmtp)
index 69a937c3cd81260e8a83942ea0d21750c86fa5be..26aa9569e24a54a6060584a5931ce36748f36d83 100644 (file)
@@ -59,7 +59,7 @@ SYS_NI(alarm);
  */
 
 SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
-               const struct timespec __user *, tp)
+               const struct __kernel_timespec __user *, tp)
 {
        struct timespec64 new_tp;
 
@@ -90,7 +90,7 @@ int do_clock_gettime(clockid_t which_clock, struct timespec64 *tp)
        return 0;
 }
 SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
-               struct timespec __user *, tp)
+               struct __kernel_timespec __user *, tp)
 {
        int ret;
        struct timespec64 kernel_tp;
@@ -104,7 +104,7 @@ SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
        return 0;
 }
 
-SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, struct timespec __user *, tp)
+SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, struct __kernel_timespec __user *, tp)
 {
        struct timespec64 rtn_tp = {
                .tv_sec = 0,
@@ -124,8 +124,8 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, struct timespec __us
 }
 
 SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
-               const struct timespec __user *, rqtp,
-               struct timespec __user *, rmtp)
+               const struct __kernel_timespec __user *, rqtp,
+               struct __kernel_timespec __user *, rmtp)
 {
        struct timespec64 t;
 
@@ -158,7 +158,9 @@ COMPAT_SYS_NI(timer_settime);
 COMPAT_SYS_NI(timer_gettime);
 COMPAT_SYS_NI(getitimer);
 COMPAT_SYS_NI(setitimer);
+#endif
 
+#ifdef CONFIG_COMPAT_32BIT_TIME
 COMPAT_SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
                       struct compat_timespec __user *, tp)
 {
index 10b7186d063830b9e45a84146ed243a9f0e80b07..e08ce3f27447390846394e55a11cd4e9c029bb37 100644 (file)
@@ -1040,7 +1040,7 @@ void exit_itimers(struct signal_struct *sig)
 }
 
 SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
-               const struct timespec __user *, tp)
+               const struct __kernel_timespec __user *, tp)
 {
        const struct k_clock *kc = clockid_to_kclock(which_clock);
        struct timespec64 new_tp;
@@ -1055,7 +1055,7 @@ SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
 }
 
 SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
-               struct timespec __user *,tp)
+               struct __kernel_timespec __user *, tp)
 {
        const struct k_clock *kc = clockid_to_kclock(which_clock);
        struct timespec64 kernel_tp;
@@ -1096,7 +1096,7 @@ SYSCALL_DEFINE2(clock_adjtime, const clockid_t, which_clock,
 }
 
 SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,
-               struct timespec __user *, tp)
+               struct __kernel_timespec __user *, tp)
 {
        const struct k_clock *kc = clockid_to_kclock(which_clock);
        struct timespec64 rtn_tp;
@@ -1113,7 +1113,7 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,
        return error;
 }
 
-#ifdef CONFIG_COMPAT
+#ifdef CONFIG_COMPAT_32BIT_TIME
 
 COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock,
                       struct compat_timespec __user *, tp)
@@ -1148,6 +1148,10 @@ COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
        return err;
 }
 
+#endif
+
+#ifdef CONFIG_COMPAT
+
 COMPAT_SYSCALL_DEFINE2(clock_adjtime, clockid_t, which_clock,
                       struct compat_timex __user *, utp)
 {
@@ -1172,6 +1176,10 @@ COMPAT_SYSCALL_DEFINE2(clock_adjtime, clockid_t, which_clock,
        return err;
 }
 
+#endif
+
+#ifdef CONFIG_COMPAT_32BIT_TIME
+
 COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
                       struct compat_timespec __user *, tp)
 {
@@ -1203,8 +1211,8 @@ static int common_nsleep(const clockid_t which_clock, int flags,
 }
 
 SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
-               const struct timespec __user *, rqtp,
-               struct timespec __user *, rmtp)
+               const struct __kernel_timespec __user *, rqtp,
+               struct __kernel_timespec __user *, rmtp)
 {
        const struct k_clock *kc = clockid_to_kclock(which_clock);
        struct timespec64 t;
@@ -1227,7 +1235,8 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
        return kc->nsleep(which_clock, flags, &t);
 }
 
-#ifdef CONFIG_COMPAT
+#ifdef CONFIG_COMPAT_32BIT_TIME
+
 COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
                       struct compat_timespec __user *, rqtp,
                       struct compat_timespec __user *, rmtp)
@@ -1252,6 +1261,7 @@ COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
 
        return kc->nsleep(which_clock, flags, &t);
 }
+
 #endif
 
 static const struct k_clock clock_realtime = {
index 49edc1c4f3e645894f839c40489ab81594a02398..78e598334007b627181a9e81b9ffaef5f19f86d1 100644 (file)
@@ -277,7 +277,8 @@ static bool tick_check_preferred(struct clock_event_device *curdev,
         */
        return !curdev ||
                newdev->rating > curdev->rating ||
-              !cpumask_equal(curdev->cpumask, newdev->cpumask);
+              (!cpumask_equal(curdev->cpumask, newdev->cpumask) &&
+               !tick_check_percpu(curdev, newdev, smp_processor_id()));
 }
 
 /*
index 3044d48ebe56d29a690dd5ca809fb73d4da12c6e..ccd751e95fcbac972ec3c596b0e59b53b0a345c7 100644 (file)
@@ -853,9 +853,9 @@ struct timespec64 timespec64_add_safe(const struct timespec64 lhs,
 }
 
 int get_timespec64(struct timespec64 *ts,
-                  const struct timespec __user *uts)
+                  const struct __kernel_timespec __user *uts)
 {
-       struct timespec kts;
+       struct __kernel_timespec kts;
        int ret;
 
        ret = copy_from_user(&kts, uts, sizeof(kts));
@@ -863,6 +863,11 @@ int get_timespec64(struct timespec64 *ts,
                return -EFAULT;
 
        ts->tv_sec = kts.tv_sec;
+
+       /* Zero out the padding for 32 bit systems or in compat mode */
+       if (IS_ENABLED(CONFIG_64BIT_TIME) && (!IS_ENABLED(CONFIG_64BIT) || in_compat_syscall()))
+               kts.tv_nsec &= 0xFFFFFFFFUL;
+
        ts->tv_nsec = kts.tv_nsec;
 
        return 0;
@@ -870,16 +875,61 @@ int get_timespec64(struct timespec64 *ts,
 EXPORT_SYMBOL_GPL(get_timespec64);
 
 int put_timespec64(const struct timespec64 *ts,
-                  struct timespec __user *uts)
+                  struct __kernel_timespec __user *uts)
 {
-       struct timespec kts = {
+       struct __kernel_timespec kts = {
                .tv_sec = ts->tv_sec,
                .tv_nsec = ts->tv_nsec
        };
+
        return copy_to_user(uts, &kts, sizeof(kts)) ? -EFAULT : 0;
 }
 EXPORT_SYMBOL_GPL(put_timespec64);
 
+int __compat_get_timespec64(struct timespec64 *ts64,
+                                  const struct compat_timespec __user *cts)
+{
+       struct compat_timespec ts;
+       int ret;
+
+       ret = copy_from_user(&ts, cts, sizeof(ts));
+       if (ret)
+               return -EFAULT;
+
+       ts64->tv_sec = ts.tv_sec;
+       ts64->tv_nsec = ts.tv_nsec;
+
+       return 0;
+}
+
+int __compat_put_timespec64(const struct timespec64 *ts64,
+                                  struct compat_timespec __user *cts)
+{
+       struct compat_timespec ts = {
+               .tv_sec = ts64->tv_sec,
+               .tv_nsec = ts64->tv_nsec
+       };
+       return copy_to_user(cts, &ts, sizeof(ts)) ? -EFAULT : 0;
+}
+
+int compat_get_timespec64(struct timespec64 *ts, const void __user *uts)
+{
+       if (COMPAT_USE_64BIT_TIME)
+               return copy_from_user(ts, uts, sizeof(*ts)) ? -EFAULT : 0;
+       else
+               return __compat_get_timespec64(ts, uts);
+}
+EXPORT_SYMBOL_GPL(compat_get_timespec64);
+
+int compat_put_timespec64(const struct timespec64 *ts, void __user *uts)
+{
+       if (COMPAT_USE_64BIT_TIME)
+               return copy_to_user(uts, ts, sizeof(*ts)) ? -EFAULT : 0;
+       else
+               return __compat_put_timespec64(ts, uts);
+}
+EXPORT_SYMBOL_GPL(compat_put_timespec64);
+
 int get_itimerspec64(struct itimerspec64 *it,
                        const struct itimerspec __user *uit)
 {
index 4a4fd567fb26654bc96d6fddc31c7ba0da7cd409..cc2d23e6ff6162ccb8101705d2bf5cb4d4554165 100644 (file)
@@ -1251,18 +1251,18 @@ EXPORT_SYMBOL(try_to_del_timer_sync);
  *
  * Note: For !irqsafe timers, you must not hold locks that are held in
  *   interrupt context while calling this function. Even if the lock has
- *   nothing to do with the timer in question.  Here's why:
+ *   nothing to do with the timer in question.  Here's why::
  *
  *    CPU0                             CPU1
  *    ----                             ----
- *                                   <SOFTIRQ>
- *                                   call_timer_fn();
- *                                     base->running_timer = mytimer;
- *  spin_lock_irq(somelock);
+ *                                     <SOFTIRQ>
+ *                                       call_timer_fn();
+ *                                       base->running_timer = mytimer;
+ *    spin_lock_irq(somelock);
  *                                     <IRQ>
  *                                        spin_lock(somelock);
- *  del_timer_sync(mytimer);
- *   while (base->running_timer == mytimer);
+ *    del_timer_sync(mytimer);
+ *    while (base->running_timer == mytimer);
  *
  * Now del_timer_sync() will never return and never release somelock.
  * The interrupt on the other CPU is waiting to grab somelock but
index 675c4e9563a9e6452228f4279d9942e4fae88825..d647dabdac97a3b592b25cdc929909df92b04b8a 100644 (file)
@@ -28,8 +28,6 @@ struct timer_list_iter {
        u64 now;
 };
 
-typedef void (*print_fn_t)(struct seq_file *m, unsigned int *classes);
-
 /*
  * This allows printing both to /proc/timer_list and
  * to the console (on SysRq-Q):