diff options
author | randyf <none@none> | 2007-10-20 16:00:42 -0700 |
---|---|---|
committer | randyf <none@none> | 2007-10-20 16:00:42 -0700 |
commit | 2df1fe9ca32bb227b9158c67f5c00b54c20b10fd (patch) | |
tree | 358c576f885c00d42a760d9e35e5b66e77209fe2 /usr/src/uts/i86pc/os/memscrub.c | |
parent | 10b3fbf593a6678eec9b50a01903ef4eb73111e4 (diff) | |
download | illumos-gate-2df1fe9ca32bb227b9158c67f5c00b54c20b10fd.tar.gz |
PSARC/2005/469 X86 Energy Star compliance
PSARC/2006/632 PSMI extension for state save and restore
6330209 nge needs to support DDI_SUSPEND/DDI_RESUME
6381827 Suspend to RAM on x86
6393154 audio810 needs to support DDI_SUSPEND/DDI_RESUME
6397047 fd, fdc needs to support Suspend/Resume
6401974 cannot enter S3 with ohci PME enable set on Tyan 2865 with Sun or Tyan 2.01 BIOS
6422613 memscrubber doesn't re-acquire lock before CALLB_CPR_EXIT
6455736 ata/dadk/cmdk should support DDI_SUSPEND/DDI_RESUME
6511370 CPR on SPARC regression
6586018 TODOP Macros in i86pc/sys/machclock.h not in sun4u/sun4v equivilent (Sparc only)
6610124 It takes more than 3 minutes after printing "pci_pre_resume nv_sata:0"
6617143 powerd/pmconfig emits a different default message for an existing on or off action.
--HG--
rename : usr/src/cmd/power/power.conf => usr/src/cmd/power/power.conf.sparc
Diffstat (limited to 'usr/src/uts/i86pc/os/memscrub.c')
-rw-r--r-- | usr/src/uts/i86pc/os/memscrub.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/usr/src/uts/i86pc/os/memscrub.c b/usr/src/uts/i86pc/os/memscrub.c index 322573ff91..b38cd4ecfb 100644 --- a/usr/src/uts/i86pc/os/memscrub.c +++ b/usr/src/uts/i86pc/os/memscrub.c @@ -98,6 +98,7 @@ #include <vm/seg_kmem.h> #include <vm/seg_kpm.h> #include <vm/hat_i86.h> +#include <sys/callb.h> /* CPR callback */ static caddr_t memscrub_window; static hat_mempte_t memscrub_pte; @@ -252,7 +253,7 @@ compute_interval_sec() return (memscrub_period_sec); else return (memscrub_period_sec/ - (memscrub_phys_pages/memscrub_span_pages)); + (memscrub_phys_pages/memscrub_span_pages)); } void @@ -266,6 +267,12 @@ memscrubber() struct memlist *mlp; extern void scan_memory(caddr_t, size_t); + callb_cpr_t cprinfo; + + /* + * notify CPR of our existence + */ + CALLB_CPR_INIT(&cprinfo, &memscrub_lock, callb_generic_cpr, "memscrub"); if (memscrub_memlist == NULL) { cmn_err(CE_WARN, "memscrub_memlist not initialized."); @@ -314,6 +321,12 @@ memscrubber() } /* + * it is safe from our standpoint for CPR to + * suspend the system + */ + CALLB_CPR_SAFE_BEGIN(&cprinfo); + + /* * hit the snooze bar */ (void) timeout(memscrub_wakeup, NULL, interval_sec * hz); @@ -323,6 +336,9 @@ memscrubber() */ cv_wait(&memscrub_cv, &memscrub_lock); + /* we need to goto work */ + CALLB_CPR_SAFE_END(&cprinfo, &memscrub_lock); + mutex_exit(&memscrub_lock); do { @@ -393,6 +409,12 @@ memscrub_exit: if (!disable_memscrub_quietly) cmn_err(CE_NOTE, "memory scrubber exiting."); + /* + * We are about to bail, but don't have the memscrub_lock, + * and it is needed for CALLB_CPR_EXIT. + */ + mutex_enter(&memscrub_lock); + CALLB_CPR_EXIT(&cprinfo); cv_destroy(&memscrub_cv); @@ -448,7 +470,7 @@ memscrub_add_span(uint64_t start, uint64_t bytes) memscrub_printmemlist("memscrub_memlist before", memscrub_memlist); cmn_err(CE_CONT, "memscrub_phys_pages: 0x%x\n", memscrub_phys_pages); cmn_err(CE_CONT, "memscrub_add_span: address: 0x%llx" - " size: 0x%llx\n", start, bytes); + " size: 0x%llx\n", start, bytes); #endif /* MEMSCRUB_DEBUG */ /* |