Forráskód Böngészése

Merge pull request #84 from kakra/improve-scheduler-logging

gamemode-scheduler: Improve logging
Alex Smith 6 éve
szülő
commit
9bbcc03c50
1 módosított fájl, 43 hozzáadás és 11 törlés
  1. 43 11
      daemon/gamemode.c

+ 43 - 11
daemon/gamemode.c

@@ -210,15 +210,15 @@ void game_mode_context_destroy(GameModeContext *self)
  */
 static void game_mode_apply_scheduler(GameModeContext *self, pid_t client)
 {
-	LOG_MSG("Setting scheduling policies...\n");
-
 	/*
 	 * read configuration "renice" (1..20)
 	 */
 	long int renice = 0;
 	config_get_renice_value(self->config, &renice);
 	if ((renice < 1) || (renice > 20)) {
-		LOG_ERROR("Renice value [%ld] defaulted to [%d].\n", renice, -NICE_DEFAULT_PRIORITY);
+		LOG_ERROR("Invalid renice value '%ld' reset to default: %d.\n",
+		          renice,
+		          -NICE_DEFAULT_PRIORITY);
 		renice = NICE_DEFAULT_PRIORITY;
 	} else {
 		renice = -renice;
@@ -228,13 +228,14 @@ static void game_mode_apply_scheduler(GameModeContext *self, pid_t client)
 	 * don't adjust priority if it was already adjusted
 	 */
 	if (getpriority(PRIO_PROCESS, (id_t)client) != 0) {
-		LOG_ERROR("Client [%d] already reniced, ignoring.\n", client);
+		LOG_ERROR("Refused to renice client [%d]: already reniced\n", client);
 	} else if (setpriority(PRIO_PROCESS, (id_t)client, (int)renice)) {
 		LOG_ERROR(
-		    "Renicing client [%d] failed with error %d, ignoring (your user may not have "
-		    "permission to do this).\n",
+		    "Failed to renice client [%d], ignoring error condition: %s\n"
+		    "    -- Your user may not have permission to do this. Please read the docs\n"
+		    "    -- to learn how to adjust the pam limits.\n",
 		    client,
-		    errno);
+		    strerror(errno));
 	}
 
 	/*
@@ -257,14 +258,45 @@ static void game_mode_apply_scheduler(GameModeContext *self, pid_t client)
 	if (!(strcmp(softrealtime, "off") == 0) && (enable_softrealtime)) {
 		const struct sched_param p = { .sched_priority = 0 };
 		if (sched_setscheduler(client, SCHED_ISO | SCHED_RESET_ON_FORK, &p)) {
+			const char *additional_message = "";
+			switch (errno) {
+			case EPERM: {
+				static int once = 0;
+				if (once++)
+					break;
+				additional_message =
+				    "    -- The error indicates that you may be running a resource management\n"
+				    "    -- daemon managing your game launcher and it leaks lower scheduling\n"
+				    "    -- classes into the games. This is likely a bug in the management daemon\n"
+				    "    -- and not a bug in GameMode, it should be reported upstream.\n"
+				    "    -- If unsure, please also look here:\n"
+				    "    -- https://github.com/FeralInteractive/gamemode/issues/68\n";
+				break;
+			}
+			case EINVAL: {
+				static int once = 0;
+				if (once++)
+					break;
+				additional_message =
+				    "    -- The error indicates that your kernel may not support this. If you\n"
+				    "    -- don't know what SCHED_ISO means, you can safely ignore this. If you\n"
+				    "    -- expected it to work, ensure you're running a kernel with MuQSS or\n"
+				    "    -- PDS scheduler.\n"
+				    "    -- For further technical reading on the topic start here:\n"
+				    "    -- https://lwn.net/Articles/720227/\n";
+				break;
+			}
+			}
 			LOG_ERROR(
-			    "Setting client [%d] to SCHED_ISO failed with error %d, ignoring (your "
-			    "kernel may not support this).\n",
+			    "Failed setting client [%d] into SCHED_ISO mode, ignoring error condition: %s\n%s",
 			    client,
-			    errno);
+			    strerror(errno),
+			    additional_message);
 		}
 	} else {
-		LOG_ERROR("Not using softrealtime, setting is '%s'.\n", softrealtime);
+		LOG_ERROR("Skipped setting client [%d] into SCHED_ISO mode: softrealtime setting is '%s'\n",
+		          client,
+		          softrealtime);
 	}
 }