Merge branch 'timers-2038-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull time/Y2038 updates from Thomas Gleixner: - Consolidate SySV IPC UAPI headers - Convert SySV IPC to the new COMPAT_32BIT_TIME mechanism - Cleanup the core interfaces and standardize on the ktime_get_* naming convention. - Convert the X86 platform ops to timespec64 - Remove the ugly temporary timespec64 hack * 'timers-2038-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (22 commits) x86: Convert x86_platform_ops to timespec64 timekeeping: Add more coarse clocktai/boottime interfaces timekeeping: Add ktime_get_coarse_with_offset timekeeping: Standardize on ktime_get_*() naming timekeeping: Clean up ktime_get_real_ts64 timekeeping: Remove timespec64 hack y2038: ipc: Redirect ipc(SEMTIMEDOP, ...) to compat_ksys_semtimedop y2038: ipc: Enable COMPAT_32BIT_TIME y2038: ipc: Use __kernel_timespec y2038: ipc: Report long times to user space y2038: ipc: Use ktime_get_real_seconds consistently y2038: xtensa: Extend sysvipc data structures y2038: powerpc: Extend sysvipc data structures y2038: sparc: Extend sysvipc data structures y2038: parisc: Extend sysvipc data structures y2038: mips: Extend sysvipc data structures y2038: arm64: Extend sysvipc compat data structures y2038: s390: Remove unneeded ipc uapi header files y2038: ia64: Remove unneeded ipc uapi header files y2038: alpha: Remove unneeded ipc uapi header files ...
This commit is contained in:
commit
ba252f16e4
|
@ -2,4 +2,8 @@
|
|||
include include/uapi/asm-generic/Kbuild.asm
|
||||
|
||||
generic-y += bpf_perf_event.h
|
||||
generic-y += ipcbuf.h
|
||||
generic-y += msgbuf.h
|
||||
generic-y += poll.h
|
||||
generic-y += sembuf.h
|
||||
generic-y += shmbuf.h
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#include <asm-generic/ipcbuf.h>
|
|
@ -1,28 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ALPHA_MSGBUF_H
|
||||
#define _ALPHA_MSGBUF_H
|
||||
|
||||
/*
|
||||
* The msqid64_ds structure for alpha architecture.
|
||||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 2 miscellaneous 64-bit values
|
||||
*/
|
||||
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
__kernel_pid_t msg_lspid; /* pid of last msgsnd */
|
||||
__kernel_pid_t msg_lrpid; /* last receive pid */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
|
||||
#endif /* _ALPHA_MSGBUF_H */
|
|
@ -1,23 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ALPHA_SEMBUF_H
|
||||
#define _ALPHA_SEMBUF_H
|
||||
|
||||
/*
|
||||
* The semid64_ds structure for alpha architecture.
|
||||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 2 miscellaneous 64-bit values
|
||||
*/
|
||||
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
|
||||
#endif /* _ALPHA_SEMBUF_H */
|
|
@ -1,39 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ALPHA_SHMBUF_H
|
||||
#define _ALPHA_SHMBUF_H
|
||||
|
||||
/*
|
||||
* The shmid64_ds structure for alpha architecture.
|
||||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 2 miscellaneous 64-bit values
|
||||
*/
|
||||
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
__kernel_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_pid_t shm_lpid; /* pid of last operator */
|
||||
unsigned long shm_nattch; /* no. of current attaches */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
|
||||
struct shminfo64 {
|
||||
unsigned long shmmax;
|
||||
unsigned long shmmin;
|
||||
unsigned long shmmni;
|
||||
unsigned long shmseg;
|
||||
unsigned long shmall;
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
unsigned long __unused3;
|
||||
unsigned long __unused4;
|
||||
};
|
||||
|
||||
#endif /* _ALPHA_SHMBUF_H */
|
|
@ -181,10 +181,10 @@ struct compat_ipc64_perm {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
compat_time_t sem_otime;
|
||||
compat_ulong_t __unused1;
|
||||
compat_time_t sem_ctime;
|
||||
compat_ulong_t __unused2;
|
||||
compat_ulong_t sem_otime;
|
||||
compat_ulong_t sem_otime_high;
|
||||
compat_ulong_t sem_ctime;
|
||||
compat_ulong_t sem_ctime_high;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t __unused4;
|
||||
|
@ -192,12 +192,12 @@ struct compat_semid64_ds {
|
|||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
compat_time_t msg_stime;
|
||||
compat_ulong_t __unused1;
|
||||
compat_time_t msg_rtime;
|
||||
compat_ulong_t __unused2;
|
||||
compat_time_t msg_ctime;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t msg_stime;
|
||||
compat_ulong_t msg_stime_high;
|
||||
compat_ulong_t msg_rtime;
|
||||
compat_ulong_t msg_rtime_high;
|
||||
compat_ulong_t msg_ctime;
|
||||
compat_ulong_t msg_ctime_high;
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
compat_ulong_t msg_qbytes;
|
||||
|
@ -210,12 +210,12 @@ struct compat_msqid64_ds {
|
|||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
compat_size_t shm_segsz;
|
||||
compat_time_t shm_atime;
|
||||
compat_ulong_t __unused1;
|
||||
compat_time_t shm_dtime;
|
||||
compat_ulong_t __unused2;
|
||||
compat_time_t shm_ctime;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t shm_atime;
|
||||
compat_ulong_t shm_atime_high;
|
||||
compat_ulong_t shm_dtime;
|
||||
compat_ulong_t shm_dtime_high;
|
||||
compat_ulong_t shm_ctime;
|
||||
compat_ulong_t shm_ctime_high;
|
||||
compat_pid_t shm_cpid;
|
||||
compat_pid_t shm_lpid;
|
||||
compat_ulong_t shm_nattch;
|
||||
|
|
|
@ -2,5 +2,9 @@
|
|||
include include/uapi/asm-generic/Kbuild.asm
|
||||
|
||||
generic-y += bpf_perf_event.h
|
||||
generic-y += ipcbuf.h
|
||||
generic-y += kvm_para.h
|
||||
generic-y += msgbuf.h
|
||||
generic-y += poll.h
|
||||
generic-y += sembuf.h
|
||||
generic-y += shmbuf.h
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#include <asm-generic/ipcbuf.h>
|
|
@ -1,28 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ASM_IA64_MSGBUF_H
|
||||
#define _ASM_IA64_MSGBUF_H
|
||||
|
||||
/*
|
||||
* The msqid64_ds structure for IA-64 architecture.
|
||||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 2 miscellaneous 64-bit values
|
||||
*/
|
||||
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
__kernel_pid_t msg_lspid; /* pid of last msgsnd */
|
||||
__kernel_pid_t msg_lrpid; /* last receive pid */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
|
||||
#endif /* _ASM_IA64_MSGBUF_H */
|
|
@ -1,23 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ASM_IA64_SEMBUF_H
|
||||
#define _ASM_IA64_SEMBUF_H
|
||||
|
||||
/*
|
||||
* The semid64_ds structure for IA-64 architecture.
|
||||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 2 miscellaneous 64-bit values
|
||||
*/
|
||||
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
|
||||
#endif /* _ASM_IA64_SEMBUF_H */
|
|
@ -1,39 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ASM_IA64_SHMBUF_H
|
||||
#define _ASM_IA64_SHMBUF_H
|
||||
|
||||
/*
|
||||
* The shmid64_ds structure for IA-64 architecture.
|
||||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 2 miscellaneous 64-bit values
|
||||
*/
|
||||
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
__kernel_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_pid_t shm_lpid; /* pid of last operator */
|
||||
unsigned long shm_nattch; /* no. of current attaches */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
|
||||
struct shminfo64 {
|
||||
unsigned long shmmax;
|
||||
unsigned long shmmin;
|
||||
unsigned long shmmni;
|
||||
unsigned long shmseg;
|
||||
unsigned long shmall;
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
unsigned long __unused3;
|
||||
unsigned long __unused4;
|
||||
};
|
||||
|
||||
#endif /* _ASM_IA64_SHMBUF_H */
|
|
@ -37,9 +37,11 @@ typedef struct {
|
|||
typedef s32 compat_timer_t;
|
||||
typedef s32 compat_key_t;
|
||||
|
||||
typedef s16 compat_short_t;
|
||||
typedef s32 compat_int_t;
|
||||
typedef s32 compat_long_t;
|
||||
typedef s64 compat_s64;
|
||||
typedef u16 compat_ushort_t;
|
||||
typedef u32 compat_uint_t;
|
||||
typedef u32 compat_ulong_t;
|
||||
typedef u64 compat_u64;
|
||||
|
@ -157,35 +159,35 @@ struct compat_ipc64_perm {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
compat_time_t sem_otime;
|
||||
compat_time_t sem_ctime;
|
||||
compat_ulong_t sem_otime;
|
||||
compat_ulong_t sem_ctime;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t __unused2;
|
||||
compat_ulong_t sem_otime_high;
|
||||
compat_ulong_t sem_ctime_high;
|
||||
};
|
||||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
#ifndef CONFIG_CPU_LITTLE_ENDIAN
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t msg_stime_high;
|
||||
#endif
|
||||
compat_time_t msg_stime;
|
||||
compat_ulong_t msg_stime;
|
||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t msg_stime_high;
|
||||
#endif
|
||||
#ifndef CONFIG_CPU_LITTLE_ENDIAN
|
||||
compat_ulong_t __unused2;
|
||||
compat_ulong_t msg_rtime_high;
|
||||
#endif
|
||||
compat_time_t msg_rtime;
|
||||
compat_ulong_t msg_rtime;
|
||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
compat_ulong_t __unused2;
|
||||
compat_ulong_t msg_rtime_high;
|
||||
#endif
|
||||
#ifndef CONFIG_CPU_LITTLE_ENDIAN
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t msg_ctime_high;
|
||||
#endif
|
||||
compat_time_t msg_ctime;
|
||||
compat_ulong_t msg_ctime;
|
||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t msg_ctime_high;
|
||||
#endif
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
|
@ -199,14 +201,16 @@ struct compat_msqid64_ds {
|
|||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
compat_size_t shm_segsz;
|
||||
compat_time_t shm_atime;
|
||||
compat_time_t shm_dtime;
|
||||
compat_time_t shm_ctime;
|
||||
compat_ulong_t shm_atime;
|
||||
compat_ulong_t shm_dtime;
|
||||
compat_ulong_t shm_ctime;
|
||||
compat_pid_t shm_cpid;
|
||||
compat_pid_t shm_lpid;
|
||||
compat_ulong_t shm_nattch;
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t __unused2;
|
||||
compat_ushort_t shm_atime_high;
|
||||
compat_ushort_t shm_dtime_high;
|
||||
compat_ushort_t shm_ctime_high;
|
||||
compat_ushort_t __unused2;
|
||||
};
|
||||
|
||||
/* MIPS has unusual order of fields in stack_t */
|
||||
|
|
|
@ -9,33 +9,15 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - extension of time_t to 64-bit on 32-bitsystem to solve the y2038 problem
|
||||
* - 2 miscellaneous unsigned long values
|
||||
*/
|
||||
|
||||
#if defined(__mips64)
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#if !defined(__mips64) && defined(__MIPSEB__)
|
||||
unsigned long __unused1;
|
||||
#endif
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
#if !defined(__mips64) && defined(__MIPSEL__)
|
||||
unsigned long __unused1;
|
||||
#endif
|
||||
#if !defined(__mips64) && defined(__MIPSEB__)
|
||||
unsigned long __unused2;
|
||||
#endif
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
#if !defined(__mips64) && defined(__MIPSEL__)
|
||||
unsigned long __unused2;
|
||||
#endif
|
||||
#if !defined(__mips64) && defined(__MIPSEB__)
|
||||
unsigned long __unused3;
|
||||
#endif
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
#if !defined(__mips64) && defined(__MIPSEL__)
|
||||
unsigned long __unused3;
|
||||
#endif
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
|
@ -44,5 +26,42 @@ struct msqid64_ds {
|
|||
unsigned long __unused4;
|
||||
unsigned long __unused5;
|
||||
};
|
||||
#elif defined (__MIPSEB__)
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
unsigned long msg_rtime_high;
|
||||
unsigned long msg_rtime; /* last msgrcv time */
|
||||
unsigned long msg_ctime_high;
|
||||
unsigned long msg_ctime; /* last change time */
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
__kernel_pid_t msg_lspid; /* pid of last msgsnd */
|
||||
__kernel_pid_t msg_lrpid; /* last receive pid */
|
||||
unsigned long __unused4;
|
||||
unsigned long __unused5;
|
||||
};
|
||||
#elif defined (__MIPSEL__)
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_rtime; /* last msgrcv time */
|
||||
unsigned long msg_rtime_high;
|
||||
unsigned long msg_ctime; /* last change time */
|
||||
unsigned long msg_ctime_high;
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
__kernel_pid_t msg_lspid; /* pid of last msgsnd */
|
||||
__kernel_pid_t msg_lrpid; /* last receive pid */
|
||||
unsigned long __unused4;
|
||||
unsigned long __unused5;
|
||||
};
|
||||
#else
|
||||
#warning no endianess set
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_MSGBUF_H */
|
||||
|
|
|
@ -7,10 +7,11 @@
|
|||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 2 miscellaneous 64-bit values
|
||||
* Pad space is left for 2 miscellaneous 64-bit values on mips64,
|
||||
* but used for the upper 32 bit of the time values on mips32.
|
||||
*/
|
||||
|
||||
#ifdef __mips64
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
|
@ -19,5 +20,15 @@ struct semid64_ds {
|
|||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
#else
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
unsigned long sem_ctime; /* last change time */
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long sem_otime_high;
|
||||
unsigned long sem_ctime_high;
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_SEMBUF_H */
|
||||
|
|
|
@ -7,10 +7,13 @@
|
|||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 2 miscellaneous 32-bit rsp. 64-bit values
|
||||
* As MIPS was lacking proper padding after shm_?time, we use 48 bits
|
||||
* of the padding at the end to store a few additional bits of the time.
|
||||
* libc implementations need to take care to convert this into a proper
|
||||
* data structure when moving to 64-bit time_t.
|
||||
*/
|
||||
|
||||
#ifdef __mips64
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
|
@ -23,6 +26,22 @@ struct shmid64_ds {
|
|||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
#else
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
unsigned long shm_atime; /* last attach time */
|
||||
unsigned long shm_dtime; /* last detach time */
|
||||
unsigned long shm_ctime; /* last change time */
|
||||
__kernel_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_pid_t shm_lpid; /* pid of last operator */
|
||||
unsigned long shm_nattch; /* no. of current attaches */
|
||||
unsigned short shm_atime_high;
|
||||
unsigned short shm_dtime_high;
|
||||
unsigned short shm_ctime_high;
|
||||
unsigned short __unused1;
|
||||
};
|
||||
#endif
|
||||
|
||||
struct shminfo64 {
|
||||
unsigned long shmmax;
|
||||
|
|
|
@ -138,10 +138,10 @@ struct compat_ipc64_perm {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
unsigned int __unused1;
|
||||
compat_time_t sem_otime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t sem_ctime;
|
||||
unsigned int sem_otime_high;
|
||||
unsigned int sem_otime;
|
||||
unsigned int sem_ctime_high;
|
||||
unsigned int sem_ctime;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t __unused4;
|
||||
|
@ -149,12 +149,12 @@ struct compat_semid64_ds {
|
|||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
unsigned int __unused1;
|
||||
compat_time_t msg_stime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t msg_rtime;
|
||||
unsigned int __unused3;
|
||||
compat_time_t msg_ctime;
|
||||
unsigned int msg_stime_high;
|
||||
unsigned int msg_stime;
|
||||
unsigned int msg_rtime_high;
|
||||
unsigned int msg_rtime;
|
||||
unsigned int msg_ctime_high;
|
||||
unsigned int msg_ctime;
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
compat_ulong_t msg_qbytes;
|
||||
|
@ -166,12 +166,12 @@ struct compat_msqid64_ds {
|
|||
|
||||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
unsigned int __unused1;
|
||||
compat_time_t shm_atime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t shm_dtime;
|
||||
unsigned int __unused3;
|
||||
compat_time_t shm_ctime;
|
||||
unsigned int shm_atime_high;
|
||||
unsigned int shm_atime;
|
||||
unsigned int shm_dtime_high;
|
||||
unsigned int shm_dtime;
|
||||
unsigned int shm_ctime_high;
|
||||
unsigned int shm_ctime;
|
||||
unsigned int __unused4;
|
||||
compat_size_t shm_segsz;
|
||||
compat_pid_t shm_cpid;
|
||||
|
|
|
@ -10,31 +10,30 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad1;
|
||||
#endif
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad2;
|
||||
#endif
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad3;
|
||||
#endif
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
__kernel_pid_t msg_lspid; /* pid of last msgsnd */
|
||||
__kernel_pid_t msg_lrpid; /* last receive pid */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
#else
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
unsigned long msg_rtime_high;
|
||||
unsigned long msg_rtime; /* last msgrcv time */
|
||||
unsigned long msg_ctime_high;
|
||||
unsigned long msg_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
__kernel_pid_t msg_lspid; /* pid of last msgsnd */
|
||||
__kernel_pid_t msg_lrpid; /* last receive pid */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
|
||||
#endif /* _PARISC_MSGBUF_H */
|
||||
|
|
|
@ -10,21 +10,21 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad1;
|
||||
#endif
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad2;
|
||||
#endif
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
#else
|
||||
unsigned long sem_otime_high;
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
unsigned long sem_ctime_high;
|
||||
unsigned long sem_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
|
|
|
@ -10,25 +10,22 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad1;
|
||||
#endif
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad2;
|
||||
#endif
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned int __pad3;
|
||||
#endif
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
#else
|
||||
unsigned long shm_atime_high;
|
||||
unsigned long shm_atime; /* last attach time */
|
||||
unsigned long shm_dtime_high;
|
||||
unsigned long shm_dtime; /* last detach time */
|
||||
unsigned long shm_ctime_high;
|
||||
unsigned long shm_ctime; /* last change time */
|
||||
unsigned int __pad4;
|
||||
#endif
|
||||
__kernel_size_t shm_segsz; /* size of segment (bytes) */
|
||||
|
|
|
@ -162,10 +162,10 @@ struct compat_ipc64_perm {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
unsigned int __unused1;
|
||||
compat_time_t sem_otime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t sem_ctime;
|
||||
unsigned int sem_otime_high;
|
||||
unsigned int sem_otime;
|
||||
unsigned int sem_ctime_high;
|
||||
unsigned int sem_ctime;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t __unused4;
|
||||
|
@ -173,12 +173,12 @@ struct compat_semid64_ds {
|
|||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
unsigned int __unused1;
|
||||
compat_time_t msg_stime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t msg_rtime;
|
||||
unsigned int __unused3;
|
||||
compat_time_t msg_ctime;
|
||||
unsigned int msg_stime_high;
|
||||
unsigned int msg_stime;
|
||||
unsigned int msg_rtime_high;
|
||||
unsigned int msg_rtime;
|
||||
unsigned int msg_ctime_high;
|
||||
unsigned int msg_ctime;
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
compat_ulong_t msg_qbytes;
|
||||
|
@ -190,12 +190,12 @@ struct compat_msqid64_ds {
|
|||
|
||||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
unsigned int __unused1;
|
||||
compat_time_t shm_atime;
|
||||
unsigned int __unused2;
|
||||
compat_time_t shm_dtime;
|
||||
unsigned int __unused3;
|
||||
compat_time_t shm_ctime;
|
||||
unsigned int shm_atime_high;
|
||||
unsigned int shm_atime;
|
||||
unsigned int shm_dtime_high;
|
||||
unsigned int shm_dtime;
|
||||
unsigned int shm_ctime_high;
|
||||
unsigned int shm_ctime;
|
||||
unsigned int __unused4;
|
||||
compat_size_t shm_segsz;
|
||||
compat_pid_t shm_cpid;
|
||||
|
|
|
@ -10,18 +10,18 @@
|
|||
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#ifndef __powerpc64__
|
||||
unsigned int __unused1;
|
||||
#endif
|
||||
#ifdef __powerpc64__
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
#ifndef __powerpc64__
|
||||
unsigned int __unused2;
|
||||
#endif
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
#ifndef __powerpc64__
|
||||
unsigned int __unused3;
|
||||
#endif
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
unsigned long msg_rtime_high;
|
||||
unsigned long msg_rtime; /* last msgrcv time */
|
||||
unsigned long msg_ctime_high;
|
||||
unsigned long msg_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
|
|
|
@ -15,20 +15,20 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
* - 2 miscellaneous 32/64-bit values
|
||||
*/
|
||||
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
#ifndef __powerpc64__
|
||||
unsigned long __unused1;
|
||||
#endif
|
||||
unsigned long sem_otime_high;
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
unsigned long sem_ctime_high;
|
||||
unsigned long sem_ctime; /* last change time */
|
||||
#else
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
#ifndef __powerpc64__
|
||||
unsigned long __unused2;
|
||||
#endif
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused3;
|
||||
unsigned long __unused4;
|
||||
|
|
|
@ -16,25 +16,22 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
#ifndef __powerpc64__
|
||||
unsigned long __unused1;
|
||||
#endif
|
||||
#ifdef __powerpc64__
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
#ifndef __powerpc64__
|
||||
unsigned long __unused2;
|
||||
#endif
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
#ifndef __powerpc64__
|
||||
unsigned long __unused3;
|
||||
#endif
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
#ifndef __powerpc64__
|
||||
#else
|
||||
unsigned long shm_atime_high;
|
||||
unsigned long shm_atime; /* last attach time */
|
||||
unsigned long shm_dtime_high;
|
||||
unsigned long shm_dtime; /* last detach time */
|
||||
unsigned long shm_ctime_high;
|
||||
unsigned long shm_ctime; /* last change time */
|
||||
unsigned long __unused4;
|
||||
#endif
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
|
|
|
@ -232,10 +232,10 @@ struct compat_ipc64_perm {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
compat_time_t sem_otime;
|
||||
compat_ulong_t __pad1;
|
||||
compat_time_t sem_ctime;
|
||||
compat_ulong_t __pad2;
|
||||
compat_ulong_t sem_otime;
|
||||
compat_ulong_t sem_otime_high;
|
||||
compat_ulong_t sem_ctime;
|
||||
compat_ulong_t sem_ctime_high;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused1;
|
||||
compat_ulong_t __unused2;
|
||||
|
@ -243,12 +243,12 @@ struct compat_semid64_ds {
|
|||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
compat_time_t msg_stime;
|
||||
compat_ulong_t __pad1;
|
||||
compat_time_t msg_rtime;
|
||||
compat_ulong_t __pad2;
|
||||
compat_time_t msg_ctime;
|
||||
compat_ulong_t __pad3;
|
||||
compat_ulong_t msg_stime;
|
||||
compat_ulong_t msg_stime_high;
|
||||
compat_ulong_t msg_rtime;
|
||||
compat_ulong_t msg_rtime_high;
|
||||
compat_ulong_t msg_ctime;
|
||||
compat_ulong_t msg_ctime_high;
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
compat_ulong_t msg_qbytes;
|
||||
|
@ -261,12 +261,12 @@ struct compat_msqid64_ds {
|
|||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
compat_size_t shm_segsz;
|
||||
compat_time_t shm_atime;
|
||||
compat_ulong_t __pad1;
|
||||
compat_time_t shm_dtime;
|
||||
compat_ulong_t __pad2;
|
||||
compat_time_t shm_ctime;
|
||||
compat_ulong_t __pad3;
|
||||
compat_ulong_t shm_atime;
|
||||
compat_ulong_t shm_atime_high;
|
||||
compat_ulong_t shm_dtime;
|
||||
compat_ulong_t shm_dtime_high;
|
||||
compat_ulong_t shm_ctime;
|
||||
compat_ulong_t shm_ctime_high;
|
||||
compat_pid_t shm_cpid;
|
||||
compat_pid_t shm_lpid;
|
||||
compat_ulong_t shm_nattch;
|
||||
|
|
|
@ -9,9 +9,12 @@ generic-y += errno.h
|
|||
generic-y += fcntl.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += mman.h
|
||||
generic-y += msgbuf.h
|
||||
generic-y += param.h
|
||||
generic-y += poll.h
|
||||
generic-y += resource.h
|
||||
generic-y += sembuf.h
|
||||
generic-y += shmbuf.h
|
||||
generic-y += sockios.h
|
||||
generic-y += swab.h
|
||||
generic-y += termbits.h
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _S390_MSGBUF_H
|
||||
#define _S390_MSGBUF_H
|
||||
|
||||
/*
|
||||
* The msqid64_ds structure for S/390 architecture.
|
||||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
#ifndef __s390x__
|
||||
unsigned long __unused1;
|
||||
#endif /* ! __s390x__ */
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
#ifndef __s390x__
|
||||
unsigned long __unused2;
|
||||
#endif /* ! __s390x__ */
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
#ifndef __s390x__
|
||||
unsigned long __unused3;
|
||||
#endif /* ! __s390x__ */
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
__kernel_pid_t msg_lspid; /* pid of last msgsnd */
|
||||
__kernel_pid_t msg_lrpid; /* last receive pid */
|
||||
unsigned long __unused4;
|
||||
unsigned long __unused5;
|
||||
};
|
||||
|
||||
#endif /* _S390_MSGBUF_H */
|
|
@ -1,30 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _S390_SEMBUF_H
|
||||
#define _S390_SEMBUF_H
|
||||
|
||||
/*
|
||||
* The semid64_ds structure for S/390 architecture.
|
||||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem (for !__s390x__)
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
#ifndef __s390x__
|
||||
unsigned long __unused1;
|
||||
#endif /* ! __s390x__ */
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
#ifndef __s390x__
|
||||
unsigned long __unused2;
|
||||
#endif /* ! __s390x__ */
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused3;
|
||||
unsigned long __unused4;
|
||||
};
|
||||
|
||||
#endif /* _S390_SEMBUF_H */
|
|
@ -1,49 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _S390_SHMBUF_H
|
||||
#define _S390_SHMBUF_H
|
||||
|
||||
/*
|
||||
* The shmid64_ds structure for S/390 architecture.
|
||||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem (for !__s390x__)
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
#ifndef __s390x__
|
||||
unsigned long __unused1;
|
||||
#endif /* ! __s390x__ */
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
#ifndef __s390x__
|
||||
unsigned long __unused2;
|
||||
#endif /* ! __s390x__ */
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
#ifndef __s390x__
|
||||
unsigned long __unused3;
|
||||
#endif /* ! __s390x__ */
|
||||
__kernel_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_pid_t shm_lpid; /* pid of last operator */
|
||||
unsigned long shm_nattch; /* no. of current attaches */
|
||||
unsigned long __unused4;
|
||||
unsigned long __unused5;
|
||||
};
|
||||
|
||||
struct shminfo64 {
|
||||
unsigned long shmmax;
|
||||
unsigned long shmmin;
|
||||
unsigned long shmmni;
|
||||
unsigned long shmseg;
|
||||
unsigned long shmall;
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
unsigned long __unused3;
|
||||
unsigned long __unused4;
|
||||
};
|
||||
|
||||
#endif /* _S390_SHMBUF_H */
|
|
@ -192,10 +192,10 @@ struct compat_ipc64_perm {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
unsigned int __pad1;
|
||||
compat_time_t sem_otime;
|
||||
unsigned int __pad2;
|
||||
compat_time_t sem_ctime;
|
||||
unsigned int sem_otime_high;
|
||||
unsigned int sem_otime;
|
||||
unsigned int sem_ctime_high;
|
||||
unsigned int sem_ctime;
|
||||
u32 sem_nsems;
|
||||
u32 __unused1;
|
||||
u32 __unused2;
|
||||
|
@ -203,12 +203,12 @@ struct compat_semid64_ds {
|
|||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
unsigned int __pad1;
|
||||
compat_time_t msg_stime;
|
||||
unsigned int __pad2;
|
||||
compat_time_t msg_rtime;
|
||||
unsigned int __pad3;
|
||||
compat_time_t msg_ctime;
|
||||
unsigned int msg_stime_high;
|
||||
unsigned int msg_stime;
|
||||
unsigned int msg_rtime_high;
|
||||
unsigned int msg_rtime;
|
||||
unsigned int msg_ctime_high;
|
||||
unsigned int msg_ctime;
|
||||
unsigned int msg_cbytes;
|
||||
unsigned int msg_qnum;
|
||||
unsigned int msg_qbytes;
|
||||
|
@ -220,12 +220,12 @@ struct compat_msqid64_ds {
|
|||
|
||||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
unsigned int __pad1;
|
||||
compat_time_t shm_atime;
|
||||
unsigned int __pad2;
|
||||
compat_time_t shm_dtime;
|
||||
unsigned int __pad3;
|
||||
compat_time_t shm_ctime;
|
||||
unsigned int shm_atime_high;
|
||||
unsigned int shm_atime;
|
||||
unsigned int shm_dtime_high;
|
||||
unsigned int shm_dtime;
|
||||
unsigned int shm_ctime_high;
|
||||
unsigned int shm_ctime;
|
||||
compat_size_t shm_segsz;
|
||||
compat_pid_t shm_cpid;
|
||||
compat_pid_t shm_lpid;
|
||||
|
|
|
@ -8,25 +8,22 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
# define PADDING(x)
|
||||
#else
|
||||
# define PADDING(x) unsigned int x;
|
||||
#endif
|
||||
|
||||
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
PADDING(__pad1)
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
PADDING(__pad2)
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
PADDING(__pad3)
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
unsigned long msg_rtime_high;
|
||||
unsigned long msg_rtime; /* last msgrcv time */
|
||||
unsigned long msg_ctime_high;
|
||||
unsigned long msg_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
|
@ -35,5 +32,4 @@ struct msqid64_ds {
|
|||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
#undef PADDING
|
||||
#endif /* _SPARC_MSGBUF_H */
|
||||
|
|
|
@ -8,25 +8,23 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
# define PADDING(x)
|
||||
#else
|
||||
# define PADDING(x) unsigned int x;
|
||||
#endif
|
||||
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
PADDING(__pad1)
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
PADDING(__pad2)
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long sem_otime_high;
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
unsigned long sem_ctime_high;
|
||||
unsigned long sem_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
};
|
||||
#undef PADDING
|
||||
|
||||
#endif /* _SPARC64_SEMBUF_H */
|
||||
|
|
|
@ -8,24 +8,23 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
# define PADDING(x)
|
||||
#else
|
||||
# define PADDING(x) unsigned int x;
|
||||
#endif
|
||||
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
PADDING(__pad1)
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
PADDING(__pad2)
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
PADDING(__pad3)
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long shm_atime_high;
|
||||
unsigned long shm_atime; /* last attach time */
|
||||
unsigned long shm_dtime_high;
|
||||
unsigned long shm_dtime; /* last detach time */
|
||||
unsigned long shm_ctime_high;
|
||||
unsigned long shm_ctime; /* last change time */
|
||||
#endif
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
__kernel_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_pid_t shm_lpid; /* pid of last operator */
|
||||
|
@ -46,6 +45,4 @@ struct shminfo64 {
|
|||
unsigned long __unused4;
|
||||
};
|
||||
|
||||
#undef PADDING
|
||||
|
||||
#endif /* _SPARC_SHMBUF_H */
|
||||
|
|
|
@ -134,10 +134,10 @@ struct compat_ipc64_perm {
|
|||
|
||||
struct compat_semid64_ds {
|
||||
struct compat_ipc64_perm sem_perm;
|
||||
compat_time_t sem_otime;
|
||||
compat_ulong_t __unused1;
|
||||
compat_time_t sem_ctime;
|
||||
compat_ulong_t __unused2;
|
||||
compat_ulong_t sem_otime;
|
||||
compat_ulong_t sem_otime_high;
|
||||
compat_ulong_t sem_ctime;
|
||||
compat_ulong_t sem_ctime_high;
|
||||
compat_ulong_t sem_nsems;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t __unused4;
|
||||
|
@ -145,12 +145,12 @@ struct compat_semid64_ds {
|
|||
|
||||
struct compat_msqid64_ds {
|
||||
struct compat_ipc64_perm msg_perm;
|
||||
compat_time_t msg_stime;
|
||||
compat_ulong_t __unused1;
|
||||
compat_time_t msg_rtime;
|
||||
compat_ulong_t __unused2;
|
||||
compat_time_t msg_ctime;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t msg_stime;
|
||||
compat_ulong_t msg_stime_high;
|
||||
compat_ulong_t msg_rtime;
|
||||
compat_ulong_t msg_rtime_high;
|
||||
compat_ulong_t msg_ctime;
|
||||
compat_ulong_t msg_ctime_high;
|
||||
compat_ulong_t msg_cbytes;
|
||||
compat_ulong_t msg_qnum;
|
||||
compat_ulong_t msg_qbytes;
|
||||
|
@ -163,12 +163,12 @@ struct compat_msqid64_ds {
|
|||
struct compat_shmid64_ds {
|
||||
struct compat_ipc64_perm shm_perm;
|
||||
compat_size_t shm_segsz;
|
||||
compat_time_t shm_atime;
|
||||
compat_ulong_t __unused1;
|
||||
compat_time_t shm_dtime;
|
||||
compat_ulong_t __unused2;
|
||||
compat_time_t shm_ctime;
|
||||
compat_ulong_t __unused3;
|
||||
compat_ulong_t shm_atime;
|
||||
compat_ulong_t shm_atime_high;
|
||||
compat_ulong_t shm_dtime;
|
||||
compat_ulong_t shm_dtime_high;
|
||||
compat_ulong_t shm_ctime;
|
||||
compat_ulong_t shm_ctime_high;
|
||||
compat_pid_t shm_cpid;
|
||||
compat_pid_t shm_lpid;
|
||||
compat_ulong_t shm_nattch;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
extern unsigned char vrtc_cmos_read(unsigned char reg);
|
||||
extern void vrtc_cmos_write(unsigned char val, unsigned char reg);
|
||||
extern void vrtc_get_time(struct timespec *now);
|
||||
extern int vrtc_set_mmss(const struct timespec *now);
|
||||
extern void vrtc_get_time(struct timespec64 *now);
|
||||
extern int vrtc_set_mmss(const struct timespec64 *now);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -95,8 +95,8 @@ static inline unsigned char current_lock_cmos_reg(void)
|
|||
unsigned char rtc_cmos_read(unsigned char addr);
|
||||
void rtc_cmos_write(unsigned char val, unsigned char addr);
|
||||
|
||||
extern int mach_set_rtc_mmss(const struct timespec *now);
|
||||
extern void mach_get_cmos_time(struct timespec *now);
|
||||
extern int mach_set_rtc_mmss(const struct timespec64 *now);
|
||||
extern void mach_get_cmos_time(struct timespec64 *now);
|
||||
|
||||
#define RTC_IRQ 8
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ void pvclock_set_flags(u8 flags);
|
|||
unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src);
|
||||
void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
|
||||
struct pvclock_vcpu_time_info *vcpu,
|
||||
struct timespec *ts);
|
||||
struct timespec64 *ts);
|
||||
void pvclock_resume(void);
|
||||
|
||||
void pvclock_touch_watchdogs(void);
|
||||
|
|
|
@ -170,7 +170,7 @@ struct x86_cpuinit_ops {
|
|||
void (*fixup_cpu_id)(struct cpuinfo_x86 *c, int node);
|
||||
};
|
||||
|
||||
struct timespec;
|
||||
struct timespec64;
|
||||
|
||||
/**
|
||||
* struct x86_legacy_devices - legacy x86 devices
|
||||
|
@ -264,8 +264,8 @@ struct x86_hyper_runtime {
|
|||
struct x86_platform_ops {
|
||||
unsigned long (*calibrate_cpu)(void);
|
||||
unsigned long (*calibrate_tsc)(void);
|
||||
void (*get_wallclock)(struct timespec *ts);
|
||||
int (*set_wallclock)(const struct timespec *ts);
|
||||
void (*get_wallclock)(struct timespec64 *ts);
|
||||
int (*set_wallclock)(const struct timespec64 *ts);
|
||||
void (*iommu_shutdown)(void);
|
||||
bool (*is_untracked_pat_range)(u64 start, u64 end);
|
||||
void (*nmi_init)(void);
|
||||
|
|
|
@ -8,15 +8,24 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*
|
||||
* x86_64 and x32 incorrectly added padding here, so the structures
|
||||
* are still incompatible with the padding on x86.
|
||||
*/
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
#ifdef __i386__
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
unsigned long sem_otime_high;
|
||||
unsigned long sem_ctime; /* last change time */
|
||||
unsigned long sem_ctime_high;
|
||||
#else
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
__kernel_ulong_t __unused1;
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
__kernel_ulong_t __unused2;
|
||||
#endif
|
||||
__kernel_ulong_t sem_nsems; /* no. of semaphores in array */
|
||||
__kernel_ulong_t __unused3;
|
||||
__kernel_ulong_t __unused4;
|
||||
|
|
|
@ -37,7 +37,7 @@ static uint32_t __init jailhouse_detect(void)
|
|||
return jailhouse_cpuid_base();
|
||||
}
|
||||
|
||||
static void jailhouse_get_wallclock(struct timespec *now)
|
||||
static void jailhouse_get_wallclock(struct timespec64 *now)
|
||||
{
|
||||
memset(now, 0, sizeof(*now));
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@ static struct pvclock_wall_clock *wall_clock;
|
|||
* have elapsed since the hypervisor wrote the data. So we try to account for
|
||||
* that with system time
|
||||
*/
|
||||
static void kvm_get_wallclock(struct timespec *now)
|
||||
static void kvm_get_wallclock(struct timespec64 *now)
|
||||
{
|
||||
struct pvclock_vcpu_time_info *vcpu_time;
|
||||
int low, high;
|
||||
|
@ -72,7 +72,7 @@ static void kvm_get_wallclock(struct timespec *now)
|
|||
put_cpu();
|
||||
}
|
||||
|
||||
static int kvm_set_wallclock(const struct timespec *now)
|
||||
static int kvm_set_wallclock(const struct timespec64 *now)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
|
@ -123,28 +123,35 @@ u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
|
|||
|
||||
void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock,
|
||||
struct pvclock_vcpu_time_info *vcpu_time,
|
||||
struct timespec *ts)
|
||||
struct timespec64 *ts)
|
||||
{
|
||||
u32 version;
|
||||
u64 delta;
|
||||
struct timespec now;
|
||||
struct timespec64 now;
|
||||
|
||||
/* get wallclock at system boot */
|
||||
do {
|
||||
version = wall_clock->version;
|
||||
rmb(); /* fetch version before time */
|
||||
/*
|
||||
* Note: wall_clock->sec is a u32 value, so it can
|
||||
* only store dates between 1970 and 2106. To allow
|
||||
* times beyond that, we need to create a new hypercall
|
||||
* interface with an extended pvclock_wall_clock structure
|
||||
* like ARM has.
|
||||
*/
|
||||
now.tv_sec = wall_clock->sec;
|
||||
now.tv_nsec = wall_clock->nsec;
|
||||
rmb(); /* fetch time before checking version */
|
||||
} while ((wall_clock->version & 1) || (version != wall_clock->version));
|
||||
|
||||
delta = pvclock_clocksource_read(vcpu_time); /* time since system boot */
|
||||
delta += now.tv_sec * (u64)NSEC_PER_SEC + now.tv_nsec;
|
||||
delta += now.tv_sec * NSEC_PER_SEC + now.tv_nsec;
|
||||
|
||||
now.tv_nsec = do_div(delta, NSEC_PER_SEC);
|
||||
now.tv_sec = delta;
|
||||
|
||||
set_normalized_timespec(ts, now.tv_sec, now.tv_nsec);
|
||||
set_normalized_timespec64(ts, now.tv_sec, now.tv_nsec);
|
||||
}
|
||||
|
||||
void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti)
|
||||
|
|
|
@ -39,7 +39,7 @@ EXPORT_SYMBOL(rtc_lock);
|
|||
* jump to the next second precisely 500 ms later. Check the Motorola
|
||||
* MC146818A or Dallas DS12887 data sheet for details.
|
||||
*/
|
||||
int mach_set_rtc_mmss(const struct timespec *now)
|
||||
int mach_set_rtc_mmss(const struct timespec64 *now)
|
||||
{
|
||||
unsigned long long nowtime = now->tv_sec;
|
||||
struct rtc_time tm;
|
||||
|
@ -60,7 +60,7 @@ int mach_set_rtc_mmss(const struct timespec *now)
|
|||
return retval;
|
||||
}
|
||||
|
||||
void mach_get_cmos_time(struct timespec *now)
|
||||
void mach_get_cmos_time(struct timespec64 *now)
|
||||
{
|
||||
unsigned int status, year, mon, day, hour, min, sec, century = 0;
|
||||
unsigned long flags;
|
||||
|
@ -118,7 +118,7 @@ void mach_get_cmos_time(struct timespec *now)
|
|||
} else
|
||||
year += CMOS_YEARS_OFFS;
|
||||
|
||||
now->tv_sec = mktime(year, mon, day, hour, min, sec);
|
||||
now->tv_sec = mktime64(year, mon, day, hour, min, sec);
|
||||
now->tv_nsec = 0;
|
||||
}
|
||||
|
||||
|
@ -145,13 +145,13 @@ void rtc_cmos_write(unsigned char val, unsigned char addr)
|
|||
}
|
||||
EXPORT_SYMBOL(rtc_cmos_write);
|
||||
|
||||
int update_persistent_clock(struct timespec now)
|
||||
int update_persistent_clock64(struct timespec64 now)
|
||||
{
|
||||
return x86_platform.set_wallclock(&now);
|
||||
}
|
||||
|
||||
/* not static: needed by APM */
|
||||
void read_persistent_clock(struct timespec *ts)
|
||||
void read_persistent_clock64(struct timespec64 *ts)
|
||||
{
|
||||
x86_platform.get_wallclock(ts);
|
||||
}
|
||||
|
|
|
@ -57,7 +57,7 @@ void vrtc_cmos_write(unsigned char val, unsigned char reg)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(vrtc_cmos_write);
|
||||
|
||||
void vrtc_get_time(struct timespec *now)
|
||||
void vrtc_get_time(struct timespec64 *now)
|
||||
{
|
||||
u8 sec, min, hour, mday, mon;
|
||||
unsigned long flags;
|
||||
|
@ -83,18 +83,18 @@ void vrtc_get_time(struct timespec *now)
|
|||
pr_info("vRTC: sec: %d min: %d hour: %d day: %d "
|
||||
"mon: %d year: %d\n", sec, min, hour, mday, mon, year);
|
||||
|
||||
now->tv_sec = mktime(year, mon, mday, hour, min, sec);
|
||||
now->tv_sec = mktime64(year, mon, mday, hour, min, sec);
|
||||
now->tv_nsec = 0;
|
||||
}
|
||||
|
||||
int vrtc_set_mmss(const struct timespec *now)
|
||||
int vrtc_set_mmss(const struct timespec64 *now)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct rtc_time tm;
|
||||
int year;
|
||||
int retval = 0;
|
||||
|
||||
rtc_time_to_tm(now->tv_sec, &tm);
|
||||
rtc_time64_to_tm(now->tv_sec, &tm);
|
||||
if (!rtc_valid_tm(&tm) && tm.tm_year >= 72) {
|
||||
/*
|
||||
* tm.year is the number of years since 1900, and the
|
||||
|
@ -110,8 +110,8 @@ int vrtc_set_mmss(const struct timespec *now)
|
|||
vrtc_cmos_write(tm.tm_sec, RTC_SECONDS);
|
||||
spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
} else {
|
||||
pr_err("%s: Invalid vRTC value: write of %lx to vRTC failed\n",
|
||||
__func__, now->tv_sec);
|
||||
pr_err("%s: Invalid vRTC value: write of %llx to vRTC failed\n",
|
||||
__func__, (s64)now->tv_sec);
|
||||
retval = -EINVAL;
|
||||
}
|
||||
return retval;
|
||||
|
|
|
@ -57,7 +57,7 @@ static u64 xen_clocksource_get_cycles(struct clocksource *cs)
|
|||
return xen_clocksource_read();
|
||||
}
|
||||
|
||||
static void xen_read_wallclock(struct timespec *ts)
|
||||
static void xen_read_wallclock(struct timespec64 *ts)
|
||||
{
|
||||
struct shared_info *s = HYPERVISOR_shared_info;
|
||||
struct pvclock_wall_clock *wall_clock = &(s->wc);
|
||||
|
@ -68,12 +68,12 @@ static void xen_read_wallclock(struct timespec *ts)
|
|||
put_cpu_var(xen_vcpu);
|
||||
}
|
||||
|
||||
static void xen_get_wallclock(struct timespec *now)
|
||||
static void xen_get_wallclock(struct timespec64 *now)
|
||||
{
|
||||
xen_read_wallclock(now);
|
||||
}
|
||||
|
||||
static int xen_set_wallclock(const struct timespec *now)
|
||||
static int xen_set_wallclock(const struct timespec64 *now)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -461,7 +461,7 @@ static void __init xen_time_init(void)
|
|||
{
|
||||
struct pvclock_vcpu_time_info *pvti;
|
||||
int cpu = smp_processor_id();
|
||||
struct timespec tp;
|
||||
struct timespec64 tp;
|
||||
|
||||
/* As Dom0 is never moved, no penalty on using TSC there */
|
||||
if (xen_initial_domain())
|
||||
|
@ -479,7 +479,7 @@ static void __init xen_time_init(void)
|
|||
|
||||
/* Set initial system time with full resolution */
|
||||
xen_read_wallclock(&tp);
|
||||
do_settimeofday(&tp);
|
||||
do_settimeofday64(&tp);
|
||||
|
||||
setup_force_cpu_cap(X86_FEATURE_TSC);
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General
|
||||
|
@ -21,19 +20,19 @@
|
|||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#ifdef __XTENSA_EB__
|
||||
unsigned int __unused1;
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
unsigned int __unused2;
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
unsigned int __unused3;
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
unsigned long msg_rtime_high;
|
||||
unsigned long msg_rtime; /* last msgrcv time */
|
||||
unsigned long msg_ctime_high;
|
||||
unsigned long msg_ctime; /* last change time */
|
||||
#elif defined(__XTENSA_EL__)
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
unsigned int __unused1;
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
unsigned int __unused2;
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
unsigned int __unused3;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_rtime; /* last msgrcv time */
|
||||
unsigned long msg_rtime_high;
|
||||
unsigned long msg_ctime; /* last change time */
|
||||
unsigned long msg_ctime_high;
|
||||
#else
|
||||
# error processor byte order undefined!
|
||||
#endif
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
* between kernel and user space.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*
|
||||
*/
|
||||
|
@ -27,15 +26,15 @@
|
|||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
#ifdef __XTENSA_EL__
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
unsigned long __unused1;
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
unsigned long __unused2;
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
unsigned long sem_otime_high;
|
||||
unsigned long sem_ctime; /* last change time */
|
||||
unsigned long sem_ctime_high;
|
||||
#else
|
||||
unsigned long __unused1;
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
unsigned long __unused2;
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
unsigned long sem_otime_high;
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
unsigned long sem_ctime_high;
|
||||
unsigned long sem_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused3;
|
||||
|
|
|
@ -4,10 +4,10 @@
|
|||
*
|
||||
* The shmid64_ds structure for Xtensa architecture.
|
||||
* Note extra padding because this structure is passed back and forth
|
||||
* between kernel and user space.
|
||||
* between kernel and user space, but the padding is on the wrong
|
||||
* side for big-endian xtensa, for historic reasons.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
|
@ -20,42 +20,21 @@
|
|||
#ifndef _XTENSA_SHMBUF_H
|
||||
#define _XTENSA_SHMBUF_H
|
||||
|
||||
#if defined (__XTENSA_EL__)
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
unsigned long __unused1;
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
unsigned long __unused2;
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
unsigned long __unused3;
|
||||
unsigned long shm_atime; /* last attach time */
|
||||
unsigned long shm_atime_high;
|
||||
unsigned long shm_dtime; /* last detach time */
|
||||
unsigned long shm_dtime_high;
|
||||
unsigned long shm_ctime; /* last change time */
|
||||
unsigned long shm_ctime_high;
|
||||
__kernel_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_pid_t shm_lpid; /* pid of last operator */
|
||||
unsigned long shm_nattch; /* no. of current attaches */
|
||||
unsigned long __unused4;
|
||||
unsigned long __unused5;
|
||||
};
|
||||
#elif defined (__XTENSA_EB__)
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
unsigned long __unused1;
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
unsigned long __unused2;
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
unsigned long __unused3;
|
||||
__kernel_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_pid_t shm_lpid; /* pid of last operator */
|
||||
unsigned long shm_nattch; /* no. of current attaches */
|
||||
unsigned long __unused4;
|
||||
unsigned long __unused5;
|
||||
};
|
||||
#else
|
||||
# error endian order not defined
|
||||
#endif
|
||||
|
||||
|
||||
struct shminfo64 {
|
||||
unsigned long shmmax;
|
||||
|
|
|
@ -686,8 +686,8 @@ asmlinkage long sys_sysinfo(struct sysinfo __user *info);
|
|||
/* ipc/mqueue.c */
|
||||
asmlinkage long sys_mq_open(const char __user *name, int oflag, umode_t mode, struct mq_attr __user *attr);
|
||||
asmlinkage long sys_mq_unlink(const char __user *name);
|
||||
asmlinkage long sys_mq_timedsend(mqd_t mqdes, const char __user *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct timespec __user *abs_timeout);
|
||||
asmlinkage long sys_mq_timedreceive(mqd_t mqdes, char __user *msg_ptr, size_t msg_len, unsigned int __user *msg_prio, const struct timespec __user *abs_timeout);
|
||||
asmlinkage long sys_mq_timedsend(mqd_t mqdes, const char __user *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct __kernel_timespec __user *abs_timeout);
|
||||
asmlinkage long sys_mq_timedreceive(mqd_t mqdes, char __user *msg_ptr, size_t msg_len, unsigned int __user *msg_prio, const struct __kernel_timespec __user *abs_timeout);
|
||||
asmlinkage long sys_mq_notify(mqd_t mqdes, const struct sigevent __user *notification);
|
||||
asmlinkage long sys_mq_getsetattr(mqd_t mqdes, const struct mq_attr __user *mqstat, struct mq_attr __user *omqstat);
|
||||
|
||||
|
@ -704,7 +704,7 @@ asmlinkage long sys_semget(key_t key, int nsems, int semflg);
|
|||
asmlinkage long sys_semctl(int semid, int semnum, int cmd, unsigned long arg);
|
||||
asmlinkage long sys_semtimedop(int semid, struct sembuf __user *sops,
|
||||
unsigned nsops,
|
||||
const struct timespec __user *timeout);
|
||||
const struct __kernel_timespec __user *timeout);
|
||||
asmlinkage long sys_semop(int semid, struct sembuf __user *sops,
|
||||
unsigned nsops);
|
||||
|
||||
|
|
|
@ -18,25 +18,14 @@
|
|||
/* timespec64 is defined as timespec here */
|
||||
static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64)
|
||||
{
|
||||
return ts64;
|
||||
return *(const struct timespec *)&ts64;
|
||||
}
|
||||
|
||||
static inline struct timespec64 timespec_to_timespec64(const struct timespec ts)
|
||||
{
|
||||
return ts;
|
||||
return *(const struct timespec64 *)&ts;
|
||||
}
|
||||
|
||||
# define timespec_equal timespec64_equal
|
||||
# define timespec_compare timespec64_compare
|
||||
# define set_normalized_timespec set_normalized_timespec64
|
||||
# define timespec_add timespec64_add
|
||||
# define timespec_sub timespec64_sub
|
||||
# define timespec_valid timespec64_valid
|
||||
# define timespec_valid_strict timespec64_valid_strict
|
||||
# define timespec_to_ns timespec64_to_ns
|
||||
# define ns_to_timespec ns_to_timespec64
|
||||
# define timespec_add_ns timespec64_add_ns
|
||||
|
||||
#else
|
||||
static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64)
|
||||
{
|
||||
|
@ -55,6 +44,7 @@ static inline struct timespec64 timespec_to_timespec64(const struct timespec ts)
|
|||
ret.tv_nsec = ts.tv_nsec;
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int timespec_equal(const struct timespec *a,
|
||||
const struct timespec *b)
|
||||
|
@ -159,8 +149,6 @@ static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
|
|||
a->tv_nsec = ns;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* time_to_tm - converts the calendar time to local broken-down time
|
||||
*
|
||||
|
|
|
@ -16,11 +16,6 @@ typedef __u64 timeu64_t;
|
|||
|
||||
#include <uapi/linux/time.h>
|
||||
|
||||
#if __BITS_PER_LONG == 64
|
||||
/* this trick allows us to optimize out timespec64_to_timespec */
|
||||
# define timespec64 timespec
|
||||
#define itimerspec64 itimerspec
|
||||
#else
|
||||
struct timespec64 {
|
||||
time64_t tv_sec; /* seconds */
|
||||
long tv_nsec; /* nanoseconds */
|
||||
|
@ -31,8 +26,6 @@ struct itimerspec64 {
|
|||
struct timespec64 it_value;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* Parameters used to convert the timespec values: */
|
||||
#define MSEC_PER_SEC 1000L
|
||||
#define USEC_PER_MSEC 1000L
|
||||
|
|
|
@ -19,27 +19,25 @@ extern void xtime_update(unsigned long ticks);
|
|||
extern int do_settimeofday64(const struct timespec64 *ts);
|
||||
extern int do_sys_settimeofday64(const struct timespec64 *tv,
|
||||
const struct timezone *tz);
|
||||
/*
|
||||
* Kernel time accessors
|
||||
*/
|
||||
struct timespec64 current_kernel_time64(void);
|
||||
|
||||
/*
|
||||
* timespec64 based interfaces
|
||||
*/
|
||||
struct timespec64 get_monotonic_coarse64(void);
|
||||
extern void getrawmonotonic64(struct timespec64 *ts);
|
||||
extern void ktime_get_raw_ts64(struct timespec64 *ts);
|
||||
extern void ktime_get_ts64(struct timespec64 *ts);
|
||||
extern void ktime_get_real_ts64(struct timespec64 *tv);
|
||||
extern void ktime_get_coarse_ts64(struct timespec64 *ts);
|
||||
extern void ktime_get_coarse_real_ts64(struct timespec64 *ts);
|
||||
|
||||
void getboottime64(struct timespec64 *ts);
|
||||
|
||||
/*
|
||||
* time64_t base interfaces
|
||||
*/
|
||||
extern time64_t ktime_get_seconds(void);
|
||||
extern time64_t __ktime_get_real_seconds(void);
|
||||
extern time64_t ktime_get_real_seconds(void);
|
||||
|
||||
extern int __getnstimeofday64(struct timespec64 *tv);
|
||||
extern void getnstimeofday64(struct timespec64 *tv);
|
||||
extern void getboottime64(struct timespec64 *ts);
|
||||
|
||||
#define ktime_get_real_ts64(ts) getnstimeofday64(ts)
|
||||
|
||||
/*
|
||||
* ktime_t based interfaces
|
||||
*/
|
||||
|
@ -53,6 +51,7 @@ enum tk_offsets {
|
|||
|
||||
extern ktime_t ktime_get(void);
|
||||
extern ktime_t ktime_get_with_offset(enum tk_offsets offs);
|
||||
extern ktime_t ktime_get_coarse_with_offset(enum tk_offsets offs);
|
||||
extern ktime_t ktime_mono_to_any(ktime_t tmono, enum tk_offsets offs);
|
||||
extern ktime_t ktime_get_raw(void);
|
||||
extern u32 ktime_get_resolution_ns(void);
|
||||
|
@ -65,6 +64,11 @@ static inline ktime_t ktime_get_real(void)
|
|||
return ktime_get_with_offset(TK_OFFS_REAL);
|
||||
}
|
||||
|
||||
static inline ktime_t ktime_get_coarse_real(void)
|
||||
{
|
||||
return ktime_get_coarse_with_offset(TK_OFFS_REAL);
|
||||
}
|
||||
|
||||
/**
|
||||
* ktime_get_boottime - Returns monotonic time since boot in ktime_t format
|
||||
*
|
||||
|
@ -76,6 +80,11 @@ static inline ktime_t ktime_get_boottime(void)
|
|||
return ktime_get_with_offset(TK_OFFS_BOOT);
|
||||
}
|
||||
|
||||
static inline ktime_t ktime_get_coarse_boottime(void)
|
||||
{
|
||||
return ktime_get_coarse_with_offset(TK_OFFS_BOOT);
|
||||
}
|
||||
|
||||
/**
|
||||
* ktime_get_clocktai - Returns the TAI time of day in ktime_t format
|
||||
*/
|
||||
|
@ -84,6 +93,11 @@ static inline ktime_t ktime_get_clocktai(void)
|
|||
return ktime_get_with_offset(TK_OFFS_TAI);
|
||||
}
|
||||
|
||||
static inline ktime_t ktime_get_coarse_clocktai(void)
|
||||
{
|
||||
return ktime_get_coarse_with_offset(TK_OFFS_TAI);
|
||||
}
|
||||
|
||||
/**
|
||||
* ktime_mono_to_real - Convert monotonic time to clock realtime
|
||||
*/
|
||||
|
@ -123,18 +137,40 @@ extern u64 ktime_get_boot_fast_ns(void);
|
|||
extern u64 ktime_get_real_fast_ns(void);
|
||||
|
||||
/*
|
||||
* timespec64 interfaces utilizing the ktime based ones
|
||||
* timespec64/time64_t interfaces utilizing the ktime based ones
|
||||
* for API completeness, these could be implemented more efficiently
|
||||
* if needed.
|
||||
*/
|
||||
static inline void get_monotonic_boottime64(struct timespec64 *ts)
|
||||
static inline void ktime_get_boottime_ts64(struct timespec64 *ts)
|
||||
{
|
||||
*ts = ktime_to_timespec64(ktime_get_boottime());
|
||||
}
|
||||
|
||||
static inline void timekeeping_clocktai64(struct timespec64 *ts)
|
||||
static inline void ktime_get_coarse_boottime_ts64(struct timespec64 *ts)
|
||||
{
|
||||
*ts = ktime_to_timespec64(ktime_get_coarse_boottime());
|
||||
}
|
||||
|
||||
static inline time64_t ktime_get_boottime_seconds(void)
|
||||
{
|
||||
return ktime_divns(ktime_get_coarse_boottime(), NSEC_PER_SEC);
|
||||
}
|
||||
|
||||
static inline void ktime_get_clocktai_ts64(struct timespec64 *ts)
|
||||
{
|
||||
*ts = ktime_to_timespec64(ktime_get_clocktai());
|
||||
}
|
||||
|
||||
static inline void ktime_get_coarse_clocktai_ts64(struct timespec64 *ts)
|
||||
{
|
||||
*ts = ktime_to_timespec64(ktime_get_coarse_clocktai());
|
||||
}
|
||||
|
||||
static inline time64_t ktime_get_clocktai_seconds(void)
|
||||
{
|
||||
return ktime_divns(ktime_get_coarse_clocktai(), NSEC_PER_SEC);
|
||||
}
|
||||
|
||||
/*
|
||||
* RTC specific
|
||||
*/
|
||||
|
@ -210,5 +246,30 @@ extern void read_persistent_clock64(struct timespec64 *ts);
|
|||
extern void read_boot_clock64(struct timespec64 *ts);
|
||||
extern int update_persistent_clock64(struct timespec64 now);
|
||||
|
||||
/*
|
||||
* deprecated aliases, don't use in new code
|
||||
*/
|
||||
#define getnstimeofday64(ts) ktime_get_real_ts64(ts)
|
||||
#define get_monotonic_boottime64(ts) ktime_get_boottime_ts64(ts)
|
||||
#define getrawmonotonic64(ts) ktime_get_raw_ts64(ts)
|
||||
#define timekeeping_clocktai64(ts) ktime_get_clocktai_ts64(ts)
|
||||
|
||||
static inline struct timespec64 current_kernel_time64(void)
|
||||
{
|
||||
struct timespec64 ts;
|
||||
|
||||
ktime_get_coarse_real_ts64(&ts);
|
||||
|
||||
return ts;
|
||||
}
|
||||
|
||||
static inline struct timespec64 get_monotonic_coarse64(void)
|
||||
{
|
||||
struct timespec64 ts;
|
||||
|
||||
ktime_get_coarse_ts64(&ts);
|
||||
|
||||
return ts;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -11,55 +11,13 @@ unsigned long get_seconds(void);
|
|||
|
||||
static inline struct timespec current_kernel_time(void)
|
||||
{
|
||||
struct timespec64 now = current_kernel_time64();
|
||||
struct timespec64 ts64;
|
||||
|
||||
return timespec64_to_timespec(now);
|
||||
ktime_get_coarse_real_ts64(&ts64);
|
||||
|
||||
return timespec64_to_timespec(ts64);
|
||||
}
|
||||
|
||||
#if BITS_PER_LONG == 64
|
||||
/**
|
||||
* Deprecated. Use do_settimeofday64().
|
||||
*/
|
||||
static inline int do_settimeofday(const struct timespec *ts)
|
||||
{
|
||||
return do_settimeofday64(ts);
|
||||
}
|
||||
|
||||
static inline int __getnstimeofday(struct timespec *ts)
|
||||
{
|
||||
return __getnstimeofday64(ts);
|
||||
}
|
||||
|
||||
static inline void getnstimeofday(struct timespec *ts)
|
||||
{
|
||||
getnstimeofday64(ts);
|
||||
}
|
||||
|
||||
static inline void ktime_get_ts(struct timespec *ts)
|
||||
{
|
||||
ktime_get_ts64(ts);
|
||||
}
|
||||
|
||||
static inline void ktime_get_real_ts(struct timespec *ts)
|
||||
{
|
||||
getnstimeofday64(ts);
|
||||
}
|
||||
|
||||
static inline void getrawmonotonic(struct timespec *ts)
|
||||
{
|
||||
getrawmonotonic64(ts);
|
||||
}
|
||||
|
||||
static inline struct timespec get_monotonic_coarse(void)
|
||||
{
|
||||
return get_monotonic_coarse64();
|
||||
}
|
||||
|
||||
static inline void getboottime(struct timespec *ts)
|
||||
{
|
||||
return getboottime64(ts);
|
||||
}
|
||||
#else
|
||||
/**
|
||||
* Deprecated. Use do_settimeofday64().
|
||||
*/
|
||||
|
@ -71,20 +29,11 @@ static inline int do_settimeofday(const struct timespec *ts)
|
|||
return do_settimeofday64(&ts64);
|
||||
}
|
||||
|
||||
static inline int __getnstimeofday(struct timespec *ts)
|
||||
{
|
||||
struct timespec64 ts64;
|
||||
int ret = __getnstimeofday64(&ts64);
|
||||
|
||||
*ts = timespec64_to_timespec(ts64);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void getnstimeofday(struct timespec *ts)
|
||||
{
|
||||
struct timespec64 ts64;
|
||||
|
||||
getnstimeofday64(&ts64);
|
||||
ktime_get_real_ts64(&ts64);
|
||||
*ts = timespec64_to_timespec(ts64);
|
||||
}
|
||||
|
||||
|
@ -100,7 +49,7 @@ static inline void ktime_get_real_ts(struct timespec *ts)
|
|||
{
|
||||
struct timespec64 ts64;
|
||||
|
||||
getnstimeofday64(&ts64);
|
||||
ktime_get_real_ts64(&ts64);
|
||||
*ts = timespec64_to_timespec(ts64);
|
||||
}
|
||||
|
||||
|
@ -108,13 +57,17 @@ static inline void getrawmonotonic(struct timespec *ts)
|
|||
{
|
||||
struct timespec64 ts64;
|
||||
|
||||
getrawmonotonic64(&ts64);
|
||||
ktime_get_raw_ts64(&ts64);
|
||||
*ts = timespec64_to_timespec(ts64);
|
||||
}
|
||||
|
||||
static inline struct timespec get_monotonic_coarse(void)
|
||||
{
|
||||
return timespec64_to_timespec(get_monotonic_coarse64());
|
||||
struct timespec64 ts64;
|
||||
|
||||
ktime_get_coarse_ts64(&ts64);
|
||||
|
||||
return timespec64_to_timespec(ts64);
|
||||
}
|
||||
|
||||
static inline void getboottime(struct timespec *ts)
|
||||
|
@ -124,7 +77,6 @@ static inline void getboottime(struct timespec *ts)
|
|||
getboottime64(&ts64);
|
||||
*ts = timespec64_to_timespec(ts64);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Timespec interfaces utilizing the ktime based ones
|
||||
|
|
|
@ -18,31 +18,30 @@
|
|||
* On big-endian systems, the padding is in the wrong place.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused1;
|
||||
#endif
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused2;
|
||||
#endif
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused3;
|
||||
#else
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_rtime; /* last msgrcv time */
|
||||
unsigned long msg_rtime_high;
|
||||
unsigned long msg_ctime; /* last change time */
|
||||
unsigned long msg_ctime_high;
|
||||
#endif
|
||||
__kernel_ulong_t msg_cbytes; /* current number of bytes on queue */
|
||||
__kernel_ulong_t msg_qnum; /* number of messages in queue */
|
||||
__kernel_ulong_t msg_qbytes; /* max number of bytes on queue */
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
__kernel_pid_t msg_lspid; /* pid of last msgsnd */
|
||||
__kernel_pid_t msg_lrpid; /* last receive pid */
|
||||
__kernel_ulong_t __unused4;
|
||||
__kernel_ulong_t __unused5;
|
||||
unsigned long __unused4;
|
||||
unsigned long __unused5;
|
||||
};
|
||||
|
||||
#endif /* __ASM_GENERIC_MSGBUF_H */
|
||||
|
|
|
@ -13,23 +13,29 @@
|
|||
* everyone just ended up making identical copies without specific
|
||||
* optimizations, so we may just as well all use the same one.
|
||||
*
|
||||
* 64 bit architectures typically define a 64 bit __kernel_time_t,
|
||||
* 64 bit architectures use a 64-bit __kernel_time_t here, while
|
||||
* 32 bit architectures have a pair of unsigned long values.
|
||||
* so they do not need the first two padding words.
|
||||
* On big-endian systems, the padding is in the wrong place.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
* On big-endian systems, the padding is in the wrong place for
|
||||
* historic reasons, so user space has to reconstruct a time_t
|
||||
* value using
|
||||
*
|
||||
* user_semid_ds.sem_otime = kernel_semid64_ds.sem_otime +
|
||||
* ((long long)kernel_semid64_ds.sem_otime_high << 32)
|
||||
*
|
||||
* Pad space is left for 2 miscellaneous 32-bit values
|
||||
*/
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused1;
|
||||
#endif
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused2;
|
||||
#else
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
unsigned long sem_otime_high;
|
||||
unsigned long sem_ctime; /* last change time */
|
||||
unsigned long sem_ctime_high;
|
||||
#endif
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused3;
|
||||
|
|
|
@ -19,42 +19,41 @@
|
|||
*
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 64-bit time_t to solve y2038 problem
|
||||
* - 2 miscellaneous 32-bit values
|
||||
*/
|
||||
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused1;
|
||||
#endif
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused2;
|
||||
#endif
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
#if __BITS_PER_LONG != 64
|
||||
unsigned long __unused3;
|
||||
#else
|
||||
unsigned long shm_atime; /* last attach time */
|
||||
unsigned long shm_atime_high;
|
||||
unsigned long shm_dtime; /* last detach time */
|
||||
unsigned long shm_dtime_high;
|
||||
unsigned long shm_ctime; /* last change time */
|
||||
unsigned long shm_ctime_high;
|
||||
#endif
|
||||
__kernel_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_pid_t shm_lpid; /* pid of last operator */
|
||||
__kernel_ulong_t shm_nattch; /* no. of current attaches */
|
||||
__kernel_ulong_t __unused4;
|
||||
__kernel_ulong_t __unused5;
|
||||
unsigned long shm_nattch; /* no. of current attaches */
|
||||
unsigned long __unused4;
|
||||
unsigned long __unused5;
|
||||
};
|
||||
|
||||
struct shminfo64 {
|
||||
__kernel_ulong_t shmmax;
|
||||
__kernel_ulong_t shmmin;
|
||||
__kernel_ulong_t shmmni;
|
||||
__kernel_ulong_t shmseg;
|
||||
__kernel_ulong_t shmall;
|
||||
__kernel_ulong_t __unused1;
|
||||
__kernel_ulong_t __unused2;
|
||||
__kernel_ulong_t __unused3;
|
||||
__kernel_ulong_t __unused4;
|
||||
unsigned long shmmax;
|
||||
unsigned long shmmin;
|
||||
unsigned long shmmni;
|
||||
unsigned long shmseg;
|
||||
unsigned long shmall;
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
unsigned long __unused3;
|
||||
unsigned long __unused4;
|
||||
};
|
||||
|
||||
#endif /* __ASM_GENERIC_SHMBUF_H */
|
||||
|
|
86
ipc/mqueue.c
86
ipc/mqueue.c
|
@ -691,7 +691,7 @@ static void __do_notify(struct mqueue_inode_info *info)
|
|||
wake_up(&info->wait_q);
|
||||
}
|
||||
|
||||
static int prepare_timeout(const struct timespec __user *u_abs_timeout,
|
||||
static int prepare_timeout(const struct __kernel_timespec __user *u_abs_timeout,
|
||||
struct timespec64 *ts)
|
||||
{
|
||||
if (get_timespec64(ts, u_abs_timeout))
|
||||
|
@ -1128,7 +1128,7 @@ static int do_mq_timedreceive(mqd_t mqdes, char __user *u_msg_ptr,
|
|||
|
||||
SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
|
||||
size_t, msg_len, unsigned int, msg_prio,
|
||||
const struct timespec __user *, u_abs_timeout)
|
||||
const struct __kernel_timespec __user *, u_abs_timeout)
|
||||
{
|
||||
struct timespec64 ts, *p = NULL;
|
||||
if (u_abs_timeout) {
|
||||
|
@ -1142,7 +1142,7 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
|
|||
|
||||
SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
|
||||
size_t, msg_len, unsigned int __user *, u_msg_prio,
|
||||
const struct timespec __user *, u_abs_timeout)
|
||||
const struct __kernel_timespec __user *, u_abs_timeout)
|
||||
{
|
||||
struct timespec64 ts, *p = NULL;
|
||||
if (u_abs_timeout) {
|
||||
|
@ -1420,6 +1420,47 @@ COMPAT_SYSCALL_DEFINE4(mq_open, const char __user *, u_name,
|
|||
return do_mq_open(u_name, oflag, mode, p);
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE2(mq_notify, mqd_t, mqdes,
|
||||
const struct compat_sigevent __user *, u_notification)
|
||||
{
|
||||
struct sigevent n, *p = NULL;
|
||||
if (u_notification) {
|
||||
if (get_compat_sigevent(&n, u_notification))
|
||||
return -EFAULT;
|
||||
if (n.sigev_notify == SIGEV_THREAD)
|
||||
n.sigev_value.sival_ptr = compat_ptr(n.sigev_value.sival_int);
|
||||
p = &n;
|
||||
}
|
||||
return do_mq_notify(mqdes, p);
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
|
||||
const struct compat_mq_attr __user *, u_mqstat,
|
||||
struct compat_mq_attr __user *, u_omqstat)
|
||||
{
|
||||
int ret;
|
||||
struct mq_attr mqstat, omqstat;
|
||||
struct mq_attr *new = NULL, *old = NULL;
|
||||
|
||||
if (u_mqstat) {
|
||||
new = &mqstat;
|
||||
if (get_compat_mq_attr(new, u_mqstat))
|
||||
return -EFAULT;
|
||||
}
|
||||
if (u_omqstat)
|
||||
old = &omqstat;
|
||||
|
||||
ret = do_mq_getsetattr(mqdes, new, old);
|
||||
if (ret || !old)
|
||||
return ret;
|
||||
|
||||
if (put_compat_mq_attr(old, u_omqstat))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
static int compat_prepare_timeout(const struct compat_timespec __user *p,
|
||||
struct timespec64 *ts)
|
||||
{
|
||||
|
@ -1459,45 +1500,6 @@ COMPAT_SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes,
|
|||
}
|
||||
return do_mq_timedreceive(mqdes, u_msg_ptr, msg_len, u_msg_prio, p);
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE2(mq_notify, mqd_t, mqdes,
|
||||
const struct compat_sigevent __user *, u_notification)
|
||||
{
|
||||
struct sigevent n, *p = NULL;
|
||||
if (u_notification) {
|
||||
if (get_compat_sigevent(&n, u_notification))
|
||||
return -EFAULT;
|
||||
if (n.sigev_notify == SIGEV_THREAD)
|
||||
n.sigev_value.sival_ptr = compat_ptr(n.sigev_value.sival_int);
|
||||
p = &n;
|
||||
}
|
||||
return do_mq_notify(mqdes, p);
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
|
||||
const struct compat_mq_attr __user *, u_mqstat,
|
||||
struct compat_mq_attr __user *, u_omqstat)
|
||||
{
|
||||
int ret;
|
||||
struct mq_attr mqstat, omqstat;
|
||||
struct mq_attr *new = NULL, *old = NULL;
|
||||
|
||||
if (u_mqstat) {
|
||||
new = &mqstat;
|
||||
if (get_compat_mq_attr(new, u_mqstat))
|
||||
return -EFAULT;
|
||||
}
|
||||
if (u_omqstat)
|
||||
old = &omqstat;
|
||||
|
||||
ret = do_mq_getsetattr(mqdes, new, old);
|
||||
if (ret || !old)
|
||||
return ret;
|
||||
|
||||
if (put_compat_mq_attr(old, u_omqstat))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct inode_operations mqueue_dir_inode_operations = {
|
||||
|
|
20
ipc/msg.c
20
ipc/msg.c
|
@ -537,6 +537,11 @@ static int msgctl_stat(struct ipc_namespace *ns, int msqid,
|
|||
p->msg_stime = msq->q_stime;
|
||||
p->msg_rtime = msq->q_rtime;
|
||||
p->msg_ctime = msq->q_ctime;
|
||||
#ifndef CONFIG_64BIT
|
||||
p->msg_stime_high = msq->q_stime >> 32;
|
||||
p->msg_rtime_high = msq->q_rtime >> 32;
|
||||
p->msg_ctime_high = msq->q_ctime >> 32;
|
||||
#endif
|
||||
p->msg_cbytes = msq->q_cbytes;
|
||||
p->msg_qnum = msq->q_qnum;
|
||||
p->msg_qbytes = msq->q_qbytes;
|
||||
|
@ -646,9 +651,12 @@ static int copy_compat_msqid_to_user(void __user *buf, struct msqid64_ds *in,
|
|||
struct compat_msqid64_ds v;
|
||||
memset(&v, 0, sizeof(v));
|
||||
to_compat_ipc64_perm(&v.msg_perm, &in->msg_perm);
|
||||
v.msg_stime = in->msg_stime;
|
||||
v.msg_rtime = in->msg_rtime;
|
||||
v.msg_ctime = in->msg_ctime;
|
||||
v.msg_stime = lower_32_bits(in->msg_stime);
|
||||
v.msg_stime_high = upper_32_bits(in->msg_stime);
|
||||
v.msg_rtime = lower_32_bits(in->msg_rtime);
|
||||
v.msg_rtime_high = upper_32_bits(in->msg_rtime);
|
||||
v.msg_ctime = lower_32_bits(in->msg_ctime);
|
||||
v.msg_ctime_high = upper_32_bits(in->msg_ctime);
|
||||
v.msg_cbytes = in->msg_cbytes;
|
||||
v.msg_qnum = in->msg_qnum;
|
||||
v.msg_qbytes = in->msg_qbytes;
|
||||
|
@ -758,7 +766,7 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg,
|
|||
WRITE_ONCE(msr->r_msg, ERR_PTR(-E2BIG));
|
||||
} else {
|
||||
ipc_update_pid(&msq->q_lrpid, task_pid(msr->r_tsk));
|
||||
msq->q_rtime = get_seconds();
|
||||
msq->q_rtime = ktime_get_real_seconds();
|
||||
|
||||
wake_q_add(wake_q, msr->r_tsk);
|
||||
WRITE_ONCE(msr->r_msg, msg);
|
||||
|
@ -859,7 +867,7 @@ static long do_msgsnd(int msqid, long mtype, void __user *mtext,
|
|||
}
|
||||
|
||||
ipc_update_pid(&msq->q_lspid, task_tgid(current));
|
||||
msq->q_stime = get_seconds();
|
||||
msq->q_stime = ktime_get_real_seconds();
|
||||
|
||||
if (!pipelined_send(msq, msg, &wake_q)) {
|
||||
/* no one is waiting for this message, enqueue it */
|
||||
|
@ -1087,7 +1095,7 @@ static long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, in
|
|||
|
||||
list_del(&msg->m_list);
|
||||
msq->q_qnum--;
|
||||
msq->q_rtime = get_seconds();
|
||||
msq->q_rtime = ktime_get_real_seconds();
|
||||
ipc_update_pid(&msq->q_lrpid, task_tgid(current));
|
||||
msq->q_cbytes -= msg->m_ts;
|
||||
atomic_sub(msg->m_ts, &ns->msg_bytes);
|
||||
|
|
27
ipc/sem.c
27
ipc/sem.c
|
@ -70,6 +70,7 @@
|
|||
* The worst-case behavior is nevertheless O(N^2) for N wakeups.
|
||||
*/
|
||||
|
||||
#include <linux/compat.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -104,7 +105,7 @@ struct sem {
|
|||
/* that alter the semaphore */
|
||||
struct list_head pending_const; /* pending single-sop operations */
|
||||
/* that do not alter the semaphore*/
|
||||
time_t sem_otime; /* candidate for sem_otime */
|
||||
time64_t sem_otime; /* candidate for sem_otime */
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
/* One sem_array data structure for each set of semaphores in the system. */
|
||||
|
@ -984,10 +985,10 @@ static int update_queue(struct sem_array *sma, int semnum, struct wake_q_head *w
|
|||
static void set_semotime(struct sem_array *sma, struct sembuf *sops)
|
||||
{
|
||||
if (sops == NULL) {
|
||||
sma->sems[0].sem_otime = get_seconds();
|
||||
sma->sems[0].sem_otime = ktime_get_real_seconds();
|
||||
} else {
|
||||
sma->sems[sops[0].sem_num].sem_otime =
|
||||
get_seconds();
|
||||
ktime_get_real_seconds();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1214,6 +1215,7 @@ static int semctl_stat(struct ipc_namespace *ns, int semid,
|
|||
int cmd, struct semid64_ds *semid64)
|
||||
{
|
||||
struct sem_array *sma;
|
||||
time64_t semotime;
|
||||
int id = 0;
|
||||
int err;
|
||||
|
||||
|
@ -1257,8 +1259,13 @@ static int semctl_stat(struct ipc_namespace *ns, int semid,
|
|||
}
|
||||
|
||||
kernel_to_ipc64_perm(&sma->sem_perm, &semid64->sem_perm);
|
||||
semid64->sem_otime = get_semotime(sma);
|
||||
semotime = get_semotime(sma);
|
||||
semid64->sem_otime = semotime;
|
||||
semid64->sem_ctime = sma->sem_ctime;
|
||||
#ifndef CONFIG_64BIT
|
||||
semid64->sem_otime_high = semotime >> 32;
|
||||
semid64->sem_ctime_high = sma->sem_ctime >> 32;
|
||||
#endif
|
||||
semid64->sem_nsems = sma->sem_nsems;
|
||||
|
||||
ipc_unlock_object(&sma->sem_perm);
|
||||
|
@ -1704,8 +1711,10 @@ static int copy_compat_semid_to_user(void __user *buf, struct semid64_ds *in,
|
|||
struct compat_semid64_ds v;
|
||||
memset(&v, 0, sizeof(v));
|
||||
to_compat_ipc64_perm(&v.sem_perm, &in->sem_perm);
|
||||
v.sem_otime = in->sem_otime;
|
||||
v.sem_ctime = in->sem_ctime;
|
||||
v.sem_otime = lower_32_bits(in->sem_otime);
|
||||
v.sem_otime_high = upper_32_bits(in->sem_otime);
|
||||
v.sem_ctime = lower_32_bits(in->sem_ctime);
|
||||
v.sem_ctime_high = upper_32_bits(in->sem_ctime);
|
||||
v.sem_nsems = in->sem_nsems;
|
||||
return copy_to_user(buf, &v, sizeof(v));
|
||||
} else {
|
||||
|
@ -2168,7 +2177,7 @@ static long do_semtimedop(int semid, struct sembuf __user *tsops,
|
|||
}
|
||||
|
||||
long ksys_semtimedop(int semid, struct sembuf __user *tsops,
|
||||
unsigned int nsops, const struct timespec __user *timeout)
|
||||
unsigned int nsops, const struct __kernel_timespec __user *timeout)
|
||||
{
|
||||
if (timeout) {
|
||||
struct timespec64 ts;
|
||||
|
@ -2180,12 +2189,12 @@ long ksys_semtimedop(int semid, struct sembuf __user *tsops,
|
|||
}
|
||||
|
||||
SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
|
||||
unsigned int, nsops, const struct timespec __user *, timeout)
|
||||
unsigned int, nsops, const struct __kernel_timespec __user *, timeout)
|
||||
{
|
||||
return ksys_semtimedop(semid, tsops, nsops, timeout);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
|
||||
unsigned int nsops,
|
||||
const struct compat_timespec __user *timeout)
|
||||
|
|
14
ipc/shm.c
14
ipc/shm.c
|
@ -1002,6 +1002,11 @@ static int shmctl_stat(struct ipc_namespace *ns, int shmid,
|
|||
tbuf->shm_atime = shp->shm_atim;
|
||||
tbuf->shm_dtime = shp->shm_dtim;
|
||||
tbuf->shm_ctime = shp->shm_ctim;
|
||||
#ifndef CONFIG_64BIT
|
||||
tbuf->shm_atime_high = shp->shm_atim >> 32;
|
||||
tbuf->shm_dtime_high = shp->shm_dtim >> 32;
|
||||
tbuf->shm_ctime_high = shp->shm_ctim >> 32;
|
||||
#endif
|
||||
tbuf->shm_cpid = pid_vnr(shp->shm_cprid);
|
||||
tbuf->shm_lpid = pid_vnr(shp->shm_lprid);
|
||||
tbuf->shm_nattch = shp->shm_nattch;
|
||||
|
@ -1233,9 +1238,12 @@ static int copy_compat_shmid_to_user(void __user *buf, struct shmid64_ds *in,
|
|||
struct compat_shmid64_ds v;
|
||||
memset(&v, 0, sizeof(v));
|
||||
to_compat_ipc64_perm(&v.shm_perm, &in->shm_perm);
|
||||
v.shm_atime = in->shm_atime;
|
||||
v.shm_dtime = in->shm_dtime;
|
||||
v.shm_ctime = in->shm_ctime;
|
||||
v.shm_atime = lower_32_bits(in->shm_atime);
|
||||
v.shm_atime_high = upper_32_bits(in->shm_atime);
|
||||
v.shm_dtime = lower_32_bits(in->shm_dtime);
|
||||
v.shm_dtime_high = upper_32_bits(in->shm_dtime);
|
||||
v.shm_ctime = lower_32_bits(in->shm_ctime);
|
||||
v.shm_ctime_high = upper_32_bits(in->shm_ctime);
|
||||
v.shm_segsz = in->shm_segsz;
|
||||
v.shm_nattch = in->shm_nattch;
|
||||
v.shm_cpid = in->shm_cpid;
|
||||
|
|
|
@ -30,9 +30,14 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
|
|||
return ksys_semtimedop(first, (struct sembuf __user *)ptr,
|
||||
second, NULL);
|
||||
case SEMTIMEDOP:
|
||||
return ksys_semtimedop(first, (struct sembuf __user *)ptr,
|
||||
second,
|
||||
(const struct timespec __user *)fifth);
|
||||
if (IS_ENABLED(CONFIG_64BIT) || !IS_ENABLED(CONFIG_64BIT_TIME))
|
||||
return ksys_semtimedop(first, ptr, second,
|
||||
(const struct __kernel_timespec __user *)fifth);
|
||||
else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
|
||||
return compat_ksys_semtimedop(first, ptr, second,
|
||||
(const struct compat_timespec __user *)fifth);
|
||||
else
|
||||
return -ENOSYS;
|
||||
|
||||
case SEMGET:
|
||||
return ksys_semget(first, second, third);
|
||||
|
@ -130,6 +135,8 @@ COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,
|
|||
/* struct sembuf is the same on 32 and 64bit :)) */
|
||||
return ksys_semtimedop(first, compat_ptr(ptr), second, NULL);
|
||||
case SEMTIMEDOP:
|
||||
if (!IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
|
||||
return -ENOSYS;
|
||||
return compat_ksys_semtimedop(first, compat_ptr(ptr), second,
|
||||
compat_ptr(fifth));
|
||||
case SEMGET:
|
||||
|
|
|
@ -251,7 +251,7 @@ static inline int compat_ipc_parse_version(int *cmd)
|
|||
/* for __ARCH_WANT_SYS_IPC */
|
||||
long ksys_semtimedop(int semid, struct sembuf __user *tsops,
|
||||
unsigned int nsops,
|
||||
const struct timespec __user *timeout);
|
||||
const struct __kernel_timespec __user *timeout);
|
||||
long ksys_semget(key_t key, int nsems, int semflg);
|
||||
long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg);
|
||||
long ksys_msgget(key_t key, int msgflg);
|
||||
|
@ -265,10 +265,10 @@ long ksys_shmdt(char __user *shmaddr);
|
|||
long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
|
||||
|
||||
/* for CONFIG_ARCH_WANT_OLD_COMPAT_IPC */
|
||||
#ifdef CONFIG_COMPAT
|
||||
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
|
||||
unsigned int nsops,
|
||||
const struct compat_timespec __user *timeout);
|
||||
#ifdef CONFIG_COMPAT
|
||||
long compat_ksys_semctl(int semid, int semnum, int cmd, int arg);
|
||||
long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr);
|
||||
long compat_ksys_msgrcv(int msqid, compat_uptr_t msgp, compat_ssize_t msgsz,
|
||||
|
|
|
@ -407,7 +407,6 @@ time64_t mktime64(const unsigned int year0, const unsigned int mon0,
|
|||
}
|
||||
EXPORT_SYMBOL(mktime64);
|
||||
|
||||
#if __BITS_PER_LONG == 32
|
||||
/**
|
||||
* set_normalized_timespec - set timespec sec and nsec parts and normalize
|
||||
*
|
||||
|
@ -468,7 +467,6 @@ struct timespec ns_to_timespec(const s64 nsec)
|
|||
return ts;
|
||||
}
|
||||
EXPORT_SYMBOL(ns_to_timespec);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* ns_to_timeval - Convert nanoseconds to timeval
|
||||
|
|
|
@ -705,18 +705,19 @@ static void timekeeping_forward_now(struct timekeeper *tk)
|
|||
}
|
||||
|
||||
/**
|
||||
* __getnstimeofday64 - Returns the time of day in a timespec64.
|
||||
* ktime_get_real_ts64 - Returns the time of day in a timespec64.
|
||||
* @ts: pointer to the timespec to be set
|
||||
*
|
||||
* Updates the time of day in the timespec.
|
||||
* Returns 0 on success, or -ve when suspended (timespec will be undefined).
|
||||
* Returns the time of day in a timespec64 (WARN if suspended).
|
||||
*/
|
||||
int __getnstimeofday64(struct timespec64 *ts)
|
||||
void ktime_get_real_ts64(struct timespec64 *ts)
|
||||
{
|
||||
struct timekeeper *tk = &tk_core.timekeeper;
|
||||
unsigned long seq;
|
||||
u64 nsecs;
|
||||
|
||||
WARN_ON(timekeeping_suspended);
|
||||
|
||||
do {
|
||||
seq = read_seqcount_begin(&tk_core.seq);
|
||||
|
||||
|
@ -727,28 +728,8 @@ int __getnstimeofday64(struct timespec64 *ts)
|
|||
|
||||
ts->tv_nsec = 0;
|
||||
timespec64_add_ns(ts, nsecs);
|
||||
|
||||
/*
|
||||
* Do not bail out early, in case there were callers still using
|
||||
* the value, even in the face of the WARN_ON.
|
||||
*/
|
||||
if (unlikely(timekeeping_suspended))
|
||||
return -EAGAIN;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(__getnstimeofday64);
|
||||
|
||||
/**
|
||||
* getnstimeofday64 - Returns the time of day in a timespec64.
|
||||
* @ts: pointer to the timespec64 to be set
|
||||
*
|
||||
* Returns the time of day in a timespec64 (WARN if suspended).
|
||||
*/
|
||||
void getnstimeofday64(struct timespec64 *ts)
|
||||
{
|
||||
WARN_ON(__getnstimeofday64(ts));
|
||||
}
|
||||
EXPORT_SYMBOL(getnstimeofday64);
|
||||
EXPORT_SYMBOL(ktime_get_real_ts64);
|
||||
|
||||
ktime_t ktime_get(void)
|
||||
{
|
||||
|
@ -814,6 +795,25 @@ ktime_t ktime_get_with_offset(enum tk_offsets offs)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(ktime_get_with_offset);
|
||||
|
||||
ktime_t ktime_get_coarse_with_offset(enum tk_offsets offs)
|
||||
{
|
||||
struct timekeeper *tk = &tk_core.timekeeper;
|
||||
unsigned int seq;
|
||||
ktime_t base, *offset = offsets[offs];
|
||||
|
||||
WARN_ON(timekeeping_suspended);
|
||||
|
||||
do {
|
||||
seq = read_seqcount_begin(&tk_core.seq);
|
||||
base = ktime_add(tk->tkr_mono.base, *offset);
|
||||
|
||||
} while (read_seqcount_retry(&tk_core.seq, seq));
|
||||
|
||||
return base;
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ktime_get_coarse_with_offset);
|
||||
|
||||
/**
|
||||
* ktime_mono_to_any() - convert mononotic time to any other time
|
||||
* @tmono: time to convert.
|
||||
|
@ -1410,12 +1410,12 @@ int timekeeping_notify(struct clocksource *clock)
|
|||
}
|
||||
|
||||
/**
|
||||
* getrawmonotonic64 - Returns the raw monotonic time in a timespec
|
||||
* ktime_get_raw_ts64 - Returns the raw monotonic time in a timespec
|
||||
* @ts: pointer to the timespec64 to be set
|
||||
*
|
||||
* Returns the raw monotonic time (completely un-modified by ntp)
|
||||
*/
|
||||
void getrawmonotonic64(struct timespec64 *ts)
|
||||
void ktime_get_raw_ts64(struct timespec64 *ts)
|
||||
{
|
||||
struct timekeeper *tk = &tk_core.timekeeper;
|
||||
unsigned long seq;
|
||||
|
@ -1431,7 +1431,7 @@ void getrawmonotonic64(struct timespec64 *ts)
|
|||
ts->tv_nsec = 0;
|
||||
timespec64_add_ns(ts, nsecs);
|
||||
}
|
||||
EXPORT_SYMBOL(getrawmonotonic64);
|
||||
EXPORT_SYMBOL(ktime_get_raw_ts64);
|
||||
|
||||
|
||||
/**
|
||||
|
@ -2133,23 +2133,20 @@ unsigned long get_seconds(void)
|
|||
}
|
||||
EXPORT_SYMBOL(get_seconds);
|
||||
|
||||
struct timespec64 current_kernel_time64(void)
|
||||
void ktime_get_coarse_real_ts64(struct timespec64 *ts)
|
||||
{
|
||||
struct timekeeper *tk = &tk_core.timekeeper;
|
||||
struct timespec64 now;
|
||||
unsigned long seq;
|
||||
|
||||
do {
|
||||
seq = read_seqcount_begin(&tk_core.seq);
|
||||
|
||||
now = tk_xtime(tk);
|
||||
*ts = tk_xtime(tk);
|
||||
} while (read_seqcount_retry(&tk_core.seq, seq));
|
||||
|
||||
return now;
|
||||
}
|
||||
EXPORT_SYMBOL(current_kernel_time64);
|
||||
EXPORT_SYMBOL(ktime_get_coarse_real_ts64);
|
||||
|
||||
struct timespec64 get_monotonic_coarse64(void)
|
||||
void ktime_get_coarse_ts64(struct timespec64 *ts)
|
||||
{
|
||||
struct timekeeper *tk = &tk_core.timekeeper;
|
||||
struct timespec64 now, mono;
|
||||
|
@ -2162,12 +2159,10 @@ struct timespec64 get_monotonic_coarse64(void)
|
|||
mono = tk->wall_to_monotonic;
|
||||
} while (read_seqcount_retry(&tk_core.seq, seq));
|
||||
|
||||
set_normalized_timespec64(&now, now.tv_sec + mono.tv_sec,
|
||||
set_normalized_timespec64(ts, now.tv_sec + mono.tv_sec,
|
||||
now.tv_nsec + mono.tv_nsec);
|
||||
|
||||
return now;
|
||||
}
|
||||
EXPORT_SYMBOL(get_monotonic_coarse64);
|
||||
EXPORT_SYMBOL(ktime_get_coarse_ts64);
|
||||
|
||||
/*
|
||||
* Must hold jiffies_lock
|
||||
|
|
Loading…
Reference in New Issue
Block a user