public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Thomas Gleixner <tglx@linutronix.de>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
	"Paul E. McKenney" <paulmck@kernel.org>,
	Boqun Feng <boqun.feng@gmail.com>,
	Jonathan Corbet <corbet@lwn.net>,
	Prakash Sangappa <prakash.sangappa@oracle.com>,
	Madadi Vineeth Reddy <vineethr@linux.ibm.com>,
	K Prateek Nayak <kprateek.nayak@amd.com>,
	Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	Arnd Bergmann <arnd@arndb.de>,
	linux-arch@vger.kernel.org
Subject: Re: [patch V3 08/12] rseq: Implement time slice extension enforcement timer
Date: Wed, 29 Oct 2025 22:37:17 +0100	[thread overview]
Message-ID: <87ms59tmnm.ffs@tglx> (raw)
In-Reply-To: <20251029144538.5eb5c772@gandalf.local.home>

On Wed, Oct 29 2025 at 14:45, Steven Rostedt wrote:
> On Wed, 29 Oct 2025 14:22:26 +0100 (CET)
> Thomas Gleixner <tglx@linutronix.de> wrote:
>>  rseq_exit_to_user_mode_restart(struct pt_regs *regs, unsigned long ti_work)
>>  {
>> -	if (likely(!test_tif_rseq(ti_work)))
>> -		return false;
>> -
>> -	if (unlikely(__rseq_exit_to_user_mode_restart(regs))) {
>> -		current->rseq.event.slowpath = true;
>> -		set_tsk_thread_flag(current, TIF_NOTIFY_RESUME);
>> -		return true;
>> +	if (unlikely(test_tif_rseq(ti_work))) {
>> +		if (unlikely(__rseq_exit_to_user_mode_restart(regs))) {
>> +			current->rseq.event.slowpath = true;
>> +			set_tsk_thread_flag(current, TIF_NOTIFY_RESUME);
>> +			return true;
>
> Just to make sure I understand this. By setting TIF_NOTIFY_RESUME and
> returning true it can still comeback to set the timer?

No. NOTIFY_RESUME is only set when the access faults or when the user
space memory is corrupted and the grant is moot in that case.

But if TIF_RSEQ is set then a previously granted extensionn is anyway
revoked because that means:

        granted();
        ---> preemption (evtl. migration): Set's TIF_RSEQ
           schedule()
        rseq_exit_to_user_mode_restart()
           if (TIF_RSEQ is set)
              handle_rseq()
                 revoke_grant()
                 
> I guess this also begs the question of if user space can use both the
> restartable sequences at the same time as requesting an extended time slice?

It can and that actually makes sense.

       enter_cs()
         request_grant()
         set_cs()
         ...

interrupt
        set_need_resched()
        exit_to_user_mode()
           if (need_resched()
              grant_extention() // clears NEED_RESCHED
           ...
        rseq_exit_to_user_mode_restart()
           if (IF_RSEQ is set)  // Branch not taken
              ...
           arm_timer()
        return_to_user()

        leave_cs()
          if (granted)
             sys_rseq_sched_yield()

which means the extension grant prevented the critical section to be
aborted. If the extension is not granted or revoked then this behaves
like a regular RSEQ CS abort.

>> +	 * This check prevents that a granted time slice extension exceeds
>
>	   This check prevents a granted time slice ...
>
>> +	 * the maximum scheduling latency when the grant expired before

I'm not a native speaker, but your suggested edit is bogus. Let me
put it into the full sentence:

	   This check prevents a granted time slice extension exceeds
           the maximum ....

Can you spot the fail?

>> +	/*
>> +	 * Store the task pointer as a cookie for comparison in the timer
>> +	 * function. This is safe as the timer is CPU local and cannot be
>> +	 * in the expiry function at this point.
>> +	 */
>
> I'm just curious in this scenario:
>
>   1) Task A requests an extension and is granted.
>       st->cookie = Task A
>       hrtimer_start();
>
>   2) Before getting back to user space, a RT kernel thread wakes up and
>      preempts Task A. Does this clear the timer?

No.

>   3) RT kernel thread finishes but then schedules Task B within the expiry.
>
>   4) Task B requests an extension (assuming it had a short time slice that
>      allowed it to end before the expiry of the original timer).
>
> I guess it doesn't matter that st->cookie = Task B, as Task A was already
> scheduled out. But would calling hrtimer_start() on an existing timer cause
> any issue?

No. The timer is canceled and reprogrammed.

> I guess it doesn't matter as it looks like the code in hrtimer_start() does
> indeed remove an existing timer.

You guessed right :)

>> +	st->cookie = curr;
>> +	hrtimer_start(&st->timer, curr->rseq.slice.expires, HRTIMER_MODE_ABS_PINNED_HARD);
>> +	/* Arm the syscall entry work */
>> +	set_task_syscall_work(curr, SYSCALL_RSEQ_SLICE);
>> +	return false;
>> +}
>> +
>> +static void rseq_cancel_slice_extension_timer(void)
>> +{
>> +	struct slice_timer *st = this_cpu_ptr(&slice_timer);
>> +
>> +	/*
>> +	 * st->cookie can be safely read as preemption is disabled and the
>> +	 * timer is CPU local.
>> +	 *
>> +	 * As this is most probably the first expiring timer, the cancel is
>
>            As this is probably the first ...
>
>> +	 * expensive as it has to reprogram the hardware, but that's less
>> +	 * expensive than going through a full hrtimer_interrupt() cycle
>> +	 * for nothing.
>> +	 *
>> +	 * hrtimer_try_to_cancel() is sufficient here as the timer is CPU
>> +	 * local and once the hrtimer code disabled interrupts the timer
>> +	 * callback cannot be running.
>> +	 */
>> +	if (st->cookie == current)
>> +		hrtimer_try_to_cancel(&st->timer);
>
> If the above scenario did happen, the timer will go off as
> st->cookie == current would likely be false?
>
> Hmm, if it does go off and the task did schedule back in, would it get its
> need_resched set? This is a very unlikely scenario thus I guess it doesn't
> really matter.

Correct.

> I'm just thinking about corner cases and how it could affect this code and
> possibly cause noticeable issues.

Right. That corner case exists and there is not much to be done about it
unless you inflict the timer cancelation into schedule(), which is not
an option at all.

> -- Steve

/me trims 50+ lines of pointless quotation.

Thanks,

        tglx

  reply	other threads:[~2025-10-29 21:37 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-29 13:22 [patch V3 00/12] rseq: Implement time slice extension mechanism Thomas Gleixner
2025-10-29 13:22 ` [patch V3 01/12] sched: Provide and use set_need_resched_current() Thomas Gleixner
2025-10-29 13:22 ` [patch V3 02/12] rseq: Add fields and constants for time slice extension Thomas Gleixner
2025-10-30 22:01   ` Prakash Sangappa
2025-10-31 14:32     ` Thomas Gleixner
2025-10-31 19:31   ` Mathieu Desnoyers
2025-10-31 20:58     ` Thomas Gleixner
2025-11-01 22:53       ` Thomas Gleixner
2025-11-03 17:00       ` Mathieu Desnoyers
2025-11-03 19:19         ` Florian Weimer
2025-11-04  0:20   ` Steven Rostedt
2025-10-29 13:22 ` [patch V3 03/12] rseq: Provide static branch for time slice extensions Thomas Gleixner
2025-10-29 17:23   ` Randy Dunlap
2025-10-29 21:12     ` Thomas Gleixner
2025-10-31 19:34   ` Mathieu Desnoyers
2025-10-29 13:22 ` [patch V3 04/12] rseq: Add statistics " Thomas Gleixner
2025-10-31 19:36   ` Mathieu Desnoyers
2025-10-29 13:22 ` [patch V3 05/12] rseq: Add prctl() to enable " Thomas Gleixner
2025-10-31 19:43   ` Mathieu Desnoyers
2025-10-31 21:05     ` Thomas Gleixner
2025-10-29 13:22 ` [patch V3 06/12] rseq: Implement sys_rseq_slice_yield() Thomas Gleixner
2025-10-31 19:46   ` Mathieu Desnoyers
2025-10-31 21:07     ` Thomas Gleixner
2025-11-03 17:07       ` Mathieu Desnoyers
2025-10-29 13:22 ` [patch V3 07/12] rseq: Implement syscall entry work for time slice extensions Thomas Gleixner
2025-10-31 19:53   ` Mathieu Desnoyers
2025-11-19  0:20   ` Prakash Sangappa
2025-11-19 15:25     ` Thomas Gleixner
2025-11-20  7:37       ` Prakash Sangappa
2025-11-20 11:31         ` Thomas Gleixner
2025-11-21  0:12           ` Prakash Sangappa
2025-11-26 22:02             ` Prakash Sangappa
2025-11-21  9:28           ` david laight
2025-10-29 13:22 ` [patch V3 08/12] rseq: Implement time slice extension enforcement timer Thomas Gleixner
2025-10-29 18:45   ` Steven Rostedt
2025-10-29 21:37     ` Thomas Gleixner [this message]
2025-10-29 23:53       ` Steven Rostedt
2025-10-31 19:59   ` Mathieu Desnoyers
2025-10-29 13:22 ` [patch V3 09/12] rseq: Reset slice extension when scheduled Thomas Gleixner
2025-10-31 20:03   ` Mathieu Desnoyers
2025-10-29 13:22 ` [patch V3 10/12] rseq: Implement rseq_grant_slice_extension() Thomas Gleixner
2025-10-29 20:08   ` Steven Rostedt
2025-10-29 21:46     ` Thomas Gleixner
2025-10-29 22:04       ` Steven Rostedt
2025-10-31 14:33         ` Thomas Gleixner
2025-10-29 13:22 ` [patch V3 11/12] entry: Hook up rseq time slice extension Thomas Gleixner
2025-10-29 13:22 ` [patch V3 12/12] selftests/rseq: Implement time slice extension test Thomas Gleixner
2025-10-29 15:10 ` [patch V3 00/12] rseq: Implement time slice extension mechanism Sebastian Andrzej Siewior
2025-10-29 15:40   ` Steven Rostedt
2025-10-29 21:49     ` Thomas Gleixner
2025-11-06 17:28 ` Prakash Sangappa
2025-11-10 14:23   ` Mathieu Desnoyers
2025-11-10 17:05     ` Mathieu Desnoyers
2025-11-11 16:42     ` Mathieu Desnoyers
2025-11-12  6:30       ` Prakash Sangappa
2025-11-12 20:40         ` Mathieu Desnoyers
2025-11-12 21:57         ` Thomas Gleixner
2025-11-12 23:17           ` Prakash Sangappa
2025-11-13  2:34             ` Prakash Sangappa
2025-11-13 14:38               ` Thomas Gleixner
2025-11-12 20:31       ` Thomas Gleixner
2025-11-12 20:46         ` Mathieu Desnoyers
2025-11-12 21:54           ` 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=87ms59tmnm.ffs@tglx \
    --to=tglx@linutronix.de \
    --cc=arnd@arndb.de \
    --cc=bigeasy@linutronix.de \
    --cc=boqun.feng@gmail.com \
    --cc=corbet@lwn.net \
    --cc=kprateek.nayak@amd.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=paulmck@kernel.org \
    --cc=peterz@infradead.org \
    --cc=prakash.sangappa@oracle.com \
    --cc=rostedt@goodmis.org \
    --cc=vineethr@linux.ibm.com \
    /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