Commit ff384240 authored by Wang Tao's avatar Wang Tao Committed by Peter Zijlstra
Browse files

sched/eevdf: Update se->vprot in reweight_entity()



In the EEVDF framework with Run-to-Parity protection, `se->vprot` is an
independent variable defining the virtual protection timestamp.

When `reweight_entity()` is called (e.g., via nice/renice), it performs
the following actions to preserve Lag consistency:
 1. Scales `se->vlag` based on the new weight.
 2. Calls `place_entity()`, which recalculates `se->vruntime` based on
    the new weight and scaled lag.

However, the current implementation fails to update `se->vprot`, leading
to mismatches between the task's actual runtime and its expected duration.

Fixes: 63304558 ("sched/eevdf: Curb wakeup-preemption")
Suggested-by: default avatarZhang Qiao <zhangqiao22@huawei.com>
Signed-off-by: default avatarWang Tao <wangtao554@huawei.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
Tested-by: default avatarK Prateek Nayak <kprateek.nayak@amd.com>
Tested-by: default avatarShubhang Kaushik <shubhang@os.amperecomputing.com>
Link: https://patch.msgid.link/20260120123113.3518950-1-wangtao554@huawei.com
parent bcd74b2f
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -3815,6 +3815,8 @@ static void reweight_entity(struct cfs_rq *cfs_rq, struct sched_entity *se,
			    unsigned long weight)
{
	bool curr = cfs_rq->curr == se;
	bool rel_vprot = false;
	u64 vprot;

	if (se->on_rq) {
		/* commit outstanding execution time */
@@ -3822,6 +3824,11 @@ static void reweight_entity(struct cfs_rq *cfs_rq, struct sched_entity *se,
		update_entity_lag(cfs_rq, se);
		se->deadline -= se->vruntime;
		se->rel_deadline = 1;
		if (curr && protect_slice(se)) {
			vprot = se->vprot - se->vruntime;
			rel_vprot = true;
		}

		cfs_rq->nr_queued--;
		if (!curr)
			__dequeue_entity(cfs_rq, se);
@@ -3837,6 +3844,9 @@ static void reweight_entity(struct cfs_rq *cfs_rq, struct sched_entity *se,
	if (se->rel_deadline)
		se->deadline = div_s64(se->deadline * se->load.weight, weight);

	if (rel_vprot)
		vprot = div_s64(vprot * se->load.weight, weight);

	update_load_set(&se->load, weight);

	do {
@@ -3848,6 +3858,8 @@ static void reweight_entity(struct cfs_rq *cfs_rq, struct sched_entity *se,
	enqueue_load_avg(cfs_rq, se);
	if (se->on_rq) {
		place_entity(cfs_rq, se, 0);
		if (rel_vprot)
			se->vprot = se->vruntime + vprot;
		update_load_add(&cfs_rq->load, se->load.weight);
		if (!curr)
			__enqueue_entity(cfs_rq, se);