From: Thomas Gleixner <tglx@linutronix.de>
To: Frederic Weisbecker <frederic@kernel.org>
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.1 17/20] signal: Queue ignored posixtimers on ignore list
Date: Mon, 04 Nov 2024 22:31:57 +0100 [thread overview]
Message-ID: <87msieptwy.ffs@tglx> (raw)
In-Reply-To: <87plnbowh6.ffs@tglx>
On Mon, Nov 04 2024 at 16:21, Thomas Gleixner wrote:
> On Mon, Nov 04 2024 at 12:42, Frederic Weisbecker wrote:
>> But there is something more problematic against the delete() path:
>>
>> Thread within Signal target Timer target
>> signal target group
>> -------------------- ------------- -------------
>> timr->it_status = POSIX_TIMER_REQUEUE_PENDING
>> posixtimer_send_sigqueue();
>> do_exit();
>> timer_delete()
>> posix_cpu_timer_del()
>> // return NULL
>> cpu_timer_task_rcu()
>> // timer->it_status NOT set
>> // to POSIX_TIMER_DISARMED
>> hlist_del(&timer->list);
>> posix_timer_cleanup_ignored()
>>
>>
>> do_sigaction(SIG_IGN...)
>> flush_sigqueue_mask()
>> sigqueue_free_ignored()
>> posixtimer_sig_ignore()
>> // Observe POSIX_TIMER_REQUEUE_PENDING
>> hlist_add_head(...ignored_posix_timers)
>> do_exit()
>> exit_itimers()
>> if (hlist_empty(&tsk->signal->posix_timers))
>> return;
>> // leaked timer queued to migrate list
>>
>
> Duh. Let me stare at that some more.
The delete() issue is actually easy to address:
posixtimer_sig_ignore() must check timer->it_signal, which is set to
NULL in timer_delete(). This write must move into the sighand lock
held section, where posix_timer_cleanup_ignored() is invoked.
If NULL, posixtimer_sig_ignore() drops the reference.
If do_sigaction() locked sighand first and moved it to the ignored
list, then posix_timer_cleanup_ignored() will remove it again.
The status part is hard to get right without sighand lock being held,
but it is required to ensure that a pending one-shot timer signal is
dropped in do_sigaction(SIG_IGN).
There is an easy fix for that too:
posixtimer_send_siqqueue() does the following under sighand lock:
timer->it_sig_periodic = timer->it_status == POSIX_TIMER_REQUEUE_PENDING;
posixtimer_sig_ignore() checks that flag. If not set it can drop the
reference independent of the actual status of the timer. If the timer
was rearmed as periodic, then it did not expire yet because the expiry
would have set the flag. If it expires concurrently the expiry
function is stuck on sighand::siglock.
If the flag is set then the signal will go onto the ignored list and
un-ignore will move it back to the pending list. That's not a problem
in the case that the timer was re/dis-armed before or after moving, as
this is all covered by the sequence check.
All of that works because in both cases the protection scheme on the
timer side is that both timer::lock and sighand::siglock have to be held
for modifying
timer::it_sigqueue_seq
timer::it_signal
timer::it_sig_periodic
which means that on the signal side holding sighand::siglock is enough.
In posixtimer_deliver_signal() holding the timer lock is sufficient to
do the sequence validation against timer::it_sig_periodic.
I'll fixup the inconsistent state thing in posix-cpu-timers too and send
out a v7 soon.
Thanks a lot for studying this in detail!
tglx
next prev parent reply other threads:[~2024-11-04 21:32 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
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 [this message]
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=87msieptwy.ffs@tglx \
--to=tglx@linutronix.de \
--cc=anna-maria@linutronix.de \
--cc=ebiederm@xmission.com \
--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 \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox