[PATCH] acpi: s3: check sleep type for output messages

Alex Hung alex.hung at canonical.com
Fri May 10 04:50:38 UTC 2019


Recent systems may support s2idle; as a result, output messages based on
reading from /sys/power/mem_sleep.

Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
 src/acpi/s3/s3.c | 48 ++++++++++++++++++++++++++++--------------------
 1 file changed, 28 insertions(+), 20 deletions(-)

diff --git a/src/acpi/s3/s3.c b/src/acpi/s3/s3.c
index fa7ed52b..ff25960f 100644
--- a/src/acpi/s3/s3.c
+++ b/src/acpi/s3/s3.c
@@ -32,6 +32,9 @@
 
 #define PM_SUSPEND_PMUTILS		"pm-suspend"
 #define PM_SUSPEND_HYBRID_PMUTILS	"pm-suspend-hybrid"
+#define PM_SUPEND_PATH			"/sys/power/mem_sleep"
+
+static char sleep_type[7];
 
 static int  s3_multiple = 1;		/* number of s3 multiple tests to run */
 static int  s3_min_delay = 0;		/* min time between resume and next suspend */
@@ -51,12 +54,17 @@ static int s3_init(fwts_framework *fw)
 {
 	/* Pre-init - make sure wakealarm works so that we can wake up after suspend */
 	if (fwts_wakealarm_test_firing(fw, 1) != FWTS_OK) {
-		fwts_log_error(fw, "Cannot automatically wake machine up - aborting S3 test.");
-		fwts_failed(fw, LOG_LEVEL_MEDIUM, "BadWakeAlarmS3",
-			"Check if wakealarm works reliably for S3 tests.");
+		fwts_log_error(fw, "Cannot automatically wake machine up - aborting Sleep test.");
+		fwts_failed(fw, LOG_LEVEL_MEDIUM, "BadWakeAlarmSleep",
+			"Check if wakealarm works reliably for Sleep tests.");
 		return FWTS_ERROR;
 	}
 
+	if (fwts_get(PM_SUPEND_PATH) != NULL && strstr(fwts_get(PM_SUPEND_PATH), "[s2idle]"))
+		strncpy(sleep_type, "s2idle", strlen("s2idle") + 1);
+	else
+		strncpy(sleep_type, "S3", strlen("S3") + 1);
+
 	return FWTS_OK;
 }
 
@@ -134,7 +142,7 @@ static int wrap_logind_do_suspend(fwts_pm_method_vars *fwts_settings,
 	fwts_progress_message(fwts_settings->fw, percent, "(Suspending)");
 	/* This blocks by entering a glib mainloop */
 	*duration = fwts_logind_wait_for_resume_from_action(fwts_settings, action, s3_min_delay);
-	fwts_log_info(fwts_settings->fw, "S3 duration = %d.", *duration);
+	fwts_log_info(fwts_settings->fw, "%s duration = %d.", sleep_type, *duration);
 	fwts_progress_message(fwts_settings->fw, percent, "(Resumed)");
 
 	return *duration > 0 ? 0 : 1;
@@ -281,7 +289,7 @@ static int s3_do_suspend_resume(fwts_framework *fw,
 
 	fwts_wakealarm_trigger(fw, delay);
 
-	/* Do S3 here */
+	/* Do S3 / S2idle here */
 	status = do_suspend(fwts_settings, percent, &duration, command);
 
 	fwts_log_info(fw, "pm-action returned %d after %d seconds.", status, duration);
@@ -303,30 +311,30 @@ static int s3_do_suspend_resume(fwts_framework *fw,
 		fwts_hwinfo_free(&hwinfo2);
 
 		if (differences > 0) {
-			fwts_failed(fw, LOG_LEVEL_HIGH, "DevConfigDiffAfterS3",
-				"Found %d differences in device configuration during S3 cycle.", differences);
+			fwts_failed(fw, LOG_LEVEL_HIGH, "DevConfigDiffAfterSleep",
+				"Found %d differences in device configuration during %s cycle.", differences, sleep_type);
 			(*hw_errors)++;
 		}
 	}
 
 	if (s3_hook && (s3_hook_exec(fw, s3_hook) != FWTS_OK)) {
 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "HookScriptFailed",
-			"Error executing hook script '%s', S3 cycles "
-			"will be aborted.", s3_hook);
+			"Error executing hook script '%s', %s cycles "
+			"will be aborted.", s3_hook, sleep_type);
 		(*hook_errors)++;
 	}
 
 	if (duration < delay) {
 		(*pm_errors)++;
 		fwts_failed(fw, LOG_LEVEL_MEDIUM, "ShortSuspend",
-			"Unexpected: S3 slept for %d seconds, less than the expected %d seconds.", duration, delay);
+			"Unexpected: %s slept for %d seconds, less than the expected %d seconds.", sleep_type, duration, delay);
 	}
 	fwts_progress_message(fw, percent, "(Checking for errors)");
 	if (duration > (delay*2)) {
 		int s3_C1E_enabled;
 		(*pm_errors)++;
 		fwts_failed(fw, LOG_LEVEL_HIGH, "LongSuspend",
-			"Unexpected: S3 much longer than expected (%d seconds).", duration);
+			"Unexpected: %s much longer than expected (%d seconds).", sleep_type, duration);
 
 		s3_C1E_enabled = fwts_cpu_has_c1e();
 		if (s3_C1E_enabled == -1)
@@ -343,17 +351,17 @@ static int s3_do_suspend_resume(fwts_framework *fw,
 	/* Add in error check for pm-suspend status */
 	if ((status > 0) && (status < 128)) {
 		(*pm_errors)++;
-		fwts_failed(fw, LOG_LEVEL_HIGH, "PMActionFailedPreS3",
+		fwts_failed(fw, LOG_LEVEL_HIGH, "PMActionFailedPreSleep",
 			"pm-action failed before trying to put the system "
 			"in the requested power saving state.");
 	} else if (status == 128) {
 		(*pm_errors)++;
-		fwts_failed(fw, LOG_LEVEL_HIGH, "PMActionPowerStateS3",
+		fwts_failed(fw, LOG_LEVEL_HIGH, "PMActionPowerStateSleep",
 			"pm-action tried to put the machine in the requested "
 			"power state but failed.");
 	} else if (status > 128) {
 		(*pm_errors)++;
-		fwts_failed(fw, LOG_LEVEL_HIGH, "PMActionFailedS3",
+		fwts_failed(fw, LOG_LEVEL_HIGH, "PMActionFailedSleep",
 			"pm-action encountered an error and also failed to "
 			"enter the requested power saving state.");
 	}
@@ -506,13 +514,13 @@ static int s3_test_multiple(fwts_framework *fw)
 	(void)fwts_pm_debug_set(1);
 
 	if (s3_multiple == 1)
-		fwts_log_info(fw, "Defaulted to 1 test, use --s3-multiple=N to run more S3 cycles\n");
+		fwts_log_info(fw, "Defaulted to 1 test, use --s3-multiple=N to run more %s cycles\n", sleep_type);
 
 	for (i = 0; i < s3_multiple; i++) {
 		struct timeval tv;
 		int ret, percent = (i * 100) / s3_multiple;
 		fwts_list *klog_pre, *klog_post, *klog_diff;
-		fwts_log_info(fw, "S3 cycle %d of %d\n",i+1,s3_multiple);
+		fwts_log_info(fw, "%s cycle %d of %d\n", sleep_type, i+1, s3_multiple);
 
 		if ((klog_pre = fwts_klog_read()) == NULL)
 			fwts_log_error(fw, "Cannot read kernel log.");
@@ -521,7 +529,7 @@ static int s3_test_multiple(fwts_framework *fw)
 					   &hook_errors, s3_sleep_delay,
 					   percent);
 		if (ret == FWTS_OUT_OF_MEMORY) {
-			fwts_log_error(fw, "S3 cycle %d failed - out of memory error.", i+1);
+			fwts_log_error(fw, "%s cycle %d failed - out of memory error.", sleep_type, i+1);
 			fwts_klog_free(klog_pre);
 			break;
 		}
@@ -567,7 +575,7 @@ static int s3_test_multiple(fwts_framework *fw)
 	if (pm_debug != -1)
 		(void)fwts_pm_debug_set(pm_debug);
 
-	fwts_log_info(fw, "Completed S3 cycle(s)\n");
+	fwts_log_info(fw, "Completed %s cycle(s)\n", sleep_type);
 
 	if (klog_errors > 0)
 		fwts_log_info(fw, "Found %d errors in kernel log.", klog_errors);
@@ -752,12 +760,12 @@ static fwts_option s3_options[] = {
 };
 
 static fwts_framework_minor_test s3_tests[] = {
-	{ s3_test_multiple, "S3 suspend/resume test." },
+	{ s3_test_multiple, "Sleep suspend/resume test." },
 	{ NULL, NULL }
 };
 
 static fwts_framework_ops s3_ops = {
-	.description = "S3 suspend/resume test.",
+	.description = "Sleep suspend/resume test.",
 	.init        = s3_init,
 	.minor_tests = s3_tests,
 	.options     = s3_options,
-- 
2.17.1




More information about the fwts-devel mailing list