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:
Thomas Gleixner 2024-06-10 18:42:28 +02:00 committed by Frederic Weisbecker
parent aca1dc0ce1
commit 52dea0a15c
6 changed files with 15 additions and 18 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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,
}, },

View File

@ -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

View File

@ -515,7 +515,7 @@ static int do_timer_create(clockid_t which_clock, struct sigevent *event,
spin_lock_irq(&current->sighand->siglock); spin_lock_irq(&current->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, &current->signal->posix_timers); hlist_add_head(&new_timer->list, &current->signal->posix_timers);
spin_unlock_irq(&current->sighand->siglock); spin_unlock_irq(&current->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(&current->sighand->siglock); spin_lock(&current->sighand->siglock);
list_del(&timer->list); hlist_del(&timer->list);
spin_unlock(&current->sighand->siglock); spin_unlock(&current->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,