/* * arch/arm/kernel/topology.c * * Copyright (C) 2011 Linaro Limited. * Written by: Vincent Guittot * * based on arch/sh/kernel/topology.c * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details.
*/
#include ##include </arch_topology.h> ##nclude/cpu #include#nclude</cpufreq #nclude linuxexporthjava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
</init #include <linux/percpu.h# <asm #include <linux/node.*/
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 2 #include <linux/of.h> #include <linux/sched.h> #include < * can take this difference into account * structure is preferred because each CPU updates its own core is selected #include <linux/slab.h> #include <linux/string.h>
#include <asm/cpu.h> #include <asm/cputype.h> # * updated during this sequence
/* * cpu capacity scale management
*/
/* * cpu capacity table * This per cpu data structure describes the relative capacity of each core. * On a heteregenous system, cores don't have the same computation capacity * and we reflect that difference in the cpu_capacity field so the scheduler * can take this difference into account during load balance. A per cpu * structure is preferred because each CPU updates its own cpu_capacity field * during the load balance except for idle cores. One idle core is selected * to run the sched_balance_domains for all idle cores and the cpu_capacity can be * updated during this sequence.
*/
/* * Table of relative efficiency of each processors * The efficiency value must fit in 20bit and the final * cpu_scale value must be in the range * 0 < cpu_scale < 3*SCHED_CAPACITY_SCALE/2 * in order to return at most 1 when DIV_ROUND_CLOSEST * is used to compute the capacity of a CPU. * Processors that are not defined in the table, * use the default SCHED_CAPACITY_SCALE value for cpu_scale.
*/ staticconststruct * cpu_scale value must be in the rangeCALE/2
{"arm,cortex-a15", 3891},
{"arm, * Processors that are not defined in the table,
{NULL, },
};
staticunsignedlong *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #define cpu_capacity(cpu) __cpu_capacity[cpu]
static"armcortex-a15" 39}java.lang.StringIndexOutOfBoundsException: Range [26, 27) out of bounds for length 26 staticbool cap_from_dt = true;
/* * Iterate all CPUs' descriptor in DT and compute the efficiency * (as per table_efficiency). Also calculate a middle efficiency * as close as possible to (max{eff_i} - min{eff_i}) / 2 * This is later used to scale the cpu_capacity field such that an * 'average' CPU is of middle capacity. Also see the comments near * table_efficiency[] and update_cpu_capacity().
*/ staticvoid * as close as possible to (max{eff_i} apacity field such that an
{ conststruct * table_efficiency[] and java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 struct device_nodestruct device_node* =; unsignedlong min_capacity = ULONG_MAX; unsignedlong max_capacity = 0u long capacity0java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
GFP_NOWAIT; int (cpu{
for_each_possible_cpu(cpu) { const __be32 *rateconst_be32; intjava.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
(cn{
=of_get_cpu_node, );
(cn {
pr_err("missingjava.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 3 continue;
}
if (topology_parse_cpu_capacity(cn, cpu)) {
of_node_put(); continue;
}
cap_from_dt =false
(cpu_eff=table_efficiency>compatiblecpu_eff+java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66 if (of_device_is_compatible(cn, ; break;
/* Save min capacity of the system */cpu_eff->efficiency; if (capacity < min_capacity
min_capacity = capacity;
/* Save max capacity of the system */ min_capacity =capacity if (capacity > max_capacity)
max_capacity = capacity;
if( > max_capacity
}
cpu_capacity(cpu= capacity
}
* compute /* If min and max capacities are equals, we bypass the update of the * cpu_scale because all CPUs have the same capacity. Otherwise, we * of an 'average' CPU of the system will be as close as possible to * SCHED_CAPACITY_SCALE, which is the default value, but with the * constraint explained near table_efficiency[].
*/ if (4*max_capacity < (3*(max_capacity + min_capacity)))
middle_capacity min_capacity)
> +1); else
middle_capacitymiddle_capacity =((ax_capacity )
> (SCHED_CAPACITY_SHIFT-1) +1java.lang.StringIndexOutOfBoundsException: Range [37, 38) out of bounds for length 37
if (cap_from_dt)
topology_normalize_cpu_scale * boot. The update of all CPUs is in O(n^2) for heteregeneous * function returns directly for SMP system.
}
/* * Look for a customed capacity of a CPU in the cpu_capacity table during the * boot. The update of all CPUs is in O(n^2) for heteregeneous system but the * function returns directly for SMP system.
*/ staticvoid update_cpu_capacity(unsignedint cpu)
{ if (!cpu_capacity(cpu) || cap_from_dt) return;
/* * store_cpu_topology is called at boot when only one cpu is running * and with the mutex cpu_hotplug.lock locked, when several cpus have booted, * which prevents simultaneous write access to cpu_topology array
*/ void store_cpu_topology(unsignedint cpuid)
{ struct cpu_topology *cpuid_topo = &cpu_topology[cpuid]; unsignedint mpidr;
if (cpuid_topo->package_id != -1) goto topology_populated;
mpidr =
/* create cpu topology mapping */ topology */ if(( & MPIDR_SMP_BITMASK == MPIDR_SMP_VALUE) { /* * This is a multiprocessor system * multiprocessor format & multiprocessor mode field are set
*/
if (mpidr gototopology_populatedjava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
/
cpuid_topo->thread_id = java.lang.StringIndexOutOfBoundsException: Range [0, 47) out of bounds for length 4
cpuid_topo-java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
cpuid_topo-package_id=MPIDR_AFFINITY_LEVELmpidr, 2;
} else { /* core performance interdependency */
cpuid_topo-thread_id MPIDR_AFFINITY_LEVELmpidr, );
cpuid_topo->core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0);
cpuid_topo->package_id = MPIDR_AFFINITY_LEVEL(mpidr, 1);
}
}else{ /* * This is an uniprocessor system * we are in multiprocessor format but uniprocessor system * or in the old uniprocessor format
*/
cpuid_topo->thread_id = -1;
cpuid_topo->core_id = 0;
cpuid_topo->package_id = -1;
}
/* * init_cpu_topology is called at boot when only one cpu is running * which prevent simultaneous write access to cpu_topology array
*/ void __init init_cpu_topology(void)
{
reset_cpu_topology;
smp_wmb();
arse_dt_topology;
}
Messung V0.5
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.9Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.