From patchwork Mon Dec 4 10:23:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Juri Lelli X-Patchwork-Id: 120501 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp4244886qgn; Mon, 4 Dec 2017 02:24:26 -0800 (PST) X-Google-Smtp-Source: AGs4zMb568YdLzEL4cvRuORnVtRLc55nbgd9a/uvqI79chCOcsx+XOZU1RLN+iKReVYjGUa7zMIc X-Received: by 10.101.85.135 with SMTP id j7mr13366756pgs.17.1512383066615; Mon, 04 Dec 2017 02:24:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512383066; cv=none; d=google.com; s=arc-20160816; b=gDCVR9MwkjF6r/Z6ysA7g1YLF/5LjrbkJH1/4XRCl6goXehmQ4f7Qj1gSYSolC2AdL F3VwXoaj+nDAPm9jgXlFjW+PARBYqfjKIiayojiyKEOzWiosU+uO31JhlfjFiRWYI9/t IynMSBB9KcGs9K1c9/Qs/Hx0h6/T7QCzTbz/TlvNjcVwpZFwevGa8d9cr3d/4YRpIVTa GyPZYWlp3hc/5NMiZ+KK3rnWQLEZoGd1BkNf1wCjojBkgTFzl4HkezjuUQjQSuJXArBN ldgEmqtxLTmuuF+7igC7X7/1DcdkbvYH5hFXG+rTn7Luz7PaF0zhIx6HMl/s7ekOnpC2 NdQA== 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=DiIz+dRGzD6hszwNekGffBbUjVBvBcw0BwL4QHjZOV4=; b=q4cbqd0Naf+crHiOynRP397WibYBwgJqEZz3tywzXeqGgoWVuRMeMMMx2txnoKe82z RvzqLEDi3mqXhYJpwgmJpgyOxQmOunAJ11u8E00TsKXxane6LdiU5oIkTmHuE8wtSQud zKwnAlgIM7PcfHFDeNGM2vUdd9VmASypXA9BiEV3aCRQKSbVGwJ/jKedTUpfK8Am/JtE Z5QuAEJScHEX2ete9fO6NmFoMDS3iFznQuzi1gSUMa5UCYxIWEH3+vCdB4NOIKdCwyX6 RC0pR4s5YV2s1OTZTTNn6VM1+1h9Sa9k676Igxx6T/z3ZYS19iRY8Uc1YG5D+DF6gmfU AZlw== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s187si9221693pgc.532.2017.12.04.02.24.26; Mon, 04 Dec 2017 02:24:26 -0800 (PST) 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753659AbdLDKYY (ORCPT + 28 others); Mon, 4 Dec 2017 05:24:24 -0500 Received: from mail-wm0-f68.google.com ([74.125.82.68]:38947 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752231AbdLDKYS (ORCPT ); Mon, 4 Dec 2017 05:24:18 -0500 Received: by mail-wm0-f68.google.com with SMTP id i11so13225413wmf.4 for ; Mon, 04 Dec 2017 02:24:18 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=DiIz+dRGzD6hszwNekGffBbUjVBvBcw0BwL4QHjZOV4=; b=SqvMqxYMg0Op4RrwLYh1XvkHyQEqCkm9ZKtmGgIuVpTGDBwTCfuXQzYZQS5uhzQIkp OyPmbo/ejarTV577pmVLT2cVdU9YQoF1Ag1j6cJglc8fl4IgpNF36b7YDsOO/4Q2zry/ Dkcn7gK3zPH9x1YZ6wqYdmrpVl5H1z8uMFFRYe+M5La5jaTQkj1TuTk88EQe9syv3+zL dvTyLUjIJHlQTkbkSIl2uE5vzhB7lbtyBq6JKBPy5XFY2+af76YzVNfsPXdMgvgi+7tu bposMZGq3lUQk2+KRAxfGua2CoZbA76Fyw+a5vS1yAdElE1bU5jRs5eshbBsJ7a6y8yx uG9Q== X-Gm-Message-State: AKGB3mKQaqxTo/Jzw2Xb4cyyn4gf3esRBN0wjBytZml/Iied2vSNoaaH etXw1HTImA3WmeMV/gG21qexKg== X-Received: by 10.28.230.78 with SMTP id d75mr7257887wmh.54.1512383057107; Mon, 04 Dec 2017 02:24:17 -0800 (PST) Received: from localhost.localdomain.com ([151.68.92.1]) by smtp.gmail.com with ESMTPSA id y2sm13542473wra.18.2017.12.04.02.24.13 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 04 Dec 2017 02:24:16 -0800 (PST) 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, morten.rasmussen@arm.com, dietmar.eggemann@arm.com, patrick.bellasi@arm.com, alessio.balsini@arm.com, juri.lelli@redhat.com, Juri Lelli , Ingo Molnar , "Rafael J . Wysocki" Subject: [RFC PATCH v2 4/8] sched/cpufreq_schedutil: split utilization signals Date: Mon, 4 Dec 2017 11:23:21 +0100 Message-Id: <20171204102325.5110-5-juri.lelli@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171204102325.5110-1-juri.lelli@redhat.com> References: <20171204102325.5110-1-juri.lelli@redhat.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Juri Lelli 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 Acked-by: Viresh Kumar --- kernel/sched/cpufreq_schedutil.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) -- 2.14.3 diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index c22457868ee6..a3072f24dc16 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -60,7 +60,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; @@ -176,20 +177,25 @@ 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, int cpu) +static void sugov_get_util(struct sugov_cpu *sg_cpu) { - struct rq *rq = cpu_rq(cpu); - unsigned long dl_util = (rq->dl.running_bw * SCHED_CAPACITY_SCALE) - >> BW_SHIFT; + struct rq *rq = cpu_rq(sg_cpu->cpu); - *max = arch_scale_cpu_capacity(NULL, cpu); + sg_cpu->max = arch_scale_cpu_capacity(NULL, sg_cpu->cpu); + 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, @@ -280,7 +286,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, sg_cpu->cpu); + 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); /* @@ -325,8 +333,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; @@ -343,15 +351,11 @@ 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, sg_cpu->cpu); - 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);