mirror of
https://github.com/FeralInteractive/gamemode.git
synced 2025-06-06 15:47:20 +02:00
Use better kernel api for P/E-cores (#515)
There's a proper kernel way to check for the presence of P- and E-cores so we don't have to check the frequency differences. Kept the frequency check in case the kernel way does not exist on the users kernel but upped the fail-safe to 10% from 5% to close #498
This commit is contained in:
parent
2eecd513ac
commit
1d9c1e6a72
@ -73,6 +73,38 @@ static int read_small_file(char *path, char **buf, size_t *buflen)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_online_from_list(char *cpulist, GameModeCPUInfo *info)
|
||||||
|
{
|
||||||
|
long from, to;
|
||||||
|
while ((cpulist = parse_cpulist(cpulist, &from, &to))) {
|
||||||
|
for (long cpu = from; cpu < to + 1; cpu++) {
|
||||||
|
CPU_SET_S((size_t)cpu, CPU_ALLOC_SIZE(info->num_cpu), info->online);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int check_pe_cores(char **buf, size_t *buflen, GameModeCPUInfo *info)
|
||||||
|
{
|
||||||
|
if (!read_small_file("/sys/devices/cpu_core/cpus", buf, buflen))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
LOG_MSG("found kernel support for checking P/E-cores\n");
|
||||||
|
|
||||||
|
long from, to;
|
||||||
|
char *list = *buf;
|
||||||
|
while ((list = parse_cpulist(list, &from, &to))) {
|
||||||
|
for (long cpu = from; cpu < to + 1; cpu++) {
|
||||||
|
CPU_SET_S((size_t)cpu, CPU_ALLOC_SIZE(info->num_cpu), info->to_keep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CPU_EQUAL_S(CPU_ALLOC_SIZE(info->num_cpu), info->online, info->to_keep) ||
|
||||||
|
CPU_COUNT_S(CPU_ALLOC_SIZE(info->num_cpu), info->to_keep) == 0)
|
||||||
|
LOG_MSG("kernel did not indicate that this was an P/E-cores system\n");
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int walk_sysfs(char *cpulist, char **buf, size_t *buflen, GameModeCPUInfo *info)
|
static int walk_sysfs(char *cpulist, char **buf, size_t *buflen, GameModeCPUInfo *info)
|
||||||
{
|
{
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
@ -84,8 +116,6 @@ static int walk_sysfs(char *cpulist, char **buf, size_t *buflen, GameModeCPUInfo
|
|||||||
char *list = cpulist;
|
char *list = cpulist;
|
||||||
while ((list = parse_cpulist(list, &from, &to))) {
|
while ((list = parse_cpulist(list, &from, &to))) {
|
||||||
for (long cpu = from; cpu < to + 1; cpu++) {
|
for (long cpu = from; cpu < to + 1; cpu++) {
|
||||||
CPU_SET_S((size_t)cpu, CPU_ALLOC_SIZE(info->num_cpu), info->online);
|
|
||||||
|
|
||||||
/* check for L3 cache non-uniformity among the cores */
|
/* check for L3 cache non-uniformity among the cores */
|
||||||
int ret =
|
int ret =
|
||||||
snprintf(path, PATH_MAX, "/sys/devices/system/cpu/cpu%ld/cache/index3/size", cpu);
|
snprintf(path, PATH_MAX, "/sys/devices/system/cpu/cpu%ld/cache/index3/size", cpu);
|
||||||
@ -125,7 +155,7 @@ static int walk_sysfs(char *cpulist, char **buf, size_t *buflen, GameModeCPUInfo
|
|||||||
if (ret > 0 && ret < PATH_MAX) {
|
if (ret > 0 && ret < PATH_MAX) {
|
||||||
if (read_small_file(path, buf, buflen)) {
|
if (read_small_file(path, buf, buflen)) {
|
||||||
unsigned long long freq = strtoull(*buf, NULL, 10);
|
unsigned long long freq = strtoull(*buf, NULL, 10);
|
||||||
unsigned long long cutoff = (freq * 5) / 100;
|
unsigned long long cutoff = (freq * 10) / 100;
|
||||||
|
|
||||||
if (freq > max_freq) {
|
if (freq > max_freq) {
|
||||||
if (max_freq < freq - cutoff)
|
if (max_freq < freq - cutoff)
|
||||||
@ -278,8 +308,13 @@ int game_mode_initialise_cpu(GameModeConfig *config, GameModeCPUInfo **info)
|
|||||||
} else if (park_or_pin == IS_CPU_PIN && pin_cores[0] != '\0') {
|
} else if (park_or_pin == IS_CPU_PIN && pin_cores[0] != '\0') {
|
||||||
if (!walk_string(buf, pin_cores, new_info))
|
if (!walk_string(buf, pin_cores, new_info))
|
||||||
goto error_exit;
|
goto error_exit;
|
||||||
} else if (!walk_sysfs(buf, &buf2, &buf2len, new_info)) {
|
} else {
|
||||||
goto error_exit;
|
set_online_from_list(buf, new_info);
|
||||||
|
|
||||||
|
if (!check_pe_cores(&buf2, &buf2len, new_info)) {
|
||||||
|
if (!walk_sysfs(buf, &buf2, &buf2len, new_info))
|
||||||
|
goto error_exit;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (park_or_pin == IS_CPU_PARK &&
|
if (park_or_pin == IS_CPU_PARK &&
|
||||||
|
Loading…
x
Reference in New Issue
Block a user