Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer updates from Thomas Gleixner: "A rather large update for timers/timekeeping: - compat syscall consolidation (Al Viro) - Posix timer consolidation (Christoph Helwig / Thomas Gleixner) - Cleanup of the device tree based initialization for clockevents and clocksources (Daniel Lezcano) - Consolidation of the FTTMR010 clocksource/event driver (Linus Walleij) - The usual set of small fixes and updates all over the place" * 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (93 commits) timers: Make the cpu base lock raw clocksource/drivers/mips-gic-timer: Fix an error code in 'gic_clocksource_of_init()' clocksource/drivers/fsl_ftm_timer: Unmap region obtained by of_iomap clocksource/drivers/tcb_clksrc: Make IO endian agnostic clocksource/drivers/sun4i: Switch to the timer-of common init clocksource/drivers/timer-of: Fix invalid iomap check Revert "ktime: Simplify ktime_compare implementation" clocksource/drivers: Fix uninitialized variable use in timer_of_init kselftests: timers: Add test for frequency step kselftests: timers: Fix inconsistency-check to not ignore first timestamp time: Add warning about imminent deprecation of CONFIG_GENERIC_TIME_VSYSCALL_OLD time: Clean up CLOCK_MONOTONIC_RAW time handling posix-cpu-timers: Make timespec to nsec conversion safe itimer: Make timeval to nsec conversion range limited timers: Fix parameter description of try_to_del_timer_sync() ktime: Simplify ktime_compare implementation clocksource/drivers/fttmr010: Factor out clock read code clocksource/drivers/fttmr010: Implement delay timer clocksource/drivers: Add timer-of common init routine clocksource/drivers/tcb_clksrc: Save timer context on suspend/resume ...
This commit is contained in:
@@ -223,13 +223,4 @@ static inline void tick_setup_hrtimer_broadcast(void) { }
|
||||
|
||||
#endif /* !CONFIG_GENERIC_CLOCKEVENTS */
|
||||
|
||||
#define CLOCKEVENT_OF_DECLARE(name, compat, fn) \
|
||||
OF_DECLARE_1_RET(clkevt, name, compat, fn)
|
||||
|
||||
#ifdef CONFIG_CLKEVT_PROBE
|
||||
extern int clockevent_probe(void);
|
||||
#else
|
||||
static inline int clockevent_probe(void) { return 0; }
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_CLOCKCHIPS_H */
|
||||
|
@@ -250,16 +250,19 @@ extern int clocksource_mmio_init(void __iomem *, const char *,
|
||||
|
||||
extern int clocksource_i8253_init(void);
|
||||
|
||||
#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
|
||||
OF_DECLARE_1_RET(clksrc, name, compat, fn)
|
||||
#define TIMER_OF_DECLARE(name, compat, fn) \
|
||||
OF_DECLARE_1_RET(timer, name, compat, fn)
|
||||
|
||||
#ifdef CONFIG_CLKSRC_PROBE
|
||||
extern void clocksource_probe(void);
|
||||
#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
|
||||
TIMER_OF_DECLARE(name, compat, fn)
|
||||
|
||||
#ifdef CONFIG_TIMER_PROBE
|
||||
extern void timer_probe(void);
|
||||
#else
|
||||
static inline void clocksource_probe(void) {}
|
||||
static inline void timer_probe(void) {}
|
||||
#endif
|
||||
|
||||
#define CLOCKSOURCE_ACPI_DECLARE(name, table_id, fn) \
|
||||
ACPI_DECLARE_PROBE_ENTRY(clksrc, name, table_id, 0, NULL, 0, fn)
|
||||
#define TIMER_ACPI_DECLARE(name, table_id, fn) \
|
||||
ACPI_DECLARE_PROBE_ENTRY(timer, name, table_id, 0, NULL, 0, fn)
|
||||
|
||||
#endif /* _LINUX_CLOCKSOURCE_H */
|
||||
|
@@ -94,6 +94,10 @@ struct compat_itimerval {
|
||||
struct compat_timeval it_value;
|
||||
};
|
||||
|
||||
struct itimerval;
|
||||
int get_compat_itimerval(struct itimerval *, const struct compat_itimerval __user *);
|
||||
int put_compat_itimerval(struct compat_itimerval __user *, const struct itimerval *);
|
||||
|
||||
struct compat_tms {
|
||||
compat_clock_t tms_utime;
|
||||
compat_clock_t tms_stime;
|
||||
@@ -128,6 +132,10 @@ struct compat_timex {
|
||||
compat_int_t:32; compat_int_t:32; compat_int_t:32;
|
||||
};
|
||||
|
||||
struct timex;
|
||||
int compat_get_timex(struct timex *, const struct compat_timex __user *);
|
||||
int compat_put_timex(struct compat_timex __user *, const struct timex *);
|
||||
|
||||
#define _COMPAT_NSIG_WORDS (_COMPAT_NSIG / _COMPAT_NSIG_BPW)
|
||||
|
||||
typedef struct {
|
||||
|
@@ -452,11 +452,11 @@ static inline u64 hrtimer_forward_now(struct hrtimer *timer,
|
||||
}
|
||||
|
||||
/* Precise sleep: */
|
||||
extern long hrtimer_nanosleep(struct timespec64 *rqtp,
|
||||
struct timespec __user *rmtp,
|
||||
|
||||
extern int nanosleep_copyout(struct restart_block *, struct timespec *);
|
||||
extern long hrtimer_nanosleep(const struct timespec64 *rqtp,
|
||||
const enum hrtimer_mode mode,
|
||||
const clockid_t clockid);
|
||||
extern long hrtimer_nanosleep_restart(struct restart_block *restart_block);
|
||||
|
||||
extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
|
||||
struct task_struct *tsk);
|
||||
|
@@ -42,12 +42,6 @@ struct posix_clock;
|
||||
* @clock_gettime: Read the current time
|
||||
* @clock_getres: Get the clock resolution
|
||||
* @clock_settime: Set the current time value
|
||||
* @timer_create: Create a new timer
|
||||
* @timer_delete: Remove a previously created timer
|
||||
* @timer_gettime: Get remaining time and interval of a timer
|
||||
* @timer_settime: Set a timer's initial expiration and interval
|
||||
* @fasync: Optional character device fasync method
|
||||
* @mmap: Optional character device mmap method
|
||||
* @open: Optional character device open method
|
||||
* @release: Optional character device release method
|
||||
* @ioctl: Optional character device ioctl method
|
||||
@@ -66,28 +60,12 @@ struct posix_clock_operations {
|
||||
int (*clock_settime)(struct posix_clock *pc,
|
||||
const struct timespec64 *ts);
|
||||
|
||||
int (*timer_create) (struct posix_clock *pc, struct k_itimer *kit);
|
||||
|
||||
int (*timer_delete) (struct posix_clock *pc, struct k_itimer *kit);
|
||||
|
||||
void (*timer_gettime)(struct posix_clock *pc,
|
||||
struct k_itimer *kit, struct itimerspec64 *tsp);
|
||||
|
||||
int (*timer_settime)(struct posix_clock *pc,
|
||||
struct k_itimer *kit, int flags,
|
||||
struct itimerspec64 *tsp, struct itimerspec64 *old);
|
||||
/*
|
||||
* Optional character device methods:
|
||||
*/
|
||||
int (*fasync) (struct posix_clock *pc,
|
||||
int fd, struct file *file, int on);
|
||||
|
||||
long (*ioctl) (struct posix_clock *pc,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
|
||||
int (*mmap) (struct posix_clock *pc,
|
||||
struct vm_area_struct *vma);
|
||||
|
||||
int (*open) (struct posix_clock *pc, fmode_t f_mode);
|
||||
|
||||
uint (*poll) (struct posix_clock *pc,
|
||||
|
@@ -7,6 +7,7 @@
|
||||
#include <linux/timex.h>
|
||||
#include <linux/alarmtimer.h>
|
||||
|
||||
struct siginfo;
|
||||
|
||||
struct cpu_timer_list {
|
||||
struct list_head entry;
|
||||
@@ -48,81 +49,69 @@ struct cpu_timer_list {
|
||||
#define FD_TO_CLOCKID(fd) ((~(clockid_t) (fd) << 3) | CLOCKFD)
|
||||
#define CLOCKID_TO_FD(clk) ((unsigned int) ~((clk) >> 3))
|
||||
|
||||
/* POSIX.1b interval timer structure. */
|
||||
struct k_itimer {
|
||||
struct list_head list; /* free/ allocate list */
|
||||
struct hlist_node t_hash;
|
||||
spinlock_t it_lock;
|
||||
clockid_t it_clock; /* which timer type */
|
||||
timer_t it_id; /* timer id */
|
||||
int it_overrun; /* overrun on pending signal */
|
||||
int it_overrun_last; /* overrun on last delivered signal */
|
||||
int it_requeue_pending; /* waiting to requeue this timer */
|
||||
#define REQUEUE_PENDING 1
|
||||
int it_sigev_notify; /* notify word of sigevent struct */
|
||||
struct signal_struct *it_signal;
|
||||
|
||||
/**
|
||||
* struct k_itimer - POSIX.1b interval timer structure.
|
||||
* @list: List head for binding the timer to signals->posix_timers
|
||||
* @t_hash: Entry in the posix timer hash table
|
||||
* @it_lock: Lock protecting the timer
|
||||
* @kclock: Pointer to the k_clock struct handling this timer
|
||||
* @it_clock: The posix timer clock id
|
||||
* @it_id: The posix timer id for identifying the timer
|
||||
* @it_active: Marker that timer is active
|
||||
* @it_overrun: The overrun counter for pending signals
|
||||
* @it_overrun_last: The overrun at the time of the last delivered signal
|
||||
* @it_requeue_pending: Indicator that timer waits for being requeued on
|
||||
* signal delivery
|
||||
* @it_sigev_notify: The notify word of sigevent struct for signal delivery
|
||||
* @it_interval: The interval for periodic timers
|
||||
* @it_signal: Pointer to the creators signal struct
|
||||
* @it_pid: The pid of the process/task targeted by the signal
|
||||
* @it_process: The task to wakeup on clock_nanosleep (CPU timers)
|
||||
* @sigq: Pointer to preallocated sigqueue
|
||||
* @it: Union representing the various posix timer type
|
||||
* internals. Also used for rcu freeing the timer.
|
||||
*/
|
||||
struct k_itimer {
|
||||
struct list_head list;
|
||||
struct hlist_node t_hash;
|
||||
spinlock_t it_lock;
|
||||
const struct k_clock *kclock;
|
||||
clockid_t it_clock;
|
||||
timer_t it_id;
|
||||
int it_active;
|
||||
int it_overrun;
|
||||
int it_overrun_last;
|
||||
int it_requeue_pending;
|
||||
int it_sigev_notify;
|
||||
ktime_t it_interval;
|
||||
struct signal_struct *it_signal;
|
||||
union {
|
||||
struct pid *it_pid; /* pid of process to send signal to */
|
||||
struct task_struct *it_process; /* for clock_nanosleep */
|
||||
struct pid *it_pid;
|
||||
struct task_struct *it_process;
|
||||
};
|
||||
struct sigqueue *sigq; /* signal queue entry. */
|
||||
struct sigqueue *sigq;
|
||||
union {
|
||||
struct {
|
||||
struct hrtimer timer;
|
||||
ktime_t interval;
|
||||
struct hrtimer timer;
|
||||
} real;
|
||||
struct cpu_timer_list cpu;
|
||||
struct cpu_timer_list cpu;
|
||||
struct {
|
||||
unsigned int clock;
|
||||
unsigned int node;
|
||||
unsigned long incr;
|
||||
unsigned long expires;
|
||||
} mmtimer;
|
||||
struct {
|
||||
struct alarm alarmtimer;
|
||||
ktime_t interval;
|
||||
struct alarm alarmtimer;
|
||||
} alarm;
|
||||
struct rcu_head rcu;
|
||||
struct rcu_head rcu;
|
||||
} it;
|
||||
};
|
||||
|
||||
struct k_clock {
|
||||
int (*clock_getres) (const clockid_t which_clock, struct timespec64 *tp);
|
||||
int (*clock_set) (const clockid_t which_clock,
|
||||
const struct timespec64 *tp);
|
||||
int (*clock_get) (const clockid_t which_clock, struct timespec64 *tp);
|
||||
int (*clock_adj) (const clockid_t which_clock, struct timex *tx);
|
||||
int (*timer_create) (struct k_itimer *timer);
|
||||
int (*nsleep) (const clockid_t which_clock, int flags,
|
||||
struct timespec64 *, struct timespec __user *);
|
||||
long (*nsleep_restart) (struct restart_block *restart_block);
|
||||
int (*timer_set) (struct k_itimer *timr, int flags,
|
||||
struct itimerspec64 *new_setting,
|
||||
struct itimerspec64 *old_setting);
|
||||
int (*timer_del) (struct k_itimer *timr);
|
||||
#define TIMER_RETRY 1
|
||||
void (*timer_get) (struct k_itimer *timr,
|
||||
struct itimerspec64 *cur_setting);
|
||||
};
|
||||
|
||||
extern struct k_clock clock_posix_cpu;
|
||||
extern struct k_clock clock_posix_dynamic;
|
||||
|
||||
void posix_timers_register_clock(const clockid_t clock_id, struct k_clock *new_clock);
|
||||
|
||||
/* function to call to trigger timer event */
|
||||
int posix_timer_event(struct k_itimer *timr, int si_private);
|
||||
|
||||
void posix_cpu_timer_schedule(struct k_itimer *timer);
|
||||
|
||||
void run_posix_cpu_timers(struct task_struct *task);
|
||||
void posix_cpu_timers_exit(struct task_struct *task);
|
||||
void posix_cpu_timers_exit_group(struct task_struct *task);
|
||||
void set_process_cpu_timer(struct task_struct *task, unsigned int clock_idx,
|
||||
u64 *newval, u64 *oldval);
|
||||
|
||||
long clock_nanosleep_restart(struct restart_block *restart_block);
|
||||
|
||||
void update_rlimit_cpu(struct task_struct *task, unsigned long rlim_new);
|
||||
|
||||
void posixtimer_rearm(struct siginfo *info);
|
||||
|
||||
#endif
|
||||
|
@@ -11,6 +11,14 @@ struct timespec;
|
||||
struct compat_timespec;
|
||||
struct pollfd;
|
||||
|
||||
enum timespec_type {
|
||||
TT_NONE = 0,
|
||||
TT_NATIVE = 1,
|
||||
#ifdef CONFIG_COMPAT
|
||||
TT_COMPAT = 2,
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
* System call restart block.
|
||||
*/
|
||||
@@ -29,10 +37,13 @@ struct restart_block {
|
||||
/* For nanosleep */
|
||||
struct {
|
||||
clockid_t clockid;
|
||||
struct timespec __user *rmtp;
|
||||
enum timespec_type type;
|
||||
union {
|
||||
struct timespec __user *rmtp;
|
||||
#ifdef CONFIG_COMPAT
|
||||
struct compat_timespec __user *compat_rmtp;
|
||||
struct compat_timespec __user *compat_rmtp;
|
||||
#endif
|
||||
};
|
||||
u64 expires;
|
||||
} nanosleep;
|
||||
/* For poll */
|
||||
|
@@ -3,16 +3,13 @@
|
||||
|
||||
#include <linux/bug.h>
|
||||
#include <linux/signal_types.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
struct task_struct;
|
||||
|
||||
/* for sysctl */
|
||||
extern int print_fatal_signals;
|
||||
|
||||
#ifndef HAVE_ARCH_COPY_SIGINFO
|
||||
|
||||
#include <linux/string.h>
|
||||
|
||||
static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
|
||||
{
|
||||
if (from->si_code < 0)
|
||||
@@ -22,7 +19,7 @@ static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
|
||||
memcpy(to, from, __ARCH_SI_PREAMBLE_SIZE + sizeof(from->_sifields._sigchld));
|
||||
}
|
||||
|
||||
#endif
|
||||
int copy_siginfo_to_user(struct siginfo __user *to, const struct siginfo *from);
|
||||
|
||||
/*
|
||||
* Define some primitives to manipulate sigset_t.
|
||||
|
@@ -51,7 +51,7 @@ struct tk_read_base {
|
||||
* @clock_was_set_seq: The sequence number of clock was set events
|
||||
* @cs_was_changed_seq: The sequence number of clocksource change events
|
||||
* @next_leap_ktime: CLOCK_MONOTONIC time value of a pending leap-second
|
||||
* @raw_time: Monotonic raw base time in timespec64 format
|
||||
* @raw_sec: CLOCK_MONOTONIC_RAW time in seconds
|
||||
* @cycle_interval: Number of clock cycles in one NTP interval
|
||||
* @xtime_interval: Number of clock shifted nano seconds in one NTP
|
||||
* interval.
|
||||
@@ -93,7 +93,7 @@ struct timekeeper {
|
||||
unsigned int clock_was_set_seq;
|
||||
u8 cs_was_changed_seq;
|
||||
ktime_t next_leap_ktime;
|
||||
struct timespec64 raw_time;
|
||||
u64 raw_sec;
|
||||
|
||||
/* The following members are for timekeeping internal use */
|
||||
u64 cycle_interval;
|
||||
|
Reference in New Issue
Block a user