posix-timers: Store k_clock pointer in k_itimer
authorThomas Gleixner <tglx@linutronix.de>
Tue, 30 May 2017 21:15:44 +0000 (23:15 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Sun, 4 Jun 2017 13:40:25 +0000 (15:40 +0200)
Having the k_clock pointer in the k_itimer struct avoids the lookup in
several code pathes and makes the next steps of unification of the hrtimer
and alarmtimer based posix timers simpler.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: John Stultz <john.stultz@linaro.org>
Link: http://lkml.kernel.org/r/20170530211656.641222072@linutronix.de
include/linux/posix-timers.h
kernel/time/posix-cpu-timers.c
kernel/time/posix-timers.c

index 908048f488ae0330d21b3f60090afba2e8de03e0..8f9cca390cdb1b512eec3a73065c30a93bf5e299 100644 (file)
@@ -56,6 +56,7 @@ struct cpu_timer_list {
  * @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_overrun:                The overrun counter for pending signals
@@ -75,6 +76,7 @@ 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_overrun;
index 1683e503179eca5a8205da236eb5c1c291eb60a1..0123ece6851b24bc1e9ab6fdcbe9986a67f924da 100644 (file)
@@ -324,6 +324,8 @@ static int posix_cpu_timer_create(struct k_itimer *new_timer)
        if (CPUCLOCK_WHICH(new_timer->it_clock) >= CPUCLOCK_MAX)
                return -EINVAL;
 
+       new_timer->kclock = &clock_posix_cpu;
+
        INIT_LIST_HEAD(&new_timer->it.cpu.entry);
 
        rcu_read_lock();
index 7dd992cc71059202a9449b0552daaab41735c3c5..eb007e19811de01d3342e950d9458e1ed4ff2fa9 100644 (file)
@@ -519,6 +519,7 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock,
        it_id_set = IT_ID_SET;
        new_timer->it_id = (timer_t) new_timer_id;
        new_timer->it_clock = which_clock;
+       new_timer->kclock = kc;
        new_timer->it_overrun = -1;
 
        if (timer_event_spec) {
@@ -679,7 +680,7 @@ SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
        if (!timr)
                return -EINVAL;
 
-       kc = clockid_to_kclock(timr->it_clock);
+       kc = timr->kclock;
        if (WARN_ON_ONCE(!kc || !kc->timer_get))
                ret = -EINVAL;
        else
@@ -798,7 +799,7 @@ retry:
        if (!timr)
                return -EINVAL;
 
-       kc = clockid_to_kclock(timr->it_clock);
+       kc = timr->kclock;
        if (WARN_ON_ONCE(!kc || !kc->timer_set))
                error = -EINVAL;
        else
@@ -829,7 +830,7 @@ static int common_timer_del(struct k_itimer *timer)
 
 static inline int timer_delete_hook(struct k_itimer *timer)
 {
-       const struct k_clock *kc = clockid_to_kclock(timer->it_clock);
+       const struct k_clock *kc = timer->kclock;
 
        if (WARN_ON_ONCE(!kc || !kc->timer_del))
                return -EINVAL;