All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Vincent Guittot <vincent.guittot@linaro.org>
Cc: K Prateek Nayak <kprateek.nayak@amd.com>,
	mingo@redhat.com, juri.lelli@redhat.com,
	dietmar.eggemann@arm.com, rostedt@goodmis.org,
	bsegall@google.com, mgorman@suse.de, vschneid@redhat.com,
	linux-kernel@vger.kernel.org, qyousef@layalina.io
Subject: Re: [PATCH 6/6 v3] sched/eevdf: Speedup short slice task scheduling
Date: Fri, 26 Jun 2026 00:28:43 +0200	[thread overview]
Message-ID: <20260625222843.GE1181229@noisy.programming.kicks-ass.net> (raw)
In-Reply-To: <CAKfTPtCUtwudB+2Ln0nbDKrqC0rFEfr1Oyp6RzCuFPo1-O9MLw@mail.gmail.com>

On Thu, Jun 25, 2026 at 02:59:16PM +0200, Vincent Guittot wrote:
> On Thu, 25 Jun 2026 at 14:57, Vincent Guittot
> <vincent.guittot@linaro.org> wrote:
> >
> > On Thu, 25 Jun 2026 at 12:10, Peter Zijlstra <peterz@infradead.org> wrote:
> > >
> > > On Thu, Jun 25, 2026 at 10:37:20AM +0200, Peter Zijlstra wrote:
> > > > On Thu, Jun 25, 2026 at 01:07:43PM +0530, K Prateek Nayak wrote:
> > > >
> > > > > > +static u64 eligible_vruntime(struct cfs_rq *cfs_rq, struct sched_entity *se)
> > > > > > +{
> > > > > > + struct sched_entity *curr = cfs_rq->curr;
> > > > >
> > > > > curr seems to be unused here and is NULL anyways when
> > > > > set_protect_slice() is called ;-)
> > > >
> > > > Ah, but it is not with the flat patches on, which is why I was a little
> > > > confused ;-)
> > > >
> > > > That said; I now see se == curr. So let me go have another look at all
> > > > that.
> > >
> > > I might be slow -- it is definitely waay to warm already -- but I'm not
> > > seeing how you don't want avg_vruntime() here.
> >
> > It is somehow related to avg_vruntime() except that I don't want the
> > current avg_vruntime but the avg_vruntime when entity_key(se) will be
> > null and se will become ineligible
> >
> > If I use current avg_vruntime(), once se will have run enough to get
> > its vruntime == (now old) avg_vruntime, the new avg_vruntime will have
> > move forward and the se's vruntime will  still be eligible
> 
> And I should name it ineligible_vruntime because of the +1

I've ended up with something like so.

---
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -777,6 +777,67 @@ u64 avg_vruntime(struct cfs_rq *cfs_rq)
 	return cfs_rq->zero_vruntime;
 }
 
