[Devel] [PATCH RHEL7 COMMIT] sched: Count loadavg under rq::lock in calc_load_nohz_start()
Konstantin Khorenko
khorenko at virtuozzo.com
Mon Jul 10 11:59:23 MSK 2017
The commit is pushed to "branch-rh7-3.10.0-514.26.1.vz7.33.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-514.26.1.vz7.33.2
------>
commit 60643fbff6bc70e42ae3e39b1ebaa7230f02b11f
Author: Kirill Tkhai <ktkhai at virtuozzo.com>
Date: Mon Jul 10 12:59:23 2017 +0400
sched: Count loadavg under rq::lock in calc_load_nohz_start()
Since calc_load_fold_active() reads two variables (nr_running
and nr_uninterruptible) it may race with parallel try_to_wake_up().
So it must be executed under rq::lock to prevent that.
This seems to be the reason of negative calc_load_tasks, observed
on several machines.
https://jira.sw.ru/browse/PSBM-68052
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
kernel/sched/core.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 0c35ee9..4befd7c 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2904,7 +2904,10 @@ void calc_load_enter_idle(void)
* We're going into NOHZ mode, if there's any pending delta, fold it
* into the pending idle delta.
*/
+
+ raw_spin_lock(&this_rq->lock);
delta = calc_load_fold_active(this_rq);
+ raw_spin_unlock(&this_rq->lock);
if (delta) {
int idx = calc_load_write_idx();
atomic_long_add(delta, &calc_load_idle[idx]);
More information about the Devel
mailing list