All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Quentin Perret <quentin.perret@arm.com>
Cc: rjw@rjwysocki.net, linux-kernel@vger.kernel.org,
	linux-pm@vger.kernel.org, gregkh@linuxfoundation.org,
	mingo@redhat.com, dietmar.eggemann@arm.com,
	morten.rasmussen@arm.com, chris.redpath@arm.com,
	patrick.bellasi@arm.com, valentin.schneider@arm.com,
	vincent.guittot@linaro.org, thara.gopinath@linaro.org,
	viresh.kumar@linaro.org, tkjos@google.com,
	joel@joelfernandes.org, smuckle@google.com,
	adharmap@codeaurora.org, skannan@codeaurora.org,
	pkondeti@codeaurora.org, juri.lelli@redhat.com,
	edubezval@gmail.com, srinivas.pandruvada@linux.intel.com,
	currojerez@riseup.net, javi.merino@kernel.org
Subject: Re: [PATCH v7 11/14] sched/fair: Introduce an energy estimation helper function
Date: Thu, 4 Oct 2018 10:34:57 +0200	[thread overview]
Message-ID: <20181004083457.GC19252@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20180912091309.7551-12-quentin.perret@arm.com>

On Wed, Sep 12, 2018 at 10:13:06AM +0100, Quentin Perret wrote:
> +static unsigned long cpu_util_next(int cpu, struct task_struct *p, int dst_cpu)
> +{
> +	struct cfs_rq *cfs_rq = &cpu_rq(cpu)->cfs;
> +	unsigned long util_est, util = READ_ONCE(cfs_rq->avg.util_avg);
> +
> +	/*
> +	 * If @p migrates from @cpu to another, remove its contribution. Or,
> +	 * if @p migrates from another CPU to @cpu, add its contribution. In
> +	 * the other cases, @cpu is not impacted by the migration, so the
> +	 * util_avg should already be correct.
> +	 */
> +	if (task_cpu(p) == cpu && dst_cpu != cpu)
> +		util = max_t(long, util - task_util(p), 0);

That's not quite right; what you want to check for is underflow, but the
above also results in 0 if util - task_util() > LONG_MAX without an
underflow.

You could write: sub_positive(&util, task_util(p));

> +	else if (task_cpu(p) != cpu && dst_cpu == cpu)
> +		util += task_util(p);
> +
> +	if (sched_feat(UTIL_EST)) {
> +		util_est = READ_ONCE(cfs_rq->avg.util_est.enqueued);
> +
> +		/*
> +		 * During wake-up, the task isn't enqueued yet and doesn't
> +		 * appear in the cfs_rq->avg.util_est.enqueued of any rq,
> +		 * so just add it (if needed) to "simulate" what will be
> +		 * cpu_util() after the task has been enqueued.
> +		 */
> +		if (dst_cpu == cpu)
> +			util_est += _task_util_est(p);
> +
> +		util = max(util, util_est);
> +	}
> +
> +	return min_t(unsigned long, util, capacity_orig_of(cpu));

AFAICT both @util and capacity_orig_of() have 'unsigned long' as type.

> +}
> +
> +/*
> + * compute_energy(): Estimates the energy that would be consumed if @p was
> + * migrated to @dst_cpu. compute_energy() predicts what will be the utilization
> + * landscape of the * CPUs after the task migration, and uses the Energy Model
> + * to compute what would be the energy if we decided to actually migrate that
> + * task.
> + */
> +static long compute_energy(struct task_struct *p, int dst_cpu,
> +							struct perf_domain *pd)

static long
compute_energy(struct task_struct *p, int dst_cpu, struct perf_domain *pd)