+/*
+ *     \Sum (v_i - v0)*w_i
+ * V = ------------------- + v0
+ *          \Sum w_i
+ *
+ * Let W = \Sum w_i, and move v_j such that 'v_j == V', thus:
+ *
+ * V = 1/W * {(v_j - v0)*w_j + \Sum_i!=j (v_i - v0)*w_i} + v0
+ *
+ * v_j = 1/W * {(v_j - v0)*w_j + \Sum_i!=j (v_i - v0)*w_i} + v0
+ *
+ * v_j = 1/W * (v_j - v0)*w_j + 1/W * \Sum_i!=j (v_i - v0)*w_i + v0
+ *
+ * v_j - 1/W * (v_j - v0)*w_j = 1/W * \Sum_i!=j (v_i - v0)*w_i + v0
+ *
+ * v_j*W - (v_j - v0)*w_j = \Sum_i!=j (v_i - v0)*w_i + v0*W
+ *
+ * v_j*(W - w_j) + v0*w_j = \Sum_i!=j (v_i - v0)*w_i + v0*W
+ *
+ * v_j*(W - w_j) = \Sum_i!=j (v_i - v0)*w_i + v0*(W - w_j)
+ *
+ *       \Sum_i!=j (v_i - v0)*w_i 
+ * v_j = ------------------------ + v0
+ *               W - w_j
+ *
+ * When v_j happens to be curr, then '\Sum_i!=j (v_i - v0)*w_i'
+ * is cfs_rq->sum_w_runtime, and 'W - w_j' is cfs_rq->sum_weight, since curr
+ * is not included in the sum.
+ */
+static u64 ineligible_vruntime(struct cfs_rq *cfs_rq)
+{
+	struct sched_entity *curr = cfs_rq->curr;
+	long weight = cfs_rq->sum_weight;
+	s64 delta = 0;
+
+	if (curr && !curr->on_rq)
+		curr = NULL;
+
+	/*
+	 * This is called from set_next_task_fair(.first=true) /
+	 * set_protect_slice() so curr had better be set and on_rq.
+	 */
+	WARN_ON_ONCE(!curr);
+
+	if (weight) {
+		s64 runtime = cfs_rq->sum_w_vruntime;
+
+		/*
+		 * Do not add @curr to obtain the effective '- w_j' terms.
+		 */
+
+		/* sign flips effective floor / ceiling */
+		if (runtime < 0)
+			runtime -= (weight - 1);
+
+		delta = div64_long(runtime, weight);
+	}
+
+	return cfs_rq->zero_vruntime + delta + 1;
+}
+
 static inline u64 cfs_rq_max_slice(struct cfs_rq *cfs_rq);
 
 /*
@@ -1058,8 +1119,14 @@ static inline void set_protect_slice(str
 		slice = cfs_rq_min_slice(cfs_rq);
 
 	slice = min(slice, se->slice);
-	if (slice != se->slice)
-		vprot = min_vruntime(vprot, se->vruntime + calc_delta_fair(slice, se));
+
+	/* If there are shorter slices than se's one */
+	if (slice != se->slice) {
+		if (sched_feat(PREEMPT_SHORT))
+			vprot = min_vruntime(vprot, ineligible_vruntime(cfs_rq));
+		else
+			vprot = min_vruntime(vprot, se->vruntime + calc_delta_fair(slice, se));
+	}
 
 	se->vprot = vprot;
 }

  reply	other threads:[~2026-06-25 22:28 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-24 15:12 [PATCH 0/6 v3] sched/eevdf: Improve scheduling latency of short slice task Vincent Guittot
2026-06-24 15:12 ` [PATCH 1/6 v3] sched/fair: Set next buddy for preempt short Vincent Guittot
2026-06-25  6:24   ` K Prateek Nayak
2026-06-25 12:40     ` Vincent Guittot
2026-06-25 12:43       ` Peter Zijlstra
2026-06-26  6:54       ` Peter Zijlstra
2026-06-26  7:02         ` Vincent Guittot
2026-06-26  8:08           ` Peter Zijlstra
2026-06-26  8:55             ` Vincent Guittot
2026-06-30  9:03   ` [tip: sched/core] " tip-bot2 for Vincent Guittot
2026-06-24 15:12 ` [PATCH 2/6 v3] sched/eevdf: Take into account current's lag when updating slice protection Vincent Guittot
2026-06-30  9:03   ` [tip: sched/core] " tip-bot2 for Vincent Guittot
2026-06-24 15:12 ` [PATCH 3/6 v3] sched/eevdf: Update slice protection even when resched is already set Vincent Guittot
2026-06-26  7:21   ` Peter Zijlstra
2026-06-26  7:46     ` Peter Zijlstra
2026-06-30  9:03       ` [tip: sched/core] sched/core: Fix inter-class wakeup_preempt() tip-bot2 for Peter Zijlstra
2026-06-30  9:03   ` [tip: sched/core] sched/eevdf: Update slice protection even when resched is already set tip-bot2 for Vincent Guittot
2026-06-24 15:12 ` [PATCH 4/6 v3] sched/eevdf: Cancel slice protection if short slice task is eligible Vincent Guittot
2026-06-25  6:00   ` K Prateek Nayak
2026-06-25 12:40     ` Vincent Guittot
2026-06-26  5:51       ` Shubhang Kaushik
2026-06-26  7:39         ` Vincent Guittot
2026-06-30  9:03   ` [tip: sched/core] " tip-bot2 for Vincent Guittot
2026-06-24 15:12 ` [PATCH 5/6 v3] sched/eevdf: Always update slice protection Vincent Guittot
2026-06-30  9:03   ` [tip: sched/core] " tip-bot2 for Vincent Guittot
2026-06-24 15:12 ` [PATCH 6/6 v3] sched/eevdf: Speedup short slice task scheduling Vincent Guittot
2026-06-25  7:37   ` K Prateek Nayak
2026-06-25  8:37     ` Peter Zijlstra
2026-06-25 10:09       ` Peter Zijlstra
2026-06-25 12:57         ` Vincent Guittot
2026-06-25 12:59           ` Vincent Guittot
2026-06-25 22:28             ` Peter Zijlstra [this message]
2026-06-26  3:57               ` K Prateek Nayak
2026-06-26  6:41                 ` Peter Zijlstra
2026-06-26  7:05                 ` Vincent Guittot
2026-06-26  7:18                   ` Peter Zijlstra
2026-06-26  7:54                     ` Peter Zijlstra
2026-06-26  8:55                       ` Vincent Guittot
2026-06-26 13:55                         ` Vincent Guittot
2026-06-29 14:25                           ` Vincent Guittot
2026-06-25 14:55       ` Vincent Guittot
2026-06-25 12:51     ` Vincent Guittot
2026-06-25  8:33   ` Peter Zijlstra
2026-06-30  9:03   ` [tip: sched/core] " tip-bot2 for Vincent Guittot

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=20260625222843.GE1181229@noisy.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=bsegall@google.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=juri.lelli@redhat.com \
    --cc=kprateek.nayak@amd.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mgorman@suse.de \
    --cc=mingo@redhat.com \
    --cc=qyousef@layalina.io \
    --cc=rostedt@goodmis.org \
    --cc=vincent.guittot@linaro.org \
    --cc=vschneid@redhat.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.