summaryrefslogtreecommitdiff
path: root/usr/src/uts/i86pc/os/memscrub.c
diff options
context:
space:
mode:
authorrandyf <none@none>2007-10-20 16:00:42 -0700
committerrandyf <none@none>2007-10-20 16:00:42 -0700
commit2df1fe9ca32bb227b9158c67f5c00b54c20b10fd (patch)
tree358c576f885c00d42a760d9e35e5b66e77209fe2 /usr/src/uts/i86pc/os/memscrub.c
parent10b3fbf593a6678eec9b50a01903ef4eb73111e4 (diff)
downloadillumos-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.c26
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 */
/*