diff --git a/daemon/ioprio.h b/daemon/gamemode-ioprio.c similarity index 59% rename from daemon/ioprio.h rename to daemon/gamemode-ioprio.c index cddab7e..159a991 100644 --- a/daemon/ioprio.h +++ b/daemon/gamemode-ioprio.c @@ -29,9 +29,14 @@ POSSIBILITY OF SUCH DAMAGE. */ -#pragma once - #define _GNU_SOURCE + +#include "daemon_config.h" +#include "gamemode.h" +#include "helpers.h" +#include "logging.h" + +#include #include #include @@ -80,3 +85,55 @@ static inline int ioprio_set(int which, int who, int ioprio) { return (int)syscall(SYS_ioprio_set, which, who, ioprio); } + +/** + * Apply io priorities + * + * This tries to change the io priority of the client to a value specified + * and can possibly reduce lags or latency when a game has to load assets + * on demand. + */ +void game_mode_apply_ioprio(const GameModeContext *self, const pid_t client) +{ + GameModeConfig *config = game_mode_config_from_context(self); + + LOG_MSG("Setting scheduling policies...\n"); + + /* + * read configuration "ioprio" (0..7) + */ + int ioprio = 0; + config_get_ioprio_value(config, &ioprio); + if (IOPRIO_RESET_DEFAULT == ioprio) { + LOG_MSG("IO priority will be reset to default behavior (based on CPU priority).\n"); + ioprio = 0; + } else if (IOPRIO_DONT_SET == ioprio) { + return; + } else { + /* maybe clamp the value */ + int invalid_ioprio = ioprio; + ioprio = CLAMP(0, 7, ioprio); + if (ioprio != invalid_ioprio) + LOG_ERROR("IO priority value %d invalid, clamping to %d\n", invalid_ioprio, ioprio); + + /* We support only IOPRIO_CLASS_BE as IOPRIO_CLASS_RT required CAP_SYS_ADMIN */ + ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, ioprio); + } + + /* + * Actually apply the io priority + */ + int c = IOPRIO_PRIO_CLASS(ioprio), p = IOPRIO_PRIO_DATA(ioprio); + if (ioprio_set(IOPRIO_WHO_PROCESS, client, ioprio) == 0) { + if (0 == ioprio) + LOG_MSG("Resetting client [%d] IO priority.\n", client); + else + LOG_MSG("Setting client [%d] IO priority to (%d,%d).\n", client, c, p); + } else { + LOG_ERROR("Setting client [%d] IO priority to (%d,%d) failed with error %d, ignoring\n", + client, + c, + p, + errno); + } +} diff --git a/daemon/gamemode.c b/daemon/gamemode.c index 79da96c..d046d1b 100644 --- a/daemon/gamemode.c +++ b/daemon/gamemode.c @@ -36,7 +36,6 @@ POSSIBILITY OF SUCH DAMAGE. #include "governors-query.h" #include "governors.h" #include "helpers.h" -#include "ioprio.h" #include "logging.h" #include @@ -159,56 +158,6 @@ void game_mode_context_destroy(GameModeContext *self) pthread_rwlock_destroy(&self->rwlock); } -/** - * Apply io priorities - * - * This tries to change the io priority of the client to a value specified - * and can possibly reduce lags or latency when a game has to load assets - * on demand. - */ -static void game_mode_apply_ioprio(GameModeContext *self, pid_t client) -{ - LOG_MSG("Setting scheduling policies...\n"); - - /* - * read configuration "ioprio" (0..7) - */ - int ioprio = 0; - config_get_ioprio_value(self->config, &ioprio); - if (IOPRIO_RESET_DEFAULT == ioprio) { - LOG_MSG("IO priority will be reset to default behavior (based on CPU priority).\n"); - ioprio = 0; - } else if (IOPRIO_DONT_SET == ioprio) { - return; - } else { - /* maybe clamp the value */ - int invalid_ioprio = ioprio; - ioprio = CLAMP(0, 7, ioprio); - if (ioprio != invalid_ioprio) - LOG_ERROR("IO priority value %d invalid, clamping to %d\n", invalid_ioprio, ioprio); - - /* We support only IOPRIO_CLASS_BE as IOPRIO_CLASS_RT required CAP_SYS_ADMIN */ - ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, ioprio); - } - - /* - * Actually apply the io priority - */ - int c = IOPRIO_PRIO_CLASS(ioprio), p = IOPRIO_PRIO_DATA(ioprio); - if (ioprio_set(IOPRIO_WHO_PROCESS, client, ioprio) == 0) { - if (0 == ioprio) - LOG_MSG("Resetting client [%d] IO priority.\n", client); - else - LOG_MSG("Setting client [%d] IO priority to (%d,%d).\n", client, c, p); - } else { - LOG_ERROR("Setting client [%d] IO priority to (%d,%d) failed with error %d, ignoring\n", - client, - c, - p, - errno); - } -} - /** * Pivot into game mode. * diff --git a/daemon/gamemode.h b/daemon/gamemode.h index ab41576..083b389 100644 --- a/daemon/gamemode.h +++ b/daemon/gamemode.h @@ -104,6 +104,12 @@ GameModeConfig *game_mode_config_from_context(const GameModeContext *context); char *game_mode_lookup_proc_env(const procfd_t proc_fd, const char *var); char *game_mode_lookup_user_home(void); +/** gamemode-ioprio.c + * Provides internal API functions specific to adjusting process + * IO priorities. + */ +void game_mode_apply_ioprio(const GameModeContext *self, const pid_t client); + /** gamemode-proc.c * Provides internal API functions specific to working with process * environments. diff --git a/daemon/meson.build b/daemon/meson.build index ecc8181..ebcf1d6 100644 --- a/daemon/meson.build +++ b/daemon/meson.build @@ -19,6 +19,7 @@ daemon_sources = [ 'main.c', 'gamemode.c', 'gamemode-env.c', + 'gamemode-ioprio.c', 'gamemode-proc.c', 'gamemode-sched.c', 'daemonize.c',