Module Name:    src
Committed By:   jruoho
Date:           Wed Sep 28 15:38:22 UTC 2011

Modified Files:
        src/sys/arch/x86/x86: cpu.c
        src/sys/arch/xen/x86: cpu.c

Log Message:
Call cpufreq_suspend(9) and cpufreq_resume(9) during suspend/resume.


To generate a diff of this commit:
cvs rdiff -u -r1.92 -r1.93 src/sys/arch/x86/x86/cpu.c
cvs rdiff -u -r1.65 -r1.66 src/sys/arch/xen/x86/cpu.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/x86/x86/cpu.c
diff -u src/sys/arch/x86/x86/cpu.c:1.92 src/sys/arch/x86/x86/cpu.c:1.93
--- src/sys/arch/x86/x86/cpu.c:1.92	Thu Aug 11 20:33:20 2011
+++ src/sys/arch/x86/x86/cpu.c	Wed Sep 28 15:38:21 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.92 2011/08/11 20:33:20 cherry Exp $	*/
+/*	$NetBSD: cpu.c,v 1.93 2011/09/28 15:38:21 jruoho Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.92 2011/08/11 20:33:20 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.93 2011/09/28 15:38:21 jruoho Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mpbios.h"		/* for MPDEBUG */
@@ -81,6 +81,7 @@ __KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.92
 #include <sys/device.h>
 #include <sys/kmem.h>
 #include <sys/cpu.h>
+#include <sys/cpufreq.h>
 #include <sys/atomic.h>
 #include <sys/reboot.h>
 
@@ -1090,11 +1091,15 @@ cpu_suspend(device_t dv, const pmf_qual_
 	struct cpu_info *ci = sc->sc_info;
 	int err;
 
-	if (ci->ci_flags & CPUF_PRIMARY)
+	if ((ci->ci_flags & CPUF_PRESENT) == 0)
 		return true;
-	if (ci->ci_data.cpu_idlelwp == NULL)
+
+	cpufreq_suspend(ci);
+
+	if ((ci->ci_flags & CPUF_PRIMARY) != 0)
 		return true;
-	if ((ci->ci_flags & CPUF_PRESENT) == 0)
+
+	if (ci->ci_data.cpu_idlelwp == NULL)
 		return true;
 
 	sc->sc_wasonline = !(ci->ci_schedstate.spc_flags & SPCF_OFFLINE);
@@ -1104,7 +1109,7 @@ cpu_suspend(device_t dv, const pmf_qual_
 		err = cpu_setstate(ci, false);
 		mutex_exit(&cpu_lock);
 
-		if (err)
+		if (err != 0)
 			return false;
 	}
 
@@ -1118,20 +1123,28 @@ cpu_resume(device_t dv, const pmf_qual_t
 	struct cpu_info *ci = sc->sc_info;
 	int err = 0;
 
-	if (ci->ci_flags & CPUF_PRIMARY)
-		return true;
-	if (ci->ci_data.cpu_idlelwp == NULL)
-		return true;
 	if ((ci->ci_flags & CPUF_PRESENT) == 0)
 		return true;
 
+	if ((ci->ci_flags & CPUF_PRIMARY) != 0)
+		goto out;
+
+	if (ci->ci_data.cpu_idlelwp == NULL)
+		goto out;
+
 	if (sc->sc_wasonline) {
 		mutex_enter(&cpu_lock);
 		err = cpu_setstate(ci, true);
 		mutex_exit(&cpu_lock);
 	}
 
-	return err == 0;
+out:
+	if (err != 0)
+		return false;
+
+	cpufreq_resume(ci);
+
+	return true;
 }
 
 static bool

Index: src/sys/arch/xen/x86/cpu.c
diff -u src/sys/arch/xen/x86/cpu.c:1.65 src/sys/arch/xen/x86/cpu.c:1.66
--- src/sys/arch/xen/x86/cpu.c:1.65	Tue Sep 20 00:12:24 2011
+++ src/sys/arch/xen/x86/cpu.c	Wed Sep 28 15:38:22 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.65 2011/09/20 00:12:24 jym Exp $	*/
+/*	$NetBSD: cpu.c,v 1.66 2011/09/28 15:38:22 jruoho Exp $	*/
 /* NetBSD: cpu.c,v 1.18 2004/02/20 17:35:01 yamt Exp  */
 
 /*-
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.65 2011/09/20 00:12:24 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.66 2011/09/28 15:38:22 jruoho Exp $");
 
 #include "opt_ddb.h"
 #include "opt_multiprocessor.h"
@@ -83,6 +83,7 @@ __KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.65
 #include <sys/device.h>
 #include <sys/kmem.h>
 #include <sys/cpu.h>
+#include <sys/cpufreq.h>
 #include <sys/atomic.h>
 #include <sys/reboot.h>
 #include <sys/idle.h>
@@ -1142,11 +1143,15 @@ cpu_suspend(device_t dv, const pmf_qual_
 	struct cpu_info *ci = sc->sc_info;
 	int err;
 
-	if (ci->ci_flags & CPUF_PRIMARY)
+	if ((ci->ci_flags & CPUF_PRESENT) == 0)
 		return true;
-	if (ci->ci_data.cpu_idlelwp == NULL)
+
+	cpufreq_suspend(ci);
+
+	if ((ci->ci_flags & CPUF_PRIMARY) != 0)
 		return true;
-	if ((ci->ci_flags & CPUF_PRESENT) == 0)
+
+	if (ci->ci_data.cpu_idlelwp == NULL)
 		return true;
 
 	sc->sc_wasonline = !(ci->ci_schedstate.spc_flags & SPCF_OFFLINE);
@@ -1156,7 +1161,7 @@ cpu_suspend(device_t dv, const pmf_qual_
 		err = cpu_setstate(ci, false);
 		mutex_exit(&cpu_lock);
 
-		if (err)
+		if (err != 0)
 			return false;
 	}
 
@@ -1170,20 +1175,28 @@ cpu_resume(device_t dv, const pmf_qual_t
 	struct cpu_info *ci = sc->sc_info;
 	int err = 0;
 
-	if (ci->ci_flags & CPUF_PRIMARY)
-		return true;
-	if (ci->ci_data.cpu_idlelwp == NULL)
-		return true;
 	if ((ci->ci_flags & CPUF_PRESENT) == 0)
 		return true;
 
+	if ((ci->ci_flags & CPUF_PRIMARY) != 0)
+		goto out;
+
+	if (ci->ci_data.cpu_idlelwp == NULL)
+		goto out;
+
 	if (sc->sc_wasonline) {
 		mutex_enter(&cpu_lock);
 		err = cpu_setstate(ci, true);
 		mutex_exit(&cpu_lock);
 	}
 
-	return err == 0;
+out:
+	if (err != 0)
+		return false;
+
+	cpufreq_resume(ci);
+
+	return true;
 }
 #endif
 

Reply via email to