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