Lines Matching +full:child +full:- +full:nodes
1 // SPDX-License-Identifier: GPL-2.0
37 int child_start; /* Array index of the first child node */
38 int child_end; /* Array index of the last child node */
39 int rover; /* Child node iterator */
45 int num_nodes; /* Number of nodes in a level in a cpuinfo tree */
51 /* Offsets into nodes[] for each level of the tree */
53 struct cpuinfo_node nodes[] __counted_by(total_nodes);
86 * nodes.
114 id = -EINVAL; in cpuinfo_id()
121 * end index, and number of nodes for each level in the cpuinfo tree. The
122 * total number of cpuinfo nodes required to build the tree is returned.
132 prev_id[i] = -1; in enumerate_cpuinfo_nodes()
133 lv->start_index = lv->end_index = lv->num_nodes = 0; in enumerate_cpuinfo_nodes()
171 tree_level[CPUINFO_LVL_CORE].end_index = n - 1; in enumerate_cpuinfo_nodes()
175 tree_level[CPUINFO_LVL_PROC].end_index = n - 1; in enumerate_cpuinfo_nodes()
197 new_tree = kzalloc(struct_size(new_tree, nodes, n), GFP_ATOMIC); in build_cpuinfo_tree()
201 new_tree->total_nodes = n; in build_cpuinfo_tree()
202 memcpy(&new_tree->level, tmp_level, sizeof(tmp_level)); in build_cpuinfo_tree()
207 for (level = CPUINFO_LVL_PROC; level >= CPUINFO_LVL_ROOT; level--) { in build_cpuinfo_tree()
208 n = new_tree->level[level].start_index; in build_cpuinfo_tree()
211 node = &new_tree->nodes[n]; in build_cpuinfo_tree()
218 node->id = id; in build_cpuinfo_tree()
219 node->level = level; in build_cpuinfo_tree()
220 node->num_cpus = 1; in build_cpuinfo_tree()
222 node->parent_index = (level > CPUINFO_LVL_ROOT) in build_cpuinfo_tree()
223 ? new_tree->level[level - 1].start_index : -1; in build_cpuinfo_tree()
225 node->child_start = node->child_end = node->rover = in build_cpuinfo_tree()
227 ? cpu : new_tree->level[level + 1].start_index; in build_cpuinfo_tree()
229 prev_id[level] = node->id; in build_cpuinfo_tree()
233 for (last_cpu = (num_possible_cpus() - 1); last_cpu >= 0; last_cpu--) { in build_cpuinfo_tree()
243 level--) { in build_cpuinfo_tree()
252 node = &new_tree->nodes[level_rover[level]]; in build_cpuinfo_tree()
253 node->num_cpus = num_cpus[level]; in build_cpuinfo_tree()
257 node->num_cpus++; in build_cpuinfo_tree()
261 node->parent_index = -1; in build_cpuinfo_tree()
263 node->parent_index = in build_cpuinfo_tree()
264 level_rover[level - 1]; in build_cpuinfo_tree()
267 node->child_end = in build_cpuinfo_tree()
270 node->child_end = in build_cpuinfo_tree()
271 level_rover[level + 1] - 1; in build_cpuinfo_tree()
276 if (n <= new_tree->level[level].end_index) { in build_cpuinfo_tree()
277 node = &new_tree->nodes[n]; in build_cpuinfo_tree()
278 node->id = id; in build_cpuinfo_tree()
279 node->level = level; in build_cpuinfo_tree()
281 /* Connect node to child */ in build_cpuinfo_tree()
282 node->child_start = node->child_end = in build_cpuinfo_tree()
283 node->rover = in build_cpuinfo_tree()
299 struct cpuinfo_node *node = &t->nodes[node_index]; in increment_rover()
302 top_level = t->nodes[root_index].level; in increment_rover()
303 for (level = node->level; level >= top_level; level--) { in increment_rover()
304 node->rover++; in increment_rover()
305 if (node->rover <= node->child_end) in increment_rover()
308 node->rover = node->child_start; in increment_rover()
314 node = &t->nodes[node->parent_index]; in increment_rover()
340 for (level = t->nodes[root_index].level; level < CPUINFO_LVL_MAX; in iterate_cpu()
342 new_index = t->nodes[index].rover; in iterate_cpu()
368 for (i = 0; i < cpuinfo_tree->nodes[0].num_cpus; i++) in _cpu_map_rebuild()
404 root_node = &cpuinfo_tree->nodes[0]; in _map_to_cpu()
406 if (unlikely(root_node->num_cpus != num_online_cpus())) { in _map_to_cpu()
412 return cpu_distribution_map[index % root_node->num_cpus]; in _map_to_cpu()