From: "Eric W. Biederman" <ebiederm@xmission.com>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: LKML <linux-kernel@vger.kernel.org>,
Anna-Maria Behnsen <anna-maria@linutronix.de>,
Frederic Weisbecker <frederic@kernel.org>,
John Stultz <jstultz@google.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@kernel.org>, Stephen Boyd <sboyd@kernel.org>,
Oleg Nesterov <oleg@redhat.com>
Subject: Re: [patch v4 00/27] posix-timers: Cure the SIG_IGN mess
Date: Fri, 27 Sep 2024 09:39:09 -0500 [thread overview]
Message-ID: <87o749xisy.fsf@email.froward.int.ebiederm.org> (raw)
In-Reply-To: <20240927083900.989915582@linutronix.de> (Thomas Gleixner's message of "Fri, 27 Sep 2024 10:48:39 +0200 (CEST)")
Thomas Gleixner <tglx@linutronix.de> writes:
> This are the remaining bits to cure the SIG_IGN mess. The preparatory work
> from the previous version 3 has been merged already. Version 3 can be found
> here:
>
> https://lore.kernel.org/lkml/20240610163452.591699700@linutronix.de
>
> Last year I reread a 15 years old comment about the SIG_IGN problem:
>
> "FIXME: What we really want, is to stop this timer completely and restart
> it in case the SIG_IGN is removed. This is a non trivial change which
> involves sighand locking (sigh !), which we don't want to do late in the
> release cycle. ... A more complex fix which solves also another related
> inconsistency is already in the pipeline."
>
> The embarrasing part was that I put that comment in back then. So I went
> back and rumaged through old notes as I completely had forgotten why our
> attempts to fix this back then failed.
>
> It turned out that the comment is about right: sighand locking and life
> time issues. So I sat down with the old notes and started to wrap my head
> around this again.
>
> The problem to solve:
>
> Posix interval timers are not rearmed automatically by the kernel for
> various reasons:
>
> 1) To prevent DoS by extremly short intervals.
> 2) To avoid timer overhead when a signal is pending and has not
> yet been delivered.
>
> This is achieved by queueing the signal at timer expiry and rearming the
> timer at signal delivery to user space. This puts the rearming basically
> under scheduler control and the work happens in context of the task which
> asked for the signal.
>
> There is a problem with that vs. SIG_IGN. If a signal has SIG_IGN installed
> as handler, the related signals are discarded. So in case of posix interval
> timers this means that such a timer is never rearmed even when SIG_IGN is
> replaced later with a real handler (including SIG_DFL).
>
> To work around that the kernel self rearms those timers and throttles them
> when the interval is smaller than a tick to prevent a DoS.
>
> That just keeps timers ticking, which obviously has effects on power and
> just creates work for nothing.
>
> So ideally these timers should be stopped and rearmed when SIG_IGN is
> replaced, which aligns with the regular handling of posix timers.
>
> Sounds trivial, but isn't:
>
> 1) Lock ordering.
>
> The timer lock cannot be taken with sighand lock held which is
> problematic vs. the atomicity of sigaction().
>
> 2) Life time rules
>
> The timer and the sigqueue are separate entities which requires a
> lookup of the timer ID in the signal rearm code. This can be handled,
> but the separate life time rules are not necessarily robust.
>
> 3) Finding the relevant timers
>
> Obviosly it is possible to walk the posix timer list under sighand
> lock and handle it from there. That can be expensive especially in the
> case that there are no affected timers as the walk would just end up
> doing nothing.
>
> The following series is a new and this time actually working attempt to
> solve this. It addresses it by:
>
> 1) Embedding the preallocated sigqueue into struct k_itimer, which makes
> the life time rules way simpler and just needs a trivial reference
> count.
>
> 2) Having a separate list in task::signal on which ignored timers are
> queued.
>
> This avoids walking a potentially large timer list for nothing on a
> SIG_IGN to handler transition.
>
> 3) Requeueing the timers signal in the relevant signal queue so the timer
> is rearmed when the signal is actually delivered
>
> That turned out to be the least complicated way to address the sighand
> lock vs. timer lock ordering issue.
>
> With that timers which have their signal ignored are not longer self
> rearmed and the relevant workarounds including throttling for DoS
> prevention are removed.
>
> The series is also available from git:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git posixt-v4
>
> Changes vs. V3:
>
> - Rebased to mainline
>
> - Fixed up a intermediate build breakage reported by 0-day
I have stopped looking at this after patch 4.
The current code can and does handle userspace injecting a signal with
si_sys_private sent to an non-zero value using rt_sigqueueinfo(2) and
that value will be delivered to userspace.
I think the at least the ability to inject such a signal (ignoring
si_sys_private) is very interesting for debuggers and checkpoint restart
applications.
I get the feeling the rest of the patch series depends upon not
supporting userspace injecting signals with si_code == SI_TIMER. That
seems unnecessary.
It seems reasonable to depend upon something like the SIGQUEUE_PREALLOC
in the flags field of struct sigqueue to detect a kernel generated
signal. Rather than adding various hacks to make everything work
with just a struct kernel_siginfo_t. Especially as the timer signals
today are the only signals that are preallocated.
Is there any chance 18/27 posix-timers: Embed sigqueue in struct k_itimer
can be moved up?
That should allow removing the reliance on si_sys_private.
That should prevent the need to add another hack with sys_private_ptr in
struct kernel_siginfo
Perhaps what needs to happen is to update collect_signal to return the
sigqueue entry (if it was preallocated), instead of the resched_timer.
Then the timer code can just use container_of to get the struct
k_itimer?
After that si_sys_private can move into struct k_itimer, and the code
won't need to worry about userspace setting that value, or about needing
to clear that value. As si_sys_private will always be 0 in preallocated
signals.
Eric
next prev parent reply other threads:[~2024-09-27 14:39 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-27 8:48 [patch v4 00/27] posix-timers: Cure the SIG_IGN mess Thomas Gleixner
2024-09-27 8:48 ` [patch v4 01/27] signal: Confine POSIX_TIMERS properly Thomas Gleixner
2024-09-27 12:21 ` Frederic Weisbecker
2024-09-27 8:48 ` [patch v4 02/27] signal: Prevent user space from setting si_sys_private Thomas Gleixner
2024-09-27 12:37 ` Frederic Weisbecker
2024-09-27 13:40 ` Eric W. Biederman
2024-09-27 8:48 ` [patch v4 03/27] signal: Get rid of resched_timer logic Thomas Gleixner
2024-09-27 13:08 ` Frederic Weisbecker
2024-09-27 13:53 ` Eric W. Biederman
2024-09-27 8:48 ` [patch v4 04/27] posix-timers: Cure si_sys_private race Thomas Gleixner
2024-09-27 14:02 ` Eric W. Biederman
2024-09-27 8:48 ` [patch v4 05/27] signal: Allow POSIX timer signals to be dropped Thomas Gleixner
2024-09-27 8:48 ` [patch v4 06/27] posix-timers: Drop signal if timer has been deleted or reprogrammed Thomas Gleixner
2024-09-27 8:48 ` [patch v4 07/27] posix-timers: Rename k_itimer::it_requeue_pending Thomas Gleixner
2024-09-27 8:48 ` [patch v4 08/27] posix-timers: Add proper state tracking Thomas Gleixner
2024-09-27 8:48 ` [patch v4 09/27] posix-timers: Make signal delivery consistent Thomas Gleixner
2024-09-27 8:48 ` [patch v4 10/27] posix-timers: Make signal overrun accounting sensible Thomas Gleixner
2024-09-27 8:48 ` [patch v4 11/27] posix-cpu-timers: Use dedicated flag for CPU timer nanosleep Thomas Gleixner
2024-09-27 8:48 ` [patch v4 12/27] posix-timers: Add a refcount to struct k_itimer Thomas Gleixner
2024-09-27 8:48 ` [patch v4 13/27] signal: Split up __sigqueue_alloc() Thomas Gleixner
2024-09-27 8:48 ` [patch v4 14/27] signal: Provide posixtimer_sigqueue_init() Thomas Gleixner
2024-09-27 8:48 ` [patch v4 15/27] signal: Add sys_private_ptr to siginfo::_sifields:: _timer Thomas Gleixner
2024-09-27 8:48 ` [patch v4 16/27] posix-timers: Store PID type in the timer Thomas Gleixner
2024-09-27 8:48 ` [patch v4 17/27] signal: Refactor send_sigqueue() Thomas Gleixner
2024-09-27 8:49 ` [patch v4 18/27] posix-timers: Embed sigqueue in struct k_itimer Thomas Gleixner
2024-09-27 8:49 ` [patch v4 19/27] signal: Cleanup unused posix-timer leftovers Thomas Gleixner
2024-09-27 8:49 ` [patch v4 20/27] signal: Add task argument to flush_sigqueue_mask() Thomas Gleixner
2024-09-27 8:49 ` [patch v4 21/27] signal: Provide ignored_posix_timers list Thomas Gleixner
2024-09-27 8:49 ` [patch v4 22/27] posix-timers: Handle ignored list on delete and exit Thomas Gleixner
2024-09-27 8:49 ` [patch v4 23/27] signal: Handle ignored signals in do_sigaction(action != SIG_IGN) Thomas Gleixner
2024-09-27 8:49 ` [patch v4 24/27] signal: Queue ignored posixtimers on ignore list Thomas Gleixner
2024-09-27 8:49 ` [patch v4 25/27] posix-timers: Cleanup SIG_IGN workaround leftovers Thomas Gleixner
2024-09-27 8:49 ` [patch v4 26/27] alarmtimers: Remove the throttle mechanism from alarm_forward_now() Thomas Gleixner
2024-09-27 8:49 ` [patch v4 27/27] alarmtimers: Remove return value from alarm functions Thomas Gleixner
2024-09-27 14:39 ` Eric W. Biederman [this message]
2024-09-27 19:24 ` [patch v4 00/27] posix-timers: Cure the SIG_IGN mess 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=87o749xisy.fsf@email.froward.int.ebiederm.org \
--to=ebiederm@xmission.com \
--cc=anna-maria@linutronix.de \
--cc=frederic@kernel.org \
--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.