From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751917AbdBMFjo (ORCPT ); Mon, 13 Feb 2017 00:39:44 -0500 Received: from mga01.intel.com ([192.55.52.88]:53760 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751790AbdBMFjQ (ORCPT ); Mon, 13 Feb 2017 00:39:16 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,155,1484035200"; d="scan'208";a="820185517" From: Yuyang Du To: mingo@kernel.org, peterz@infradead.org, linux-kernel@vger.kernel.org Cc: pjt@google.com, bsegall@google.com, morten.rasmussen@arm.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, matt@codeblueprint.co.uk, umgwanakikbuti@gmail.com, Yuyang Du Subject: [RESEND PATCH 1/2] documentation: Add scheduler/sched-avg.txt Date: Mon, 13 Feb 2017 05:44:22 +0800 Message-Id: <1486935863-25251-2-git-send-email-yuyang.du@intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1486935863-25251-1-git-send-email-yuyang.du@intel.com> References: <1486935863-25251-1-git-send-email-yuyang.du@intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This doc file has the program to generate the constants to compute sched averages. Signed-off-by: Yuyang Du --- Documentation/scheduler/sched-avg.txt | 94 +++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 Documentation/scheduler/sched-avg.txt diff --git a/Documentation/scheduler/sched-avg.txt b/Documentation/scheduler/sched-avg.txt new file mode 100644 index 0000000..e1b3c542 --- /dev/null +++ b/Documentation/scheduler/sched-avg.txt @@ -0,0 +1,94 @@ +The following program is used to generate the constants for +computing sched averages. + +============================================================== + C program (compile with -lm) +============================================================== + +#include +#include + +#define HALFLIFE 32 +#define SHIFT 32 + +double y; + +void calc_runnable_avg_yN_inv() { + int i; + unsigned int x; + + printf("static const u32 runnable_avg_yN_inv[] = {"); + for(i = 0; i < HALFLIFE; i++) { + x = ((1UL<<32)-1)*pow(y, i); + + if (i % 6 == 0) printf("\n\t"); + printf("0x%8x, ", x); + } + printf("\n};\n\n"); +} + +int sum = 1024; +void calc_runnable_avg_yN_sum() { + int i; + + printf("static const u32 runnable_avg_yN_sum[] = {\n\t 0,"); + for(i = 1; i <= HALFLIFE; i++) { + if (i == 1) + sum *= y; + else + sum = sum*y + 1024*y; + + if (i % 11 == 0) printf("\n\t"); + printf("%5d,", sum); + } + printf("\n};\n\n"); +} + +int n = -1; +/* first period */ +long max = 1024; + +void calc_converged_max() { + long last = 0, y_inv = ((1UL<<32)-1)*y; + + for (; ; n++) { + if (n > -1) + max = ((max*y_inv)>>SHIFT) + 1024; + /* + * This is the same as: + * max = max*y + 1024; + */ + + if (last == max) + break; + + last = max; + } + n--; + printf("#define LOAD_AVG_PERIOD %d\n", HALFLIFE); + printf("#define LOAD_AVG_MAX %ld\n", max); + printf("#define LOAD_AVG_MAX_N %d\n\n", n); +} + +void calc_accumulated_sum_32() { + int i, x = sum; + + printf("static const u32 __accumulated_sum_N32[] = {\n\t 0,"); + for(i = 1; i <= n/HALFLIFE+1; i++) { + if (i > 1) + x = x/2 + sum; + + if (i % 6 == 0) printf("\n\t"); + printf("%6d,", x); + } + printf("\n};\n\n"); +} + +void main() { + y = pow(0.5, 1/(double)HALFLIFE); + + calc_runnable_avg_yN_inv(); + calc_runnable_avg_yN_sum(); + calc_converged_max(); + calc_accumulated_sum_32(); +} -- 2.1.4