> +{
> +	long util, max_util, sum_util, energy = 0;
> +	int cpu;
> +
> +	while (pd) {
> +		max_util = sum_util = 0;
> +		/*
> +		 * The capacity state of CPUs of the current rd can be driven by
> +		 * CPUs of another rd if they belong to the same performance
> +		 * domain. So, account for the utilization of these CPUs too
> +		 * by masking pd with cpu_online_mask instead of the rd span.
> +		 *
> +		 * If an entire performance domain is outside of the current rd,
> +		 * it will not appear in its pd list and will not be accounted
> +		 * by compute_energy().
> +		 */
> +		for_each_cpu_and(cpu, perf_domain_span(pd), cpu_online_mask) {
> +			util = cpu_util_next(cpu, p, dst_cpu);
> +			util = schedutil_freq_util(cpu, util, ENERGY_UTIL);
> +			max_util = max(util, max_util);
> +			sum_util += util;
> +		}
> +
> +		energy += em_pd_energy(pd->obj, max_util, sum_util);
> +		pd = pd->next;
> +	}

No real strong preference, but you could write that like:

	for (; pd; pd = pd->next) {
	}


> +
> +	return energy;
> +}

  reply	other threads:[~2018-10-04  8:34 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-12  9:12 [PATCH v7 00/14] Energy Aware Scheduling Quentin Perret
2018-09-12  9:12 ` [PATCH v7 01/14] sched: Relocate arch_scale_cpu_capacity Quentin Perret
2018-09-12  9:12 ` [PATCH v7 02/14] sched/cpufreq: Prepare schedutil for Energy Aware Scheduling Quentin Perret
2018-09-12 14:56   ` Vincent Guittot
2018-09-12 14:56     ` Vincent Guittot
2018-09-18 21:33   ` Rafael J. Wysocki
2018-09-18 21:33     ` Rafael J. Wysocki
2018-09-27 12:17     ` Quentin Perret
2018-09-27 12:17       ` Quentin Perret
2018-09-28  8:23       ` Rafael J. Wysocki
2018-09-28  8:23         ` Rafael J. Wysocki
2018-09-28  8:35         ` Quentin Perret
2018-09-28  8:35           ` Quentin Perret
2018-09-28  8:35           ` Rafael J. Wysocki
2018-09-28  8:35             ` Rafael J. Wysocki
2018-09-12  9:12 ` [PATCH v7 03/14] PM: Introduce an Energy Model management framework Quentin Perret
2018-10-02 12:25   ` Peter Zijlstra
2018-10-02 12:54     ` Quentin Perret
2018-10-02 13:50       ` Peter Zijlstra
2018-10-02 12:30   ` Peter Zijlstra
2018-10-02 12:51     ` Quentin Perret
2018-10-02 13:48       ` Peter Zijlstra
2018-10-02 14:05         ` Quentin Perret
2018-10-02 14:29           ` Peter Zijlstra
2018-10-02 14:40             ` Quentin Perret
2018-10-02 19:12               ` Andrea Parri
2018-10-03  7:48                 ` Quentin Perret
2018-09-12  9:12 ` [PATCH v7 04/14] PM / EM: Expose the Energy Model in sysfs Quentin Perret
2018-09-12  9:13 ` [PATCH v7 05/14] sched: Introduce a sched_feat for Energy Aware Scheduling Quentin Perret
2018-10-02 12:34   ` Peter Zijlstra
2018-10-02 13:08     ` Quentin Perret
2018-10-03 16:24       ` Peter Zijlstra
2018-10-04  9:57         ` Quentin Perret
2018-09-12  9:13 ` [PATCH v7 06/14] sched/topology: Reference the Energy Model of CPUs when available Quentin Perret
2018-10-02 12:36   ` Peter Zijlstra
2018-10-02 13:16     ` Quentin Perret
2018-09-12  9:13 ` [PATCH v7 07/14] sched/topology: Lowest CPU asymmetry sched_domain level pointer Quentin Perret
2018-09-12  9:13 ` [PATCH v7 08/14] sched/topology: Disable EAS on inappropriate platforms Quentin Perret
2018-10-03 16:27   ` Peter Zijlstra
2018-10-04  9:10     ` Quentin Perret
2018-10-04  9:38       ` Peter Zijlstra
2018-10-04  9:45         ` Quentin Perret
2018-09-12  9:13 ` [PATCH v7 09/14] sched/fair: Clean-up update_sg_lb_stats parameters Quentin Perret
2018-09-12  9:13 ` [PATCH v7 10/14] sched: Add over-utilization/tipping point indicator Quentin Perret
2018-09-12  9:13 ` [PATCH v7 11/14] sched/fair: Introduce an energy estimation helper function Quentin Perret
2018-10-04  8:34   ` Peter Zijlstra [this message]
2018-10-04  9:02     ` Quentin Perret
2018-09-12  9:13 ` [PATCH v7 12/14] sched/fair: Select an energy-efficient CPU on task wake-up Quentin Perret
2018-10-04  9:44   ` Peter Zijlstra
2018-10-04 10:27     ` Quentin Perret
2018-10-04 10:41       ` Peter Zijlstra
2018-10-04 10:55         ` Quentin Perret
2018-10-04 12:18           ` Peter Zijlstra
2018-09-12  9:13 ` [PATCH v7 13/14] sched/topology: Make Energy Aware Scheduling depend on schedutil Quentin Perret
2018-10-04 10:50   ` Peter Zijlstra
2018-10-04 11:58     ` Quentin Perret
2018-09-12  9:13 ` [PATCH v7 14/14] OPTIONAL: cpufreq: dt: Register an Energy Model Quentin Perret

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181004083457.GC19252@hirez.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=adharmap@codeaurora.org \
    --cc=chris.redpath@arm.com \
    --cc=currojerez@riseup.net \
    --cc=dietmar.eggemann@arm.com \
    --cc=edubezval@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=javi.merino@kernel.org \
    --cc=joel@joelfernandes.org \
    --cc=juri.lelli@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=morten.rasmussen@arm.com \
    --cc=patrick.bellasi@arm.com \
    --cc=pkondeti@codeaurora.org \
    --cc=quentin.perret@arm.com \
    --cc=rjw@rjwysocki.net \
    --cc=skannan@codeaurora.org \
    --cc=smuckle@google.com \
    --cc=srinivas.pandruvada@linux.intel.com \
    --cc=thara.gopinath@linaro.org \
    --cc=tkjos@google.com \
    --cc=valentin.schneider@arm.com \
    --cc=vincent.guittot@linaro.org \
    --cc=viresh.kumar@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.