]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
sched/eevdf: Update se->vprot in reweight_entity()
authorWang Tao <wangtao554@huawei.com>
Tue, 20 Jan 2026 12:31:13 +0000 (12:31 +0000)
committerPeter Zijlstra <peterz@infradead.org>
Mon, 23 Feb 2026 10:19:18 +0000 (11:19 +0100)
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: 63304558ba5d ("sched/eevdf: Curb wakeup-preemption")
Suggested-by: Zhang Qiao <zhangqiao22@huawei.com>
Signed-off-by: Wang Tao <wangtao554@huawei.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
Tested-by: K Prateek Nayak <kprateek.nayak@amd.com>
Tested-by: Shubhang Kaushik <shubhang@os.amperecomputing.com>
Link: https://patch.msgid.link/20260120123113.3518950-1-wangtao554@huawei.com
kernel/sched/fair.c

index f2b46c33a8c5521ad1f24f66cec3d9f3fa86db0b..93fa5b8313e455b96da4bb001af1380a8cf0fd0d 100644 (file)
@@ -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);