From patchwork Wed Jul 5 08:59:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Juri Lelli X-Patchwork-Id: 107052 Delivered-To: patch@linaro.org Received: by 10.182.135.102 with SMTP id pr6csp567708obb; Wed, 5 Jul 2017 02:02:06 -0700 (PDT) X-Received: by 10.84.232.7 with SMTP id h7mr21382063plk.193.1499245326714; Wed, 05 Jul 2017 02:02:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499245326; cv=none; d=google.com; s=arc-20160816; b=t9TOryWB8toi8VKz67CW83eNjaiVQKbmSRMN4n36kI6j5mLVm6gumBMvrxCK+WOTMr iWD2jNAs+h4gF/EeJDs2PFxmb09ltE/DWPQc+H2GhKjNZjcVhjKyoSUbV4hTVfXMGLru cc1JUkrwsj6+VLMqXKV8m1pZJwoDGuIVaGjDw3S/oVGLGlhCFGzNRP+BOI/+QFNNG72I ULVCkTt3kPy0Mfh/rxp4o3X6Lnv6e7YYUEpFzEMCRDRSUm3DyzaZmCw6gKiZ33U37PKH zOzkqXyJ8Htbwe8+vO+x4v3Fh5hyZxnpmWbhkY9B5qGwuMQEyysusjiPAWIdE2Le3Qcw SJnQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=ICKkrjVnZDiwA53XTAExyVyfH0Kx2jsvdj3APwh+Hy0=; b=ksiD88f9jazLvfZEykwwXjjBS4MvBjpsjn6KvKIKsMKj7XAlrkmQYXDWvQJ5wu6TUe elOxSIiOVNBc74C8NOaUoIPDGmvuEEOv6t5Wokm8KnYfyG2emX8yF8v4n0b3BCBRoH5X B/PbK3QzDEx18p9wO1idCz+1YOFfU9+y5ytjX3RvlzhVk4IyDLsoMcRXWKlNaePs4QHy DkIoiFsJ3SOj5gQhA17GJHkqh3sGxmXXU1KGodWF5cbQ4/A3IppjJqoWxqrzF68qmHZZ H2V2fpMXi79gTsKdyqDiYFuuPhjijd5bZGIQEADMXMnLWNo9ZmrriLD2mQDgksJhIQ6z Z2+A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h11si11364328pln.264.2017.07.05.02.02.06; Wed, 05 Jul 2017 02:02:06 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752728AbdGEJBu (ORCPT + 25 others); Wed, 5 Jul 2017 05:01:50 -0400 Received: from foss.arm.com ([217.140.101.70]:53572 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752486AbdGEJA2 (ORCPT ); Wed, 5 Jul 2017 05:00:28 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 92352164F; Wed, 5 Jul 2017 02:00:27 -0700 (PDT) Received: from cam-smtp0.cambridge.arm.com (e106622-lin.cambridge.arm.com [10.1.211.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 3152A3F581; Wed, 5 Jul 2017 02:00:24 -0700 (PDT) From: Juri Lelli To: peterz@infradead.org, mingo@redhat.com, rjw@rjwysocki.net, viresh.kumar@linaro.org Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, tglx@linutronix.de, vincent.guittot@linaro.org, rostedt@goodmis.org, luca.abeni@santannapisa.it, claudio@evidence.eu.com, tommaso.cucinotta@santannapisa.it, bristot@redhat.com, mathieu.poirier@linaro.org, tkjos@android.com, joelaf@google.com, andresoportus@google.com, morten.rasmussen@arm.com, dietmar.eggemann@arm.com, patrick.bellasi@arm.com, juri.lelli@arm.com, Ingo Molnar , "Rafael J . Wysocki" Subject: [RFC PATCH v1 4/8] sched/cpufreq_schedutil: split utilization signals Date: Wed, 5 Jul 2017 09:59:01 +0100 Message-Id: <20170705085905.6558-5-juri.lelli@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170705085905.6558-1-juri.lelli@arm.com> References: <20170705085905.6558-1-juri.lelli@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org To be able to treat utilization signals of different scheduling classes in different ways (e.g., CFS signal might be stale while DEADLINE signal is never stale by design) we need to split sugov_cpu::util signal in two: util_cfs and util_dl. This patch does that by also changing sugov_get_util() parameter list. After this change, aggregation of the different signals has to be performed by sugov_get_util() users (so that they can decide what to do with the different signals). Suggested-by: Rafael J. Wysocki Signed-off-by: Juri Lelli Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Rafael J. Wysocki Cc: Viresh Kumar Cc: Luca Abeni Cc: Claudio Scordino --- Changes from RFCv0: - refactor aggregation of utilization in sugov_aggregate_util() --- kernel/sched/cpufreq_schedutil.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) -- 2.11.0 diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index ba6227625f24..e835fa886225 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -58,7 +58,8 @@ struct sugov_cpu { u64 last_update; /* The fields below are only needed when sharing a policy. */ - unsigned long util; + unsigned long util_cfs; + unsigned long util_dl; unsigned long max; unsigned int flags; @@ -154,20 +155,24 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy, return cpufreq_driver_resolve_freq(policy, freq); } -static void sugov_get_util(unsigned long *util, unsigned long *max) +static void sugov_get_util(struct sugov_cpu *sg_cpu) { struct rq *rq = this_rq(); - unsigned long dl_util = (rq->dl.running_bw * SCHED_CAPACITY_SCALE) - >> BW_SHIFT; - *max = arch_scale_cpu_capacity(NULL, smp_processor_id()); + sg_cpu->max = arch_scale_cpu_capacity(NULL, smp_processor_id()); + sg_cpu->util_cfs = rq->cfs.avg.util_avg; + sg_cpu->util_dl = (rq->dl.running_bw * SCHED_CAPACITY_SCALE) + >> BW_SHIFT; +} +static unsigned long sugov_aggregate_util(struct sugov_cpu *sg_cpu) +{ /* * Ideally we would like to set util_dl as min/guaranteed freq and * util_cfs + util_dl as requested freq. However, cpufreq is not yet * ready for such an interface. So, we only do the latter for now. */ - *util = min(rq->cfs.avg.util_avg + dl_util, *max); + return min(sg_cpu->util_cfs + sg_cpu->util_dl, sg_cpu->max); } static void sugov_set_iowait_boost(struct sugov_cpu *sg_cpu, u64 time, @@ -234,7 +239,9 @@ static void sugov_update_single(struct update_util_data *hook, u64 time, if (flags & SCHED_CPUFREQ_RT) { next_f = policy->cpuinfo.max_freq; } else { - sugov_get_util(&util, &max); + sugov_get_util(sg_cpu); + max = sg_cpu->max; + util = sugov_aggregate_util(sg_cpu); sugov_iowait_boost(sg_cpu, &util, &max); next_f = get_next_freq(sg_policy, util, max); /* @@ -274,8 +281,8 @@ static unsigned int sugov_next_freq_shared(struct sugov_cpu *sg_cpu, u64 time) if (j_sg_cpu->flags & SCHED_CPUFREQ_RT) return policy->cpuinfo.max_freq; - j_util = j_sg_cpu->util; j_max = j_sg_cpu->max; + j_util = sugov_aggregate_util(j_sg_cpu); if (j_util * max > j_max * util) { util = j_util; max = j_max; @@ -292,15 +299,12 @@ static void sugov_update_shared(struct update_util_data *hook, u64 time, { struct sugov_cpu *sg_cpu = container_of(hook, struct sugov_cpu, update_util); struct sugov_policy *sg_policy = sg_cpu->sg_policy; - unsigned long util, max; unsigned int next_f; - sugov_get_util(&util, &max); raw_spin_lock(&sg_policy->update_lock); - sg_cpu->util = util; - sg_cpu->max = max; + sugov_get_util(sg_cpu); sg_cpu->flags = flags; sugov_set_iowait_boost(sg_cpu, time, flags);