[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