Received: by 10.213.65.68 with SMTP id h4csp1299022imn; Wed, 21 Mar 2018 07:28:07 -0700 (PDT) X-Google-Smtp-Source: AG47ELsCQgM/NupT4dfngUvLUNn/6rdjtLdVaFqotpWeK1xNn+kMy+T6XvS3zRGr1zq9Q7RL0Igr X-Received: by 2002:a17:902:968a:: with SMTP id n10-v6mr15393050plp.397.1521642487377; Wed, 21 Mar 2018 07:28:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521642487; cv=none; d=google.com; s=arc-20160816; b=fh/AU1kn4dHU0bXGQjShXfug3cbKPqF0Rhef0jHEL/MiBIxK84wfpNYVQ9Ve31B3ku QRnD5iatB42oXRd7tDXRH1PvIHRbRyLts8L03mhceQTzuw0b5K6PP038xDuS6th10a3K kga2AvHJ3aRcSUMouKoM6NQ2fIugIopavKgGDtBNxhUHHBqi4IgBCmPhYIPAW+NIYcEP qfecY3MzBUaHkvDkfdN8fh1t/QINustrC/NvJgrQ3IkMFjs/KP5S/ko2XFW/Izbhmnaz fi9XliEOg2W0fX6ZfLBNC4k+imTaUDpz2bt1qktJXjlL+4vC/4iN+JrLVd59JCaVDmpB zNfg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:arc-authentication-results; bh=QdzJxFfjMRqkyQKjx5cAfOmNMlqcLQGci+wyPCYASh0=; b=A77Y/qCLc/azDai70WW8H/SpVDy+xWVRoZvuwRhN7LR0tYYye5kwJaBH5vhSiYihst thRhIJpBaBtNWvg9hWS1zVPJ2oMcwSTVMrM8/6qnjWfQpJVb0E5p2pWC20YP/Raz06aU nzvabZMMWwYtxTbaqdDoZ96A86SSr1zvg/LWvrssKX84Q28RoGlkmfd1Z+fEFVd0a58G KcCdYgLPC7oI1sbPRzl6FFKUEVzHzm73PrgG1kLuu3j2jSwpS8Gbguz/LQT7wH0IU7vZ P2QRDctXfeHALMDewCDEbKM2Tn/+51B44xfdeijIm8uRF1CHhn3/TWiVYpi7WQ33PK+I IRcA== 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 3-v6si3847211pla.678.2018.03.21.07.27.51; Wed, 21 Mar 2018 07:28:07 -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 S1752146AbeCUO0k (ORCPT + 99 others); Wed, 21 Mar 2018 10:26:40 -0400 Received: from foss.arm.com ([217.140.101.70]:53904 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751978AbeCUO0j (ORCPT ); Wed, 21 Mar 2018 10:26:39 -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 5E4791529; Wed, 21 Mar 2018 07:26:39 -0700 (PDT) Received: from queper01-VirtualBox (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 7252B3F592; Wed, 21 Mar 2018 07:26:35 -0700 (PDT) Date: Wed, 21 Mar 2018 14:26:32 +0000 From: Quentin Perret To: Patrick Bellasi Cc: Dietmar Eggemann , linux-kernel@vger.kernel.org, Peter Zijlstra , Thara Gopinath , linux-pm@vger.kernel.org, Morten Rasmussen , Chris Redpath , Valentin Schneider , "Rafael J . Wysocki" , Greg Kroah-Hartman , Vincent Guittot , Viresh Kumar , Todd Kjos , Joel Fernandes Subject: Re: [RFC PATCH 4/6] sched/fair: Introduce an energy estimation helper function Message-ID: <20180321142630.GB2168@queper01-VirtualBox> References: <20180320094312.24081-1-dietmar.eggemann@arm.com> <20180320094312.24081-5-dietmar.eggemann@arm.com> <20180321123921.GB13951@e110439-lin> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180321123921.GB13951@e110439-lin> User-Agent: Mutt/1.9.2 (2017-12-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wednesday 21 Mar 2018 at 12:39:21 (+0000), Patrick Bellasi wrote: > On 20-Mar 09:43, Dietmar Eggemann wrote: > > From: Quentin Perret > > [...] > > > +static unsigned long compute_energy(struct task_struct *p, int dst_cpu) > > +{ > > + unsigned long util, fdom_max_util; > > + struct capacity_state *cs; > > + unsigned long energy = 0; > > + struct freq_domain *fdom; > > + int cpu; > > + > > + for_each_freq_domain(fdom) { > > + fdom_max_util = 0; > > + for_each_cpu_and(cpu, &(fdom->span), cpu_online_mask) { > > + util = cpu_util_next(cpu, p, dst_cpu); > > Would be nice to find a way to cache all these util and reuse them > below... even just to ensure data consistency between the "cs" > computation and its usage... So actually, what I can do is add something like fdom_tot_util += util; to this loop and compute energy = cs->power * fdom_tot_util / cs->cap; only once, instead of having the second loop to compute the energy. We don't have to scale the util for each and every CPU since they share the same cap state. That would save some divisions and ensure the consistency between the selection of the cap state and the associated energy computation. What do you think ? Or maybe you were talking about consistency between several consecutive calls to compute_energy() ? > > > + fdom_max_util = max(util, fdom_max_util); > > + } > > + > > + /* > > + * Here we assume that the capacity states of CPUs belonging to > > + * the same frequency domains are shared. Hence, we look at the > > + * capacity state of the first CPU and re-use it for all. > > + */ > > + cpu = cpumask_first(&(fdom->span)); > > + cs = find_cap_state(cpu, fdom_max_util); > ^^^^ > > The above code could theoretically return NULL, although likely EAS is > completely disabled if em->nb_cap_states == 0, right? That's right. sched_energy_present cannot be enabled with em->nb_cap_states == 0, and compute_energy() is never called without sched_energy_present in the proposed implementation. > > If that's the case then, in the previous function, you can certainly > avoid the initialization of *cs and maybe also add an explicit: > > BUG_ON(em->nb_cap_states == 0); > > which helps even just as "in code documentation". > > But, I'm not sure if maintainers like BUG_ON in scheduler code :) Yes, I'm not sure about the BUG_ON either :). I agree that it would be nice to document somewhere that compute_energy() is unsafe to call without sched_energy_present. I can simply add a proper doc comment to this function actually. Would that work ? > > > > + > > + /* > > + * The energy consumed by each CPU is derived from the power > ^ > > Should we make more explicit that this is just the "active" energy > consumed? Ok, np. > > > + * it dissipates at the expected OPP and its percentage of > > + * busy time. > > + */ > > + for_each_cpu_and(cpu, &(fdom->span), cpu_online_mask) { > > + util = cpu_util_next(cpu, p, dst_cpu); > > + energy += cs->power * util / cs->cap; > > + } > > + } > > nit-pick: empty line before return? Will do. > > > + return energy; > > +} > > + > > /* > > * select_task_rq_fair: Select target runqueue for the waking task in domains > > * that have the 'sd_flag' flag set. In practice, this is SD_BALANCE_WAKE, > > -- > > 2.11.0 > > > > -- > #include > > Patrick Bellasi Thanks, Quentin