[PATCH 2/2] acpi: s3: add timings report for suspend/resume (LP: #1241638)

Colin King colin.king at canonical.com
Mon Oct 21 14:12:52 UTC 2013


From: Colin Ian King <colin.king at canonical.com>

Add fwts info logging of duration of suspend and resuming timings.
This update is a request from the certification group.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 src/acpi/s3/s3.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 81 insertions(+), 3 deletions(-)

diff --git a/src/acpi/s3/s3.c b/src/acpi/s3/s3.c
index ad1f564..1e434f7 100644
--- a/src/acpi/s3/s3.c
+++ b/src/acpi/s3/s3.c
@@ -30,6 +30,8 @@
 #include <time.h>
 
 #define PM_SUSPEND "pm-suspend"
+#define FWTS_SUSPEND	"FWTS_SUSPEND"
+#define FWTS_RESUME	"FWTS_RESUME"
 
 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 */
@@ -82,8 +84,6 @@ static int s3_do_suspend_resume(fwts_framework *fw,
 	if (s3_device_check)
 		fwts_hwinfo_get(fw, &hwinfo1);
 
-
-
 	/* Format up pm-suspend command with optional quirking arguments */
 	if ((command = fwts_realloc_strcat(NULL, PM_SUSPEND)) == NULL)
 		return FWTS_OUT_OF_MEMORY;
@@ -107,7 +107,11 @@ static int s3_do_suspend_resume(fwts_framework *fw,
 	/* Do S3 here */
 	fwts_progress_message(fw, percent, "(Suspending)");
 	time(&t_start);
+	(void)fwts_klog_write(fw, "Starting fwts suspend\n");
+	(void)fwts_klog_write(fw, FWTS_SUSPEND "\n");
 	(void)fwts_pipe_exec(command, &output, &status);
+	(void)fwts_klog_write(fw, FWTS_RESUME "\n");
+	(void)fwts_klog_write(fw, "Finished fwts resume\n");
 	time(&t_end);
 	fwts_progress_message(fw, percent, "(Resumed)");
 	fwts_text_list_free(output);
@@ -116,7 +120,6 @@ static int s3_do_suspend_resume(fwts_framework *fw,
 	duration = (int)(t_end - t_start);
 	fwts_log_info(fw, "pm-suspend returned %d after %d seconds.", status, duration);
 
-
 	if (s3_device_check) {
 		int i;
 
@@ -187,6 +190,79 @@ static int s3_do_suspend_resume(fwts_framework *fw,
 	return FWTS_OK;
 }
 
+static int s3_scan_times(fwts_framework *fw, fwts_list *klog)
+{
+	fwts_list_link *item;
+
+	double s3_suspend_start = -1.0, s3_suspend_finish = -1.0;
+	double s3_resume_start = -1.0, s3_resume_finish = -1.0;
+	double previous_ts = -1.0, ts = 0.0;
+
+	fwts_list_foreach(item, klog) {
+		char *txt = (char *)item->data;
+		char *bracket = strchr(txt, '[');
+		size_t len = strlen(txt);
+
+		if (len < 15 || bracket == NULL)
+			continue;
+
+		previous_ts = ts;
+
+		/* Get log time stamp */
+		sscanf(bracket + 1, "%lf", &ts);
+		if (strstr(txt, FWTS_SUSPEND)) {
+			s3_suspend_start = ts;
+			continue;
+		}
+		if (strstr(txt, FWTS_RESUME)) {
+			s3_resume_finish = ts;
+			continue;
+		}
+		/* This may be the last message we see from the kernel */
+		if (strstr(txt, "PM: Saving platform NVS memory")) {
+			s3_suspend_finish = ts;
+			continue;
+		}
+		/* And this may appear even later */
+		if (strstr(txt, "smpboot: CPU") && strstr(txt, "is now offline")) {
+			s3_suspend_finish = ts;
+			continue;
+		}
+
+		if (strstr(txt, "ACPI: Low-level resume complete")) {
+			s3_resume_start = ts;
+			if (s3_suspend_finish < 0.0)
+				s3_suspend_finish = previous_ts;
+			continue;
+		}
+		if (s3_resume_start < 0.0 && strstr(txt, "ACPI: Waking up from system sleep state S3")) {
+			s3_resume_start = ts;
+			if (s3_suspend_finish < 0.0)
+				s3_suspend_finish = previous_ts;
+			continue;
+		}
+		if (strstr(txt, "Restarting tasks ... done")) {
+			s3_resume_finish = ts;
+			break;
+		}
+	}
+
+	fwts_log_info(fw, "Suspend/Resume Timings:");
+	if (s3_suspend_start > 0.0 && s3_suspend_finish > 0.0)
+		fwts_log_info_verbatum(fw, "  Suspend: %.3f seconds.",
+			s3_suspend_finish - s3_suspend_start);
+	else
+		fwts_log_info_verbatum(fw, "  Could not determine time to suspend.");
+
+	if (s3_resume_start > 0.0 && s3_resume_finish > 0.0)
+		fwts_log_info_verbatum(fw, "  Resume:  %.3f seconds.",
+			s3_resume_finish - s3_resume_start);
+	else
+		fwts_log_info_verbatum(fw, "  Could not determine time to resume.");
+
+	return FWTS_OK;
+}
+
 static int s3_check_log(fwts_framework *fw, int *errors, int *oopses, int *warn_ons)
 {
 	fwts_list *klog;
@@ -215,6 +291,8 @@ static int s3_check_log(fwts_framework *fw, int *errors, int *oopses, int *warn_
 	*oopses += oops;
 	*warn_ons += warn_on;
 
+	s3_scan_times(fw, klog);
+
 	fwts_klog_free(klog);
 
 	return FWTS_OK;
-- 
1.8.3.2




More information about the fwts-devel mailing list