mirror of
https://github.com/torvalds/linux.git
synced 2024-09-20 06:53:04 +00:00
posix-timers: Convert timer list to hlist
No requirement for a real list. Spare a few bytes. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Frederic Weisbecker <frederic@kernel.org> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
This commit is contained in:
parent
aca1dc0ce1
commit
52dea0a15c
|
@ -2456,13 +2456,13 @@ static void *timers_start(struct seq_file *m, loff_t *pos)
|
||||||
if (!tp->sighand)
|
if (!tp->sighand)
|
||||||
return ERR_PTR(-ESRCH);
|
return ERR_PTR(-ESRCH);
|
||||||
|
|
||||||
return seq_list_start(&tp->task->signal->posix_timers, *pos);
|
return seq_hlist_start(&tp->task->signal->posix_timers, *pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *timers_next(struct seq_file *m, void *v, loff_t *pos)
|
static void *timers_next(struct seq_file *m, void *v, loff_t *pos)
|
||||||
{
|
{
|
||||||
struct timers_private *tp = m->private;
|
struct timers_private *tp = m->private;
|
||||||
return seq_list_next(v, &tp->task->signal->posix_timers, pos);
|
return seq_hlist_next(v, &tp->task->signal->posix_timers, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void timers_stop(struct seq_file *m, void *v)
|
static void timers_stop(struct seq_file *m, void *v)
|
||||||
|
@ -2491,7 +2491,7 @@ static int show_timer(struct seq_file *m, void *v)
|
||||||
[SIGEV_THREAD] = "thread",
|
[SIGEV_THREAD] = "thread",
|
||||||
};
|
};
|
||||||
|
|
||||||
timer = list_entry((struct list_head *)v, struct k_itimer, list);
|
timer = hlist_entry((struct hlist_node *)v, struct k_itimer, list);
|
||||||
notify = timer->it_sigev_notify;
|
notify = timer->it_sigev_notify;
|
||||||
|
|
||||||
seq_printf(m, "ID: %d\n", timer->it_id);
|
seq_printf(m, "ID: %d\n", timer->it_id);
|
||||||
|
|
|
@ -158,7 +158,7 @@ static inline void posix_cputimers_init_work(void) { }
|
||||||
* @rcu: RCU head for freeing the timer.
|
* @rcu: RCU head for freeing the timer.
|
||||||
*/
|
*/
|
||||||
struct k_itimer {
|
struct k_itimer {
|
||||||
struct list_head list;
|
struct hlist_node list;
|
||||||
struct hlist_node t_hash;
|
struct hlist_node t_hash;
|
||||||
spinlock_t it_lock;
|
spinlock_t it_lock;
|
||||||
const struct k_clock *kclock;
|
const struct k_clock *kclock;
|
||||||
|
|
|
@ -137,7 +137,7 @@ struct signal_struct {
|
||||||
|
|
||||||
/* POSIX.1b Interval Timers */
|
/* POSIX.1b Interval Timers */
|
||||||
unsigned int next_posix_timer_id;
|
unsigned int next_posix_timer_id;
|
||||||
struct list_head posix_timers;
|
struct hlist_head posix_timers;
|
||||||
|
|
||||||
/* ITIMER_REAL timer for the process */
|
/* ITIMER_REAL timer for the process */
|
||||||
struct hrtimer real_timer;
|
struct hrtimer real_timer;
|
||||||
|
|
|
@ -29,7 +29,7 @@ static struct signal_struct init_signals = {
|
||||||
.cred_guard_mutex = __MUTEX_INITIALIZER(init_signals.cred_guard_mutex),
|
.cred_guard_mutex = __MUTEX_INITIALIZER(init_signals.cred_guard_mutex),
|
||||||
.exec_update_lock = __RWSEM_INITIALIZER(init_signals.exec_update_lock),
|
.exec_update_lock = __RWSEM_INITIALIZER(init_signals.exec_update_lock),
|
||||||
#ifdef CONFIG_POSIX_TIMERS
|
#ifdef CONFIG_POSIX_TIMERS
|
||||||
.posix_timers = LIST_HEAD_INIT(init_signals.posix_timers),
|
.posix_timers = HLIST_HEAD_INIT,
|
||||||
.cputimer = {
|
.cputimer = {
|
||||||
.cputime_atomic = INIT_CPUTIME_ATOMIC,
|
.cputime_atomic = INIT_CPUTIME_ATOMIC,
|
||||||
},
|
},
|
||||||
|
|
|
@ -1861,7 +1861,7 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)
|
||||||
prev_cputime_init(&sig->prev_cputime);
|
prev_cputime_init(&sig->prev_cputime);
|
||||||
|
|
||||||
#ifdef CONFIG_POSIX_TIMERS
|
#ifdef CONFIG_POSIX_TIMERS
|
||||||
INIT_LIST_HEAD(&sig->posix_timers);
|
INIT_HLIST_HEAD(&sig->posix_timers);
|
||||||
hrtimer_init(&sig->real_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
hrtimer_init(&sig->real_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||||
sig->real_timer.function = it_real_fn;
|
sig->real_timer.function = it_real_fn;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -515,7 +515,7 @@ static int do_timer_create(clockid_t which_clock, struct sigevent *event,
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
spin_lock_irq(¤t->sighand->siglock);
|
||||||
/* This makes the timer valid in the hash table */
|
/* This makes the timer valid in the hash table */
|
||||||
WRITE_ONCE(new_timer->it_signal, current->signal);
|
WRITE_ONCE(new_timer->it_signal, current->signal);
|
||||||
list_add(&new_timer->list, ¤t->signal->posix_timers);
|
hlist_add_head(&new_timer->list, ¤t->signal->posix_timers);
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
spin_unlock_irq(¤t->sighand->siglock);
|
||||||
/*
|
/*
|
||||||
* After unlocking sighand::siglock @new_timer is subject to
|
* After unlocking sighand::siglock @new_timer is subject to
|
||||||
|
@ -1025,7 +1025,7 @@ retry_delete:
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock(¤t->sighand->siglock);
|
spin_lock(¤t->sighand->siglock);
|
||||||
list_del(&timer->list);
|
hlist_del(&timer->list);
|
||||||
spin_unlock(¤t->sighand->siglock);
|
spin_unlock(¤t->sighand->siglock);
|
||||||
/*
|
/*
|
||||||
* A concurrent lookup could check timer::it_signal lockless. It
|
* A concurrent lookup could check timer::it_signal lockless. It
|
||||||
|
@ -1075,7 +1075,7 @@ retry_delete:
|
||||||
|
|
||||||
goto retry_delete;
|
goto retry_delete;
|
||||||
}
|
}
|
||||||
list_del(&timer->list);
|
hlist_del(&timer->list);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setting timer::it_signal to NULL is technically not required
|
* Setting timer::it_signal to NULL is technically not required
|
||||||
|
@ -1096,22 +1096,19 @@ retry_delete:
|
||||||
*/
|
*/
|
||||||
void exit_itimers(struct task_struct *tsk)
|
void exit_itimers(struct task_struct *tsk)
|
||||||
{
|
{
|
||||||
struct list_head timers;
|
struct hlist_head timers;
|
||||||
struct k_itimer *tmr;
|
|
||||||
|
|
||||||
if (list_empty(&tsk->signal->posix_timers))
|
if (hlist_empty(&tsk->signal->posix_timers))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Protect against concurrent read via /proc/$PID/timers */
|
/* Protect against concurrent read via /proc/$PID/timers */
|
||||||
spin_lock_irq(&tsk->sighand->siglock);
|
spin_lock_irq(&tsk->sighand->siglock);
|
||||||
list_replace_init(&tsk->signal->posix_timers, &timers);
|
hlist_move_list(&tsk->signal->posix_timers, &timers);
|
||||||
spin_unlock_irq(&tsk->sighand->siglock);
|
spin_unlock_irq(&tsk->sighand->siglock);
|
||||||
|
|
||||||
/* The timers are not longer accessible via tsk::signal */
|
/* The timers are not longer accessible via tsk::signal */
|
||||||
while (!list_empty(&timers)) {
|
while (!hlist_empty(&timers))
|
||||||
tmr = list_first_entry(&timers, struct k_itimer, list);
|
itimer_delete(hlist_entry(timers.first, struct k_itimer, list));
|
||||||
itimer_delete(tmr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
|
SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user