From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 54EA84183B2 for ; Fri, 5 Jun 2026 09:21:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780651305; cv=none; b=rlFGaYWmTMcQO1xXRCwNdfl5H6Cwj+oAjlWNXE/w/O0V+Uy6zGblnH7HWgYBf6OcCmTkJnASFClpLN316OllZvAi1NQe3AFlHXwOv8UYfdHQUKZsKV/znIobqsmF+OOMPhxRcfSUShEnPf7M9fgO9t2q6B4+h46o1mz56DHSrHA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780651305; c=relaxed/simple; bh=/4/PKcQi2AAui4XaxTTGZIzqynEQbC+wI7BaJk9agGQ=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=XtDX3AoeT2v8op5hjvlbh7hjGZfmUZPgW9MPB964i8yTMNoZHq/63mkhgWbSXFzyZ2YF2j0fIxklBgT/7EYNL3lPkHPZK8jrS6heWoKQOw0rLCUmqVATfm14fVn7KhwJ9SENQkF6uDdOMLGgt1UbUPZDmw6WoWS1mrNfn7xUjT8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=BrKyng1c; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="BrKyng1c" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 670FB4AB3; Fri, 5 Jun 2026 02:21:32 -0700 (PDT) Received: from [10.1.38.38] (unknown [10.1.38.38]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 0EACA3F86F; Fri, 5 Jun 2026 02:21:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1780651297; bh=/4/PKcQi2AAui4XaxTTGZIzqynEQbC+wI7BaJk9agGQ=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=BrKyng1c555mRkYmMJaN8XM9oCmdwWH2yDn+dkwl9xIJjkOaWIRO7rsjjhg9p4M9k i8d20sxHBvYmH0QXBTDNERvED6hs/AyJ/HI6bCxMG6XkomeFIsdJ/ZleHnIL91P8dP C4x2aYYAC8eg5ADhwptTAwHuBHkJKERAx/18st/s= Message-ID: Date: Fri, 5 Jun 2026 10:21:33 +0100 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] sched/fair: Fix cpu_util runnable_avg arithmetic To: Vincent Guittot , Hongyan Xia Cc: Ingo Molnar , Peter Zijlstra , Juri Lelli , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , K Prateek Nayak , Jiazi Li , "linux-kernel@vger.kernel.org" References: <20260605070103.1832-1-hongyan.xia@transsion.com> Content-Language: en-US From: Christian Loehle In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 6/5/26 09:51, Vincent Guittot wrote: > On Fri, 5 Jun 2026 at 09:01, Hongyan Xia wrote: >> >> From: Hongyan Xia >> >> If we take runnable_avg in max(runnable_avg, util_avg) in cpu_util(), we >> should then add or subtract task runnable_avg, but the arithmetic below >> is still with task util_avg. This mixes runnable_avg with util_avg which >> is incorrect. >> >> Fix by always doing arithmetic with runnable_avg and only take >> max(runnable_avg, util_avg) at the last step. >> >> Fixes: 7d0583cf9ec7 ("sched/fair, cpufreq: Introduce 'runnable boosting'") >> Signed-off-by: Hongyan Xia >> --- >> kernel/sched/fair.c | 22 ++++++++++++++-------- >> 1 file changed, 14 insertions(+), 8 deletions(-) >> >> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c >> index 69361c63353a..050bce06efea 100644 >> --- a/kernel/sched/fair.c >> +++ b/kernel/sched/fair.c >> @@ -8231,25 +8231,31 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target) >> static unsigned long >> cpu_util(int cpu, struct task_struct *p, int dst_cpu, int boost) >> { >> + bool add_task = p && task_cpu(p) != cpu && dst_cpu == cpu; >> + bool sub_task = p && task_cpu(p) == cpu && dst_cpu != cpu; >> struct cfs_rq *cfs_rq = &cpu_rq(cpu)->cfs; >> unsigned long util = READ_ONCE(cfs_rq->avg.util_avg); >> unsigned long runnable; >> >> - if (boost) { >> - runnable = READ_ONCE(cfs_rq->avg.runnable_avg); >> - util = max(util, runnable); >> - } >> - >> /* >> * If @dst_cpu is -1 or @p migrates from @cpu to @dst_cpu remove its >> * contribution. If @p migrates from another CPU to @cpu add its >> * contribution. In all the other cases @cpu is not impacted by the >> * migration so its util_avg is already correct. >> */ >> - if (p && task_cpu(p) == cpu && dst_cpu != cpu) >> - lsub_positive(&util, task_util(p)); >> - else if (p && task_cpu(p) != cpu && dst_cpu == cpu) >> + if (add_task) >> util += task_util(p); >> + else if (sub_task) >> + lsub_positive(&util, task_util(p)); >> + >> + if (boost) { >> + runnable = READ_ONCE(cfs_rq->avg.runnable_avg); >> + if (add_task) >> + runnable += task_runnable(p); > > Where did you get the task_runnable() function? I can't find it in > tip/sched/core so either create it or call > READ_ONCE(p->se.avg.runnable_avg) directly It's there for me on tip/sched/core at 7675361ff9a1 sched: deadline: Cleanup goto label in pick_earliest_pushable_dl_task but also 7.1-rc6? > > >> + else if (sub_task) >> + lsub_positive(&runnable, task_runnable(p)); >> + util = max(util, runnable); >> + } >> >> if (sched_feat(UTIL_EST)) { >> unsigned long util_est; >> -- >> 2.47.3 >> >