From: Yuyang Du <yuyang.du@intel.com>
To: Sasha Levin <sasha.levin@oracle.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
Dave Jones <davej@redhat.com>,
Andrey Ryabinin <a.ryabinin@samsung.com>,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: sched: odd values for effective load calculations
Date: Fri, 19 Dec 2014 08:29:56 +0800 [thread overview]
Message-ID: <20141219002956.GA25405@intel.com> (raw)
In-Reply-To: <20141216020948.GA6399@intel.com>
On Tue, Dec 16, 2014 at 10:09:48AM +0800, Yuyang Du wrote:
>
> Sasha, it might be helpful to see this_load is from:
>
> this_load1: this_load = target_load(this_cpu, idx);
>
> or
>
> this_load2: this_load += effective_load(tg, this_cpu, -weight, -weight);
>
> It really does not seem to be this_load1, while the calc of effective_load is a bit
> complicated to see what the problem is.
Hi all,
I finally managed to reproduce this, but not by trinity, just by keeping rebooting.
Indeed, the problem is from:
this_load2: this_load += effective_load(tg, this_cpu, -weight, -weight);
After digging into effective_load(), the root cause is:
wl = (w * tg->shares) / W;
if we have negative w, then it will be cast to unsigned long, and then may or may not
overflow, and end up an insane number.
I tried this in userspace, interestingly if we have:
wl = w * tg->shares;
wl /= W;
the result is ok, but not ok with the lines combined as the original one.
Anyway, the following patch can fix this.
---
Subject: [PATCH] sched: Fix long and unsigned long multiplication error in
effective_load
In effective_load, we have (long w * unsigned long tg->shares) / long W,
when w is negative, it is cast to unsigned long and hence the product is
insanely large. Fix this by casting tg->shares to long.
Reported-by: Sasha Levin <sasha.levin@oracle.com>
Signed-off-by: Yuyang Du <yuyang.du@intel.com>
---
kernel/sched/fair.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index df2cdf7..6b99659 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -4424,7 +4424,7 @@ static long effective_load(struct task_group *tg, int cpu, long wl, long wg)
* wl = S * s'_i; see (2)
*/
if (W > 0 && w < W)
- wl = (w * tg->shares) / W;
+ wl = (w * (long)tg->shares) / W;
else
wl = tg->shares;
--
next prev parent reply other threads:[~2014-12-19 8:28 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-02 22:53 sched: odd values for effective load calculations Sasha Levin
2014-12-13 8:30 ` Ingo Molnar
2014-12-15 12:12 ` Peter Zijlstra
2014-12-15 13:14 ` Peter Zijlstra
2014-12-16 5:29 ` Sasha Levin
2014-12-16 15:37 ` Peter Zijlstra
2014-12-18 2:10 ` Yuyang Du
2014-12-16 4:51 ` Sasha Levin
2014-12-16 2:09 ` Yuyang Du
2014-12-19 0:29 ` Yuyang Du [this message]
2014-12-19 11:20 ` Peter Zijlstra
2015-01-09 12:33 ` [tip:sched/urgent] sched: Fix odd values in effective_load() calculations tip-bot for Yuyang Du
2014-12-16 15:33 ` sched: odd values for effective load calculations Peter Zijlstra
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=20141219002956.GA25405@intel.com \
--to=yuyang.du@intel.com \
--cc=a.ryabinin@samsung.com \
--cc=davej@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=sasha.levin@oracle.com \
--cc=torvalds@linux-foundation.org \
/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.