mirror of
https://github.com/FeralInteractive/gamemode.git
synced 2025-06-06 15:47:20 +02:00
Update gamemode-context.c
added support for disabling the kernel split lock mitigation when entering game mode
This commit is contained in:
parent
b2bd7e5919
commit
9a7ee00bbf
@ -91,6 +91,8 @@ struct GameModeContext {
|
|||||||
uint32_t last_cpu_energy_uj;
|
uint32_t last_cpu_energy_uj;
|
||||||
uint32_t last_igpu_energy_uj;
|
uint32_t last_igpu_energy_uj;
|
||||||
|
|
||||||
|
long initial_split_lock_mitigate;
|
||||||
|
|
||||||
/* Reaper control */
|
/* Reaper control */
|
||||||
struct {
|
struct {
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
@ -114,6 +116,7 @@ static void game_mode_context_enter(GameModeContext *self);
|
|||||||
static void game_mode_context_leave(GameModeContext *self);
|
static void game_mode_context_leave(GameModeContext *self);
|
||||||
static char *game_mode_context_find_exe(pid_t pid);
|
static char *game_mode_context_find_exe(pid_t pid);
|
||||||
static void game_mode_execute_scripts(char scripts[CONFIG_LIST_MAX][CONFIG_VALUE_MAX], int timeout);
|
static void game_mode_execute_scripts(char scripts[CONFIG_LIST_MAX][CONFIG_VALUE_MAX], int timeout);
|
||||||
|
static int game_mode_disable_splitlock(GameModeContext *self, bool disable);
|
||||||
|
|
||||||
static void start_reaper_thread(GameModeContext *self)
|
static void start_reaper_thread(GameModeContext *self)
|
||||||
{
|
{
|
||||||
@ -151,6 +154,8 @@ void game_mode_context_init(GameModeContext *self)
|
|||||||
/* Initialise the current CPU info */
|
/* Initialise the current CPU info */
|
||||||
game_mode_initialise_cpu(self->config, &self->cpu);
|
game_mode_initialise_cpu(self->config, &self->cpu);
|
||||||
|
|
||||||
|
self->initial_split_lock_mitigate = -1;
|
||||||
|
|
||||||
pthread_rwlock_init(&self->rwlock, NULL);
|
pthread_rwlock_init(&self->rwlock, NULL);
|
||||||
|
|
||||||
/* Get the reaper thread going */
|
/* Get the reaper thread going */
|
||||||
@ -202,6 +207,57 @@ void game_mode_context_destroy(GameModeContext *self)
|
|||||||
pthread_rwlock_destroy(&self->rwlock);
|
pthread_rwlock_destroy(&self->rwlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int game_mode_disable_splitlock(GameModeContext *self, bool disable)
|
||||||
|
{
|
||||||
|
if (!config_get_disable_splitlock(self->config))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
long value_num = self->initial_split_lock_mitigate;
|
||||||
|
char value_str[40];
|
||||||
|
|
||||||
|
if (disable) {
|
||||||
|
FILE *f = fopen("/proc/sys/kernel/split_lock_mitigate", "r");
|
||||||
|
if (f == NULL) {
|
||||||
|
if (errno == ENOENT)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
LOG_ERROR("Couldn't open /proc/sys/kernel/split_lock_mitigate : %s\n", strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fgets(value_str, sizeof value_str, f) == NULL) {
|
||||||
|
LOG_ERROR("Couldn't read from /proc/sys/kernel/split_lock_mitigate : %s\n", strerror(errno));
|
||||||
|
fclose(f);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
self->initial_split_lock_mitigate = strtol (value_str, NULL, 10);
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
value_num = 0;
|
||||||
|
if (self->initial_split_lock_mitigate == value_num)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value_num == -1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
sprintf(value_str, "%ld", value_num);
|
||||||
|
|
||||||
|
const char *const exec_args[] = {
|
||||||
|
"pkexec", LIBEXECDIR "/procsysctl", "split_lock_mitigate", value_str, NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
LOG_MSG("Requesting update of split_lock_mitigate to %s\n", value_str);
|
||||||
|
int ret = run_external_process(exec_args, NULL, -1);
|
||||||
|
if (ret != 0) {
|
||||||
|
LOG_ERROR("Failed to update split_lock_mitigate\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int game_mode_set_governor(GameModeContext *self, enum GameModeGovernor gov)
|
static int game_mode_set_governor(GameModeContext *self, enum GameModeGovernor gov)
|
||||||
{
|
{
|
||||||
if (self->current_govenor == gov) {
|
if (self->current_govenor == gov) {
|
||||||
@ -369,6 +425,8 @@ static void game_mode_context_enter(GameModeContext *self)
|
|||||||
if (config_get_inhibit_screensaver(self->config))
|
if (config_get_inhibit_screensaver(self->config))
|
||||||
game_mode_inhibit_screensaver(true);
|
game_mode_inhibit_screensaver(true);
|
||||||
|
|
||||||
|
game_mode_disable_splitlock(self, true);
|
||||||
|
|
||||||
/* Apply GPU optimisations by first getting the current values, and then setting the target */
|
/* Apply GPU optimisations by first getting the current values, and then setting the target */
|
||||||
game_mode_get_gpu(self->stored_gpu);
|
game_mode_get_gpu(self->stored_gpu);
|
||||||
game_mode_apply_gpu(self->target_gpu);
|
game_mode_apply_gpu(self->target_gpu);
|
||||||
@ -404,6 +462,8 @@ static void game_mode_context_leave(GameModeContext *self)
|
|||||||
if (config_get_inhibit_screensaver(self->config))
|
if (config_get_inhibit_screensaver(self->config))
|
||||||
game_mode_inhibit_screensaver(false);
|
game_mode_inhibit_screensaver(false);
|
||||||
|
|
||||||
|
game_mode_disable_splitlock(self, false);
|
||||||
|
|
||||||
game_mode_set_governor(self, GAME_MODE_GOVERNOR_DEFAULT);
|
game_mode_set_governor(self, GAME_MODE_GOVERNOR_DEFAULT);
|
||||||
|
|
||||||
game_mode_disable_igpu_optimization(self);
|
game_mode_disable_igpu_optimization(self);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user