posix-timers: Store k_clock pointer in k_itimer
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
This commit is contained in:
Родитель
80105cd0e6
Коммит
d97bb75ddd
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче