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