Re: [RFCv5, 18/46] arm: topology: Define TC2 energy and provide it to the scheduler

From: Dietmar Eggemann
Date: Thu Aug 20 2015 - 15:19:50 EST


Hi Leo,

On 08/17/2015 02:19 AM, Leo Yan wrote:

[...]

diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c
index b35d3e5..bbe20c7 100644
--- a/arch/arm/kernel/topology.c
+++ b/arch/arm/kernel/topology.c
@@ -274,6 +274,119 @@ void store_cpu_topology(unsigned int cpuid)
cpu_topology[cpuid].socket_id, mpidr);
}

+/*
+ * ARM TC2 specific energy cost model data. There are no unit requirements for
+ * the data. Data can be normalized to any reference point, but the
+ * normalization must be consistent. That is, one bogo-joule/watt must be the
+ * same quantity for all data, but we don't care what it is.
+ */
+static struct idle_state idle_states_cluster_a7[] = {
+ { .power = 25 }, /* WFI */

This state is confused. Is this state corresponding to all CPUs have been
powered off but L2 cache RAM array and SCU are still power on?

This is what we refer to as 'active idle'. All cpus of the cluster are in WFI but the cluster is not in cluster-sleep yet. We measure the corresponding energy value by disabling the 'cluster-sleep-[b,l]' state and let the cpus do nothing for a specific time period.

+ { .power = 10 }, /* cluster-sleep-l */

Is this status means all CPU and cluster have been powered off, if so
then it will have no power consumption anymore...

The cluster is in cluster-sleep but there is still some peripheral related to the cluster active which explains this power value we calculated from the pre/post energy value diff (by reading the vexpress energy counter for this cluster) and the time period we were idling on this cluster.


+ };
+
+static struct idle_state idle_states_cluster_a15[] = {
+ { .power = 70 }, /* WFI */
+ { .power = 25 }, /* cluster-sleep-b */
+ };
+
+static struct capacity_state cap_states_cluster_a7[] = {
+ /* Cluster only power */
+ { .cap = 150, .power = 2967, }, /* 350 MHz */

For cluster level's capacity, does it mean need run benchmark on all
CPUs within cluster?

We run an 'always running thread per cpu' workload on {n, n-1, ..., 1} cpus of a cluster (hotplug-out the other cpus) for a specific time period. Then we calculate the cluster power value by extrapolating from the power values for the {n, n-1, ... 1} test runs and use the delta between a n and n+1 test run value as core power value.

[...]

+static struct idle_state idle_states_core_a7[] = {
+ { .power = 0 }, /* WFI */

Should have two idle states for CPU level (WFI and CPU's power off)?

The ARM TC2 platform has only 2 idle states, there is no 'cpu power off':

# cat /sys/devices/system/cpu/cpu[0,2]/cpuidle/state*/name
WFI
cluster-sleep-b
WFI
cluster-sleep-l

[...]

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/