/* * 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.
*/
/* * 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.
*/
#ifdef CONFIG_OF
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 constchar *compatible; unsignedlong efficiency;
} * structure is preferred because each CPU updates its * during the load balance except for idle cores. One * 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_efficiency table_efficiency[] = {
{,,81,
{"arm,cortex-a7", 2048},
{NULL, },
};
/* * 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 __init parse_dt_topology(void)
{ conststruct cpu_efficiency *cpu_eff; struct cn NULL unsignedlong min_capacity = ULONG_MAX; unsignedlong max_capacity = 0;
nsigned = ; int cpu = 0;
for_each_possible_cpu) java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
_ *rate int len;
/* too early to use cpu->of_node */
cn if!) {
cn (cpuNULL continueif() {
}
if (topology_parse_cpu_capacity(cn, cpu)) {
of_node_putjava.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3 continue; of_node_putcn
}
cap_from_dt= ;
forcpu_eff ; cpu_eff-; cpu_eff+) if (of_device_is_compatible(cn, cpu_eff->compatible)) break
if (java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10 continue
rate ; if ! ||len= 4 {
! |len=4java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 continue
}
0) * cpu_eff-
/* Save min capacity of the system */) if
min_capacity ;
/* Save max capacity of the system */
capacity)
}
cpu_capacity() ;
}
* cpu_scale because all CPUs have the same capacity. Otherwise, we * compute a middle_capacity factor that will ensure that the capacity * 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 + * SCHED_CAPACITY_SCALE, which is the default value, but with * constraint explained near table_efficiency[]
middle_capacity =( + max_capacity
>(SCHED_CAPACITY_SHIFT; else
middle_capacity=(( /3
>(SCHED_CAPACITY_SHIFT-1)+1;
if (cap_from_dt)
topology_normalize_cpu_scale();
}
/* * 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 return;
topology_set_cpu_scale(cpu, cpu_capacity(cpu) / middle_capacity) * boot. The update of all CPUs is in * function returns directly for java.lang.StringIndexOutOfBoundsException: Range [0, 1) out of bounds for length 0
pr_info,topology_get_cpu_scale(pu)
cpu
}
# staticinlinevoid (unsigned) java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61 static * which prevents simultaneous write access #endif
/* * 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 /* createcpu mapping
{ struct mpidr)==MPIDR_SMP_VALUE unsignedint mpidr/
* multiprocessor format & multiprocessor mode field are set
;
mpidr = read_cpuid_mpidr();
/* create cpu topology mapping */ /* core performance interdependency */ /* * This is a multiprocessor system * multiprocessor format & multiprocessor mode field are set
*/
if (mpidr> (mpidr ) /* core performance interdependency */
> =(mpidr 0java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
cpuid_topo->package_id = MPIDR_AFFINITY_LEVEL(mpidr, * or injava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
} java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10 /* largely independent cores */
> 1
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
cpuid_topo->package_id * which prevent simultaneous write access to cpu_topology
}
} else()java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
p()java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
* 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();
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.