All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrea Righi <arighi@nvidia.com>
To: Kuba Piecuch <jpiecuch@google.com>
Cc: Tejun Heo <tj@kernel.org>, Changwoo Min <changwoo@igalia.com>,
	David Vernet <void@manifault.com>,
	Christian Loehle <christian.loehle@arm.com>,
	linux-kernel@vger.kernel.org, sched-ext@lists.linux.dev
Subject: Re: [PATCH v2 sched_ext/for-7.1] sched_ext: Documentation: improve accuracy of task lifecycle pseudo-code
Date: Thu, 9 Apr 2026 19:46:18 +0200	[thread overview]
Message-ID: <adfl6iuDWHYp9fZN@gpd4> (raw)
In-Reply-To: <20260409165744.1526489-1-jpiecuch@google.com>

On Thu, Apr 09, 2026 at 04:57:44PM +0000, Kuba Piecuch wrote:
> * Add ops.quiescent() and ops.runnable() to the sched_change path.
>   When a queued task has one of its scheduling properties changed
>   (e.g. nice, affinity), it goes through dequeue() -> quiescent() ->
>   (property change callback, e.g. ops.set_weight()) -> runnable() ->
>   enqueue().
> 
> * Change && to || in ops.enqueue() condition. We want to enqueue tasks
>   that have a non-zero slice and are not in any DSQ.
> 
> * Call ops.dispatch() and ops.dequeue() only for tasks that have had
>   ops.enqueue() called. This is to account for tasks direct-dispatched
>   from ops.select_cpu().
> 
> * Add a note explaining that the pseudo-code provides a simplified view
>   of the task lifecycle and list some examples of cases that the
>   pseudo-code does not account for.
> 
> Fixes: a4f61f0a1afd ("sched_ext: Documentation: Add ops.dequeue() to task lifecycle")
> Signed-off-by: Kuba Piecuch <jpiecuch@google.com>

Looks good to me.

Reviewed-by: Andrea Righi <arighi@nvidia.com>$

Thanks,
-Andrea

> ---
> 
> Changes in v2:
>  - Changed && to || in ops.enqueue() condition (Andrea)
>  - Moved ops.dispatch() and ops.dequeue() inside the if statement
>    (Andrea)
>  - Added a note after the pseudo-code with examples of cases that the
>    pseudo-code does not account for
>  - Link to v1: https://lore.kernel.org/all/20260408091821.91063-1-jpiecuch@google.com
> 
>  Documentation/scheduler/sched-ext.rst | 43 ++++++++++++++++++++++-----
>  1 file changed, 36 insertions(+), 7 deletions(-)
> 
> diff --git a/Documentation/scheduler/sched-ext.rst b/Documentation/scheduler/sched-ext.rst
> index ec594ae8086de..2d77ab4816a63 100644
> --- a/Documentation/scheduler/sched-ext.rst
> +++ b/Documentation/scheduler/sched-ext.rst
> @@ -408,8 +408,8 @@ for more information.
>  Task Lifecycle
>  --------------
>  
> -The following pseudo-code summarizes the entire lifecycle of a task managed
> -by a sched_ext scheduler:
> +The following pseudo-code presents a rough overview the entire lifecycle
> +of a task managed by a sched_ext scheduler:
>  
>  .. code-block:: c
>  
> @@ -423,20 +423,25 @@ by a sched_ext scheduler:
>          ops.runnable();         /* Task becomes ready to run */
>  
>          while (task_is_runnable(task)) {
> -            if (task is not in a DSQ && task->scx.slice == 0) {
> +            if (task is not in a DSQ || task->scx.slice == 0) {
>                  ops.enqueue();  /* Task can be added to a DSQ */
>  
>                  /* Task property change (i.e., affinity, nice, etc.)? */
>                  if (sched_change(task)) {
>                      ops.dequeue(); /* Exiting BPF scheduler custody */
> +                    ops.quiescent();
> +
> +                    /* Property change callback, e.g. ops.set_weight() */
> +
> +                    ops.runnable();
>                      continue;
>                  }
> -            }
>  
> -            /* Any usable CPU becomes available */
> +                /* Any usable CPU becomes available */
>  
> -            ops.dispatch();     /* Task is moved to a local DSQ */
> -            ops.dequeue();      /* Exiting BPF scheduler custody */
> +                ops.dispatch();     /* Task is moved to a local DSQ */
> +                ops.dequeue();      /* Exiting BPF scheduler custody */
> +            }
>  
>              ops.running();      /* Task starts running on its assigned CPU */
>  
> @@ -456,6 +461,30 @@ by a sched_ext scheduler:
>      ops.disable();              /* Disable BPF scheduling for the task */
>      ops.exit_task();            /* Task is destroyed */
>  
> +Note that the above pseudo-code does not cover all possible state transitions
> +and edge cases, to name a few examples:
> +
> +* ``ops.dispatch()`` may fail to move the task to a local DSQ due to a racing
> +  property change on that task, in which case ``ops.dispatch()`` will be
> +  retried.
> +
> +* The task may be direct-dispatched to a local DSQ from ``ops.enqueue()``,
> +  in which case ``ops.dispatch()`` and ``ops.dequeue()`` are skipped and we go
> +  straight to ``ops.running()``.
> +
> +* Property changes may occur at virtually any point during the task's lifecycle,
> +  not just when the task is queued and waiting to be dispatched. For example,
> +  changing a property of a running task will lead to the callback sequence
> +  ``ops.stopping()`` -> ``ops.quiescent()`` -> (property change callback) ->
> +  ``ops.runnable()`` -> ``ops.running()``.
> +
> +* A sched_ext task can be preempted by a task from a higher-priority scheduling
> +  class, in which it will exit the tick-dispatch loop even though it is runnable
> +  and has a non-zero slice.
> +
> +See the "Scheduling Cycle" section for a more detailed description of how
> +a freshly woken up task gets on a CPU.
> +
>  Where to Look
>  =============
>  
> -- 
> 2.53.0.1213.gd9a14994de-goog
> 

  reply	other threads:[~2026-04-09 17:46 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-09 16:57 [PATCH v2 sched_ext/for-7.1] sched_ext: Documentation: improve accuracy of task lifecycle pseudo-code Kuba Piecuch
2026-04-09 17:46 ` Andrea Righi [this message]
2026-04-10  8:54 ` Tejun Heo

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=adfl6iuDWHYp9fZN@gpd4 \
    --to=arighi@nvidia.com \
    --cc=changwoo@igalia.com \
    --cc=christian.loehle@arm.com \
    --cc=jpiecuch@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sched-ext@lists.linux.dev \
    --cc=tj@kernel.org \
    --cc=void@manifault.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 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.