From: Frederic Weisbecker <frederic@kernel.org>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: LKML <linux-kernel@vger.kernel.org>,
Anna-Maria Behnsen <anna-maria@linutronix.de>,
John Stultz <jstultz@google.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@kernel.org>, Stephen Boyd <sboyd@kernel.org>,
Eric Biederman <ebiederm@xmission.com>,
Oleg Nesterov <oleg@redhat.com>
Subject: Re: [patch v6 15/20] posix-timers: Handle ignored list on delete and exit
Date: Fri, 1 Nov 2024 14:47:38 +0100 [thread overview]
Message-ID: <ZyTb-oMrREz006d5@localhost.localdomain> (raw)
In-Reply-To: <20241031154425.498474639@linutronix.de>
Le Thu, Oct 31, 2024 at 04:46:41PM +0100, Thomas Gleixner a écrit :
> From: Thomas Gleixner <tglx@linutronix.de>
>
> To handle posix timer signals on sigaction(SIG_IGN) properly, the timers
> will be queued on a separate ignored list.
>
> Add the necessary cleanup code for timer_delete() and exit_itimers().
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> ---
> V6: Warn when the ignored list is not empty after deleting all timers in
> exit_itimers()
> ---
> include/linux/posix-timers.h | 4 +++-
> kernel/time/posix-timers.c | 26 ++++++++++++++++++++++++++
> 2 files changed, 29 insertions(+), 1 deletion(-)
> ---
>
> --- a/include/linux/posix-timers.h
> +++ b/include/linux/posix-timers.h
> @@ -152,7 +152,8 @@ static inline void posix_cputimers_init_
>
> /**
> * struct k_itimer - POSIX.1b interval timer structure.
> - * @list: List head for binding the timer to signals->posix_timers
> + * @list: List node for binding the timer to tsk::signal::posix_timers
> + * @ignored_list: List node for tracking ignored timers in tsk::signal::ignored_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
> @@ -176,6 +177,7 @@ static inline void posix_cputimers_init_
> */
> struct k_itimer {
> struct hlist_node list;
> + struct hlist_node ignored_list;
> struct hlist_node t_hash;
> spinlock_t it_lock;
> const struct k_clock *kclock;
> --- a/kernel/time/posix-timers.c
> +++ b/kernel/time/posix-timers.c
> @@ -1027,6 +1027,18 @@ int common_timer_del(struct k_itimer *ti
> return 0;
> }
>
> +/*
> + * If the deleted timer is on the ignored list, remove it and
> + * drop the associated reference.
> + */
> +static inline void posix_timer_cleanup_ignored(struct k_itimer *tmr)
> +{
> + if (!hlist_unhashed(&tmr->ignored_list)) {
> + hlist_del_init(&tmr->ignored_list);
> + posixtimer_putref(tmr);
> + }
> +}
> +
> static inline int timer_delete_hook(struct k_itimer *timer)
> {
> const struct k_clock *kc = timer->kclock;
> @@ -1059,6 +1071,7 @@ SYSCALL_DEFINE1(timer_delete, timer_t, t
>
> spin_lock(¤t->sighand->siglock);
> hlist_del(&timer->list);
> + posix_timer_cleanup_ignored(timer);
> spin_unlock(¤t->sighand->siglock);
> /*
> * A concurrent lookup could check timer::it_signal lockless. It
> @@ -1110,6 +1123,8 @@ static void itimer_delete(struct k_itime
> }
> hlist_del(&timer->list);
>
> + posix_timer_cleanup_ignored(timer);
> +
> /*
> * Setting timer::it_signal to NULL is technically not required
> * here as nothing can access the timer anymore legitimately via
> @@ -1142,6 +1157,17 @@ void exit_itimers(struct task_struct *ts
> /* The timers are not longer accessible via tsk::signal */
> while (!hlist_empty(&timers))
> itimer_delete(hlist_entry(timers.first, struct k_itimer, list));
> +
> + /*
> + * There should be no timers on the ignored list. itimer_delete() has
> + * mopped them up.
> + */
> + if (!WARN_ON_ONCE(!hlist_empty(&tsk->signal->ignored_posix_timers)))
> + return;
> +
> + hlist_move_list(&tsk->signal->ignored_posix_timers, &timers);
> + while (!hlist_empty(&timers))
> + posix_timer_cleanup_ignored(hlist_entry(timers.first, struct k_itimer, list));
s/list/ignored_list ?
Other than that:
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
> }
>
> SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
>
>
next prev parent reply other threads:[~2024-11-01 13:47 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-31 15:46 [patch v6 00/20] posix-timers: Cure the SIG_IGN mess Thomas Gleixner
2024-10-31 15:46 ` [patch v6 01/20] posix-timers: Make signal delivery consistent Thomas Gleixner
2024-11-01 12:26 ` Frederic Weisbecker
2024-10-31 15:46 ` [patch v6 02/20] posix-timers: Make signal overrun accounting sensible Thomas Gleixner
2024-11-01 12:51 ` Frederic Weisbecker
2024-11-01 20:36 ` Thomas Gleixner
2024-11-02 19:41 ` Thomas Gleixner
2024-11-02 22:57 ` Frederic Weisbecker
2024-10-31 15:46 ` [patch v6 03/20] posix-cpu-timers: Cleanup the firing logic Thomas Gleixner
2024-11-01 13:14 ` Frederic Weisbecker
2024-10-31 15:46 ` [patch v6 04/20] posix-cpu-timers: Use dedicated flag for CPU timer nanosleep Thomas Gleixner
2024-10-31 15:46 ` [patch v6 05/20] posix-timers: Add a refcount to struct k_itimer Thomas Gleixner
2024-10-31 15:46 ` [patch v6 06/20] signal: Split up __sigqueue_alloc() Thomas Gleixner
2024-10-31 15:46 ` [patch v6 07/20] signal: Provide posixtimer_sigqueue_init() Thomas Gleixner
2024-10-31 15:46 ` [patch v6 08/20] posix-timers: Store PID type in the timer Thomas Gleixner
2024-10-31 15:46 ` [patch v6 09/20] signal: Refactor send_sigqueue() Thomas Gleixner
2024-10-31 15:46 ` [patch v6 10/20] signal: Replace resched_timer logic Thomas Gleixner
2024-11-01 13:25 ` Frederic Weisbecker
2024-10-31 15:46 ` [patch v6 11/20] posix-timers: Embed sigqueue in struct k_itimer Thomas Gleixner
2024-10-31 15:46 ` [patch v6 12/20] signal: Cleanup unused posix-timer leftovers Thomas Gleixner
2024-10-31 15:46 ` [patch v6 13/20] posix-timers: Move sequence logic into struct k_itimer Thomas Gleixner
2024-10-31 15:46 ` [patch v6 14/20] signal: Provide ignored_posix_timers list Thomas Gleixner
2024-10-31 15:46 ` [patch v6 15/20] posix-timers: Handle ignored list on delete and exit Thomas Gleixner
2024-11-01 13:47 ` Frederic Weisbecker [this message]
2024-11-01 20:38 ` Thomas Gleixner
2024-10-31 15:46 ` [patch v6 16/20] signal: Handle ignored signals in do_sigaction(action != SIG_IGN) Thomas Gleixner
2024-11-01 14:04 ` Frederic Weisbecker
2024-10-31 15:46 ` [patch v6 17/20] signal: Queue ignored posixtimers on ignore list Thomas Gleixner
2024-11-01 14:21 ` Frederic Weisbecker
2024-11-01 20:47 ` Thomas Gleixner
2024-11-02 14:49 ` Thomas Gleixner
2024-11-02 20:57 ` Thomas Gleixner
2024-11-02 23:46 ` Frederic Weisbecker
2024-11-03 9:44 ` Thomas Gleixner
2024-11-03 19:55 ` Frederic Weisbecker
2024-11-02 21:05 ` [patch v6.1 " Thomas Gleixner
2024-11-04 11:42 ` Frederic Weisbecker
2024-11-04 15:21 ` Thomas Gleixner
2024-11-04 21:31 ` Thomas Gleixner
2024-11-04 23:02 ` Frederic Weisbecker
2024-10-31 15:46 ` [patch v6 18/20] posix-timers: Cleanup SIG_IGN workaround leftovers Thomas Gleixner
2024-10-31 15:46 ` [patch v6 19/20] alarmtimers: Remove the throttle mechanism from alarm_forward_now() Thomas Gleixner
2024-10-31 15:46 ` [patch v6 20/20] alarmtimers: Remove return value from alarm functions Thomas Gleixner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZyTb-oMrREz006d5@localhost.localdomain \
--to=frederic@kernel.org \
--cc=anna-maria@linutronix.de \
--cc=ebiederm@xmission.com \
--cc=jstultz@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=sboyd@kernel.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.