From nobody Thu Apr 9 00:19:19 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BE9D2C4332F for ; Thu, 3 Nov 2022 11:38:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229733AbiKCLip (ORCPT ); Thu, 3 Nov 2022 07:38:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50762 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231381AbiKCLiZ (ORCPT ); Thu, 3 Nov 2022 07:38:25 -0400 Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 74EAA11C3B for ; Thu, 3 Nov 2022 04:38:24 -0700 (PDT) Received: from dggpeml500020.china.huawei.com (unknown [172.30.72.55]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4N31sC4BtVzJnL5; Thu, 3 Nov 2022 19:35:27 +0800 (CST) Received: from dggpeml500018.china.huawei.com (7.185.36.186) by dggpeml500020.china.huawei.com (7.185.36.88) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Thu, 3 Nov 2022 19:38:22 +0800 Received: from huawei.com (10.67.174.191) by dggpeml500018.china.huawei.com (7.185.36.186) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Thu, 3 Nov 2022 19:38:22 +0800 From: Zhang Qiao To: , , , , CC: , , , , , , , , Zhang Qiao Subject: [PATCH v2 1/2] sched: Init new task's vruntime after select cpu Date: Thu, 3 Nov 2022 20:07:19 +0800 Message-ID: <20221103120720.39873-2-zhangqiao22@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20221103120720.39873-1-zhangqiao22@huawei.com> References: <20221103120720.39873-1-zhangqiao22@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.67.174.191] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggpeml500018.china.huawei.com (7.185.36.186) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When create a new task, we initialize vruntime of the new task at sched_cgroup_fork(). However, this action is executed too early and may be incorrect, because it use current cpu to init the vruntime, but the new task actually runs on the cpu assigned at wake_up_new_task(). So the patch call task_fork() after select fork cpu and use the ready cpu(the child will run on it) init the new task. Signed-off-by: Zhang Qiao --- v1->v2: make sched_task_fork static. kernel/sched/core.c | 7 ++++++- kernel/sched/fair.c | 7 +------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index e4ce124ec701..21481bd22bdf 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -4627,9 +4627,13 @@ void sched_cgroup_fork(struct task_struct *p, struct= kernel_clone_args *kargs) * so use __set_task_cpu(). */ __set_task_cpu(p, smp_processor_id()); + raw_spin_unlock_irqrestore(&p->pi_lock, flags); +} + +static void sched_task_fork(struct task_struct *p) +{ if (p->sched_class->task_fork) p->sched_class->task_fork(p); - raw_spin_unlock_irqrestore(&p->pi_lock, flags); } =20 void sched_post_fork(struct task_struct *p) @@ -4682,6 +4686,7 @@ void wake_up_new_task(struct task_struct *p) #endif rq =3D __task_rq_lock(p, &rf); update_rq_clock(rq); + sched_task_fork(p); post_init_entity_util_avg(p); =20 activate_task(rq, p, ENQUEUE_NOCLOCK); diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index e4a0b8bd941c..34845d425180 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -11603,12 +11603,8 @@ static void task_fork_fair(struct task_struct *p) struct cfs_rq *cfs_rq; struct sched_entity *se =3D &p->se, *curr; struct rq *rq =3D this_rq(); - struct rq_flags rf; =20 - rq_lock(rq, &rf); - update_rq_clock(rq); - - cfs_rq =3D task_cfs_rq(current); + cfs_rq =3D task_cfs_rq(p); curr =3D cfs_rq->curr; if (curr) { update_curr(cfs_rq); @@ -11626,7 +11622,6 @@ static void task_fork_fair(struct task_struct *p) } =20 se->vruntime -=3D cfs_rq->min_vruntime; - rq_unlock(rq, &rf); } =20 /* --=20 2.17.1