From patchwork Thu Jul 31 09:56:13 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vincent Guittot X-Patchwork-Id: 34574 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-vc0-f197.google.com (mail-vc0-f197.google.com [209.85.220.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 05B4320540 for ; Thu, 31 Jul 2014 09:57:48 +0000 (UTC) Received: by mail-vc0-f197.google.com with SMTP id ij19sf7544929vcb.8 for ; Thu, 31 Jul 2014 02:57:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=wHBzh5KVg2zAV7CgN49bgbmx7dv0g4v/J/ljHsfgWrU=; b=lnqPD8Ac0TP9CErVwmPQbx5qL6NmCZBpDw2qg2drC38IOOKa4RhCryDOiRC/B4oWGw +NjJuD4vK2wz18aBMjSy6vm/0Swajefc4goZ6Z1DMy/WjXzaGHYHzCLWyQ5j/y5/ik9g SV0qyB3RAiCFvOrnyRX9F3QP5/L5lAdDPCDSwAj0I9ZO3779A+aL7YYhCmFNUkKIdzZP 0qCpgqvQzipwSMGAoSZ+NBidyYg0fQ33Wmu9sePN7oU8suTbJTjcfBMhSkYWaVN1wq8/ 8EIl4KlHrwzNo3UeYQ78q72SKJ8XcIsgrx3AjzQGAeXcIrclmjuxwV68bzIRJ5artG9F ejEg== X-Gm-Message-State: ALoCoQnjlHv75MM9uDFMu6hvDtheuKFxBbbaFCVOJ/FwqTdADqxQycwR8RivHU2BLMFN4MC+q8gc X-Received: by 10.236.29.37 with SMTP id h25mr1015827yha.8.1406800667801; Thu, 31 Jul 2014 02:57:47 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.41.82 with SMTP id y76ls53922qgy.75.gmail; Thu, 31 Jul 2014 02:57:47 -0700 (PDT) X-Received: by 10.52.88.74 with SMTP id be10mr13587042vdb.54.1406800667719; Thu, 31 Jul 2014 02:57:47 -0700 (PDT) Received: from mail-vc0-f177.google.com (mail-vc0-f177.google.com [209.85.220.177]) by mx.google.com with ESMTPS id el4si3948356vdb.90.2014.07.31.02.57.47 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 31 Jul 2014 02:57:47 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.177 as permitted sender) client-ip=209.85.220.177; Received: by mail-vc0-f177.google.com with SMTP id hy4so3717678vcb.36 for ; Thu, 31 Jul 2014 02:57:47 -0700 (PDT) X-Received: by 10.52.244.138 with SMTP id xg10mr13520800vdc.40.1406800667502; Thu, 31 Jul 2014 02:57:47 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.37.5 with SMTP id tc5csp4977vcb; Thu, 31 Jul 2014 02:57:46 -0700 (PDT) X-Received: by 10.66.120.99 with SMTP id lb3mr3013076pab.2.1406800664669; Thu, 31 Jul 2014 02:57:44 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id vs9si5352291pab.7.2014.07.31.02.57.43 for ; Thu, 31 Jul 2014 02:57:44 -0700 (PDT) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932276AbaGaJ5m (ORCPT + 20 others); Thu, 31 Jul 2014 05:57:42 -0400 Received: from mail-wi0-f171.google.com ([209.85.212.171]:39652 "EHLO mail-wi0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750843AbaGaJ5l (ORCPT ); Thu, 31 Jul 2014 05:57:41 -0400 Received: by mail-wi0-f171.google.com with SMTP id hi2so9013218wib.4 for ; Thu, 31 Jul 2014 02:57:39 -0700 (PDT) X-Received: by 10.180.208.81 with SMTP id mc17mr15495776wic.7.1406800659204; Thu, 31 Jul 2014 02:57:39 -0700 (PDT) Received: from lmenx30s.lme.st.com (LPuteaux-656-01-48-212.w82-127.abo.wanadoo.fr. [82.127.83.212]) by mx.google.com with ESMTPSA id ek3sm12215964wjd.17.2014.07.31.02.57.37 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 31 Jul 2014 02:57:38 -0700 (PDT) From: Vincent Guittot To: yuyang.du@intel.com, peterz@infradead.org Cc: mingo@redhat.com, linux-kernel@vger.kernel.org, pjt@google.com, bsegall@google.com, arjan.van.de.ven@intel.com, len.brown@intel.com, rafael.j.wysocki@intel.com, alan.cox@intel.com, mark.gross@intel.com, fengguang.wu@intel.com, morten.rasmussen@arm.com, Vincent Guittot Subject: Re: [PATCH 2/2 v4] sched: Rewrite per entity runnable load average Date: Thu, 31 Jul 2014 11:56:13 +0200 Message-Id: <1406800573-9692-1-git-send-email-vincent.guittot@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <20140729015344.GF5203@intel.com> References: <20140729015344.GF5203@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: vincent.guittot@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.177 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Resend with a correct subject Hi Yuyang, Does something like the patch below to be applied of top of your patchset, seem reasonable add-on? It adds 1 new usage_sum statistics which is something that I use to detect the overload of a rq in my patchset that reworks cpu_power and removes capacity_factor And I think that the change I made on load_sum should match some of Morten's concerns Regards, Vincent --- Subject: [PATCH] sched: add usage_sum statistic Add a new statitic that reflects the average time a task is running on CPU. load_sum is now the average runnable time before being weighted The sum of usage_sum of the tasks that are on a rq, is used to detect the overload of a rq. Signed-off-by: Vincent Guittot --- include/linux/sched.h | 1 + kernel/sched/fair.c | 47 +++++++++++++++++++++++++++++++++++------------ kernel/sched/sched.h | 2 ++ 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index b6617a1..3296e76 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1080,6 +1080,7 @@ struct sched_avg { */ u64 last_update_time; u64 load_sum; + unsigned long usage_sum; unsigned long load_avg; u32 period_contrib; }; diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index a3a3168..78408a0 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -679,7 +679,8 @@ void init_task_runnable_average(struct task_struct *p) */ sa->period_contrib = 1023; sa->load_avg = p->se.load.weight; - sa->load_sum = p->se.load.weight * LOAD_AVG_MAX; + sa->load_sum = sa->usage_sum = LOAD_AVG_MAX; + ; /* when this task enqueue'ed, it will contribute to its cfs_rq's load_avg */ } #else @@ -2300,7 +2301,7 @@ static u32 __compute_runnable_contrib(u64 n) * = u_0 + u_1*y + u_2*y^2 + ... [re-labeling u_i --> u_{i+1}] */ static __always_inline int -__update_load_avg(u64 now, struct sched_avg *sa, unsigned long w) +__update_load_avg(u64 now, struct sched_avg *sa, unsigned long w, int running) { u64 delta, periods; u32 contrib; @@ -2340,7 +2341,9 @@ __update_load_avg(u64 now, struct sched_avg *sa, unsigned long w) */ delta_w = 1024 - delta_w; if (w) - sa->load_sum += w * delta_w; + sa->load_sum += delta_w; + if (running) + sa->usage_sum += delta_w; delta -= delta_w; @@ -2349,21 +2352,26 @@ __update_load_avg(u64 now, struct sched_avg *sa, unsigned long w) delta %= 1024; sa->load_sum = decay_load(sa->load_sum, periods + 1); + sa->usage_sum = decay_load(sa->usage_sum, periods + 1); /* Efficiently calculate \sum (1..n_period) 1024*y^i */ contrib = __compute_runnable_contrib(periods); if (w) - sa->load_sum += w * contrib; + sa->load_sum += contrib; + if (running) + sa->usage_sum += contrib; } /* Remainder of delta accrued against u_0` */ if (w) - sa->load_sum += w * delta; + sa->load_sum += delta; + if (running) + sa->usage_sum += delta; sa->period_contrib += delta; if (decayed) - sa->load_avg = div_u64(sa->load_sum, LOAD_AVG_MAX); + sa->load_avg = div_u64(sa->load_sum * w, LOAD_AVG_MAX); return decayed; } @@ -2404,11 +2412,17 @@ static inline int update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq) if (atomic_long_read(&cfs_rq->removed_load_avg)) { long r = atomic_long_xchg(&cfs_rq->removed_load_avg, 0); cfs_rq->avg.load_avg = subtract_until_zero(cfs_rq->avg.load_avg, r); - r *= LOAD_AVG_MAX; + } + if (atomic_long_read(&cfs_rq->removed_load_sum)) { + long r = atomic_long_xchg(&cfs_rq->removed_load_sum, 0); cfs_rq->avg.load_sum = subtract_until_zero(cfs_rq->avg.load_sum, r); } + if (atomic_long_read(&cfs_rq->removed_usage_sum)) { + long r = atomic_long_xchg(&cfs_rq->removed_usage_sum, 0); + cfs_rq->avg.usage_sum = subtract_until_zero(cfs_rq->avg.usage_sum, r); + } - decayed = __update_load_avg(now, &cfs_rq->avg, cfs_rq->load.weight); + decayed = __update_load_avg(now, &cfs_rq->avg, cfs_rq->load.weight, cfs_rq->curr != NULL); #ifndef CONFIG_64BIT if (cfs_rq->avg.last_update_time != cfs_rq->load_last_update_time_copy) { @@ -2430,7 +2444,8 @@ static inline void update_load_avg(struct sched_entity *se, int update_tg) * Track task load average for carrying it to new CPU after migrated, * and group sched_entity for task_h_load calc in migration */ - __update_load_avg(now, &se->avg, se->on_rq * se->load.weight); + __update_load_avg(now, &se->avg, se->on_rq * se->load.weight, + entity_is_task(se) ? task_of(se)->on_cpu : 0); if (update_cfs_rq_load_avg(now, cfs_rq) && update_tg) update_tg_load_avg(cfs_rq); @@ -2451,13 +2466,14 @@ static inline void enqueue_entity_load_avg(struct sched_entity *se) migrated = 1; } else - __update_load_avg(now, sa, se->on_rq * se->load.weight); + __update_load_avg(now, sa, se->on_rq * se->load.weight, entity_is_task(se) ? task_of(se)->on_cpu : 0); decayed = update_cfs_rq_load_avg(now, cfs_rq); if (migrated) { cfs_rq->avg.load_avg += sa->load_avg; cfs_rq->avg.load_sum += sa->load_sum; + cfs_rq->avg.usage_sum += sa->usage_sum; } if (decayed || migrated) @@ -4442,8 +4458,10 @@ migrate_task_rq_fair(struct task_struct *p, int next_cpu) #else last_update_time = cfs_rq->avg.last_update_time; #endif - __update_load_avg(last_update_time, &se->avg, 0); + __update_load_avg(last_update_time, &se->avg, 0, p->on_cpu); atomic_long_add(se->avg.load_avg, &cfs_rq->removed_load_avg); + atomic_long_add(se->avg.load_sum, &cfs_rq->removed_load_sum); + atomic_long_add(se->avg.usage_sum, &cfs_rq->removed_usage_sum); /* * We are supposed to update the task to "current" time, then its up to date @@ -7316,11 +7334,13 @@ static void switched_from_fair(struct rq *rq, struct task_struct *p) * Remove our load from contribution when we leave cfs_rq. */ __update_load_avg(cfs_rq->avg.last_update_time, &se->avg, - se->on_rq * se->load.weight); + se->on_rq * se->load.weight, p->on_cpu); cfs_rq->avg.load_avg = subtract_until_zero(cfs_rq->avg.load_avg, se->avg.load_avg); cfs_rq->avg.load_sum = subtract_until_zero(cfs_rq->avg.load_sum, se->avg.load_sum); + cfs_rq->avg.usage_sum = + subtract_until_zero(cfs_rq->avg.usage_sum, se->avg.usage_sum); #endif } @@ -7378,6 +7398,8 @@ void init_cfs_rq(struct cfs_rq *cfs_rq) #endif #ifdef CONFIG_SMP atomic_long_set(&cfs_rq->removed_load_avg, 0); + atomic_long_set(&cfs_rq->removed_load_sum, 0); + atomic_long_set(&cfs_rq->removed_usage_sum, 0); #endif } @@ -7428,6 +7450,7 @@ static void task_move_group_fair(struct task_struct *p, int on_rq) p->se.avg.last_update_time = cfs_rq->avg.last_update_time; cfs_rq->avg.load_avg += p->se.avg.load_avg; cfs_rq->avg.load_sum += p->se.avg.load_sum; + cfs_rq->avg.usage_sum += p->se.avg.usage_sum; #endif } } diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index f21ddde..1bdd878 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -335,6 +335,8 @@ struct cfs_rq { struct sched_avg avg; unsigned long tg_load_avg_contrib; atomic_long_t removed_load_avg; + atomic_long_t removed_load_sum; + atomic_long_t removed_usage_sum; #ifndef CONFIG_64BIT u64 load_last_update_time_copy; #endif