Lines Matching +full:cpu +full:- +full:core
1 // SPDX-License-Identifier: GPL-2.0-only
3 * (C) 2004-2009 Dominik Brodowski <linux@dominikbrodowski.de>
20 if (access(path, F_OK) == -1) in is_valid_path()
31 if (fd == -1) in cpupower_read_sysfs()
34 numread = read(fd, buf, buflen - 1); in cpupower_read_sysfs()
52 if (fd == -1) in cpupower_write_sysfs()
55 numwritten = write(fd, buf, buflen - 1); in cpupower_write_sysfs()
59 return -1; in cpupower_write_sysfs()
68 * Detect whether a CPU is online
71 * 1 -> if CPU is online
72 * 0 -> if CPU is offline
75 int cpupower_is_cpu_online(unsigned int cpu) in cpupower_is_cpu_online() argument
85 snprintf(path, sizeof(path), PATH_TO_CPU "cpu%u", cpu); in cpupower_is_cpu_online()
92 * -> cpuX directory exists, but not cpuX/online file in cpupower_is_cpu_online()
94 snprintf(path, sizeof(path), PATH_TO_CPU "cpu%u/online", cpu); in cpupower_is_cpu_online()
99 if (fd == -1) in cpupower_is_cpu_online()
100 return -errno; in cpupower_is_cpu_online()
102 numread = read(fd, linebuf, MAX_LINE_LEN - 1); in cpupower_is_cpu_online()
105 return -EIO; in cpupower_is_cpu_online()
112 return -EINVAL; in cpupower_is_cpu_online()
117 /* returns -1 on failure, 0 on success */
118 static int sysfs_topology_read_file(unsigned int cpu, const char *fname, int *result) in sysfs_topology_read_file() argument
124 snprintf(path, sizeof(path), PATH_TO_CPU "cpu%u/topology/%s", in sysfs_topology_read_file()
125 cpu, fname); in sysfs_topology_read_file()
127 return -1; in sysfs_topology_read_file()
130 return -1; in sysfs_topology_read_file()
138 if (top1->pkg < top2->pkg) in __compare()
139 return -1; in __compare()
140 else if (top1->pkg > top2->pkg) in __compare()
142 else if (top1->core < top2->core) in __compare()
143 return -1; in __compare()
144 else if (top1->core > top2->core) in __compare()
146 else if (top1->cpu < top2->cpu) in __compare()
147 return -1; in __compare()
148 else if (top1->cpu > top2->cpu) in __compare()
159 return strcmp(top1->core_cpu_list, top2->core_cpu_list); in __compare_core_cpu_list()
166 * Array is sorted after ->cpu_smt_list ->pkg, ->core
170 int cpu, last_pkg, cpus = sysconf(_SC_NPROCESSORS_CONF); in get_cpu_topology() local
174 cpu_top->core_info = malloc(sizeof(struct cpuid_core_info) * cpus); in get_cpu_topology()
175 if (cpu_top->core_info == NULL) in get_cpu_topology()
176 return -ENOMEM; in get_cpu_topology()
177 cpu_top->pkgs = cpu_top->cores = 0; in get_cpu_topology()
178 for (cpu = 0; cpu < cpus; cpu++) { in get_cpu_topology()
179 cpu_top->core_info[cpu].cpu = cpu; in get_cpu_topology()
180 cpu_top->core_info[cpu].is_online = cpupower_is_cpu_online(cpu); in get_cpu_topology()
182 cpu, in get_cpu_topology()
184 &(cpu_top->core_info[cpu].pkg)) < 0) { in get_cpu_topology()
185 cpu_top->core_info[cpu].pkg = -1; in get_cpu_topology()
186 cpu_top->core_info[cpu].core = -1; in get_cpu_topology()
190 cpu, in get_cpu_topology()
192 &(cpu_top->core_info[cpu].core)) < 0) { in get_cpu_topology()
193 cpu_top->core_info[cpu].pkg = -1; in get_cpu_topology()
194 cpu_top->core_info[cpu].core = -1; in get_cpu_topology()
197 if (cpu_top->core_info[cpu].core == -1) { in get_cpu_topology()
198 strncpy(cpu_top->core_info[cpu].core_cpu_list, "-1", CPULIST_BUFFER); in get_cpu_topology()
201 snprintf(path, sizeof(path), PATH_TO_CPU "cpu%u/topology/%s", in get_cpu_topology()
202 cpu, "core_cpus_list"); in get_cpu_topology()
205 cpu_top->core_info[cpu].core_cpu_list, in get_cpu_topology()
207 printf("Warning CPU%u has a 0 size core_cpus_list string", cpu); in get_cpu_topology()
211 /* Count the number of distinct cpu lists to get the physical core in get_cpu_topology()
214 qsort(cpu_top->core_info, cpus, sizeof(struct cpuid_core_info), in get_cpu_topology()
217 last_cpu_list = cpu_top->core_info[0].core_cpu_list; in get_cpu_topology()
218 cpu_top->cores = 1; in get_cpu_topology()
219 for (cpu = 1; cpu < cpus; cpu++) { in get_cpu_topology()
220 if (strcmp(cpu_top->core_info[cpu].core_cpu_list, last_cpu_list) != 0 && in get_cpu_topology()
221 cpu_top->core_info[cpu].pkg != -1) { in get_cpu_topology()
222 last_cpu_list = cpu_top->core_info[cpu].core_cpu_list; in get_cpu_topology()
223 cpu_top->cores++; in get_cpu_topology()
227 qsort(cpu_top->core_info, cpus, sizeof(struct cpuid_core_info), in get_cpu_topology()
233 last_pkg = cpu_top->core_info[0].pkg; in get_cpu_topology()
234 for(cpu = 1; cpu < cpus; cpu++) { in get_cpu_topology()
235 if (cpu_top->core_info[cpu].pkg != last_pkg && in get_cpu_topology()
236 cpu_top->core_info[cpu].pkg != -1) { in get_cpu_topology()
238 last_pkg = cpu_top->core_info[cpu].pkg; in get_cpu_topology()
239 cpu_top->pkgs++; in get_cpu_topology()
242 if (!(cpu_top->core_info[0].pkg == -1)) in get_cpu_topology()
243 cpu_top->pkgs++; in get_cpu_topology()