summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/vm/page_retire.c
diff options
context:
space:
mode:
authorChristopher Baumbauer - Sun Microsystems - San Diego United States <Christopher.Baumbauer@Sun.COM>2009-05-05 15:10:16 -0700
committerChristopher Baumbauer - Sun Microsystems - San Diego United States <Christopher.Baumbauer@Sun.COM>2009-05-05 15:10:16 -0700
commit704b9682c0691c177d1e86c94fabeaf97cc79d55 (patch)
treeeea16a9481629dff5a82254bd22d5d49011de730 /usr/src/uts/common/vm/page_retire.c
parent34a79eb7e68ed2b7c23a4dcc4851b4f437bf59b6 (diff)
downloadillumos-joyent-704b9682c0691c177d1e86c94fabeaf97cc79d55.tar.gz
6587140 page_retire()/page_trycapture should not try to retire non relocatable kernel pages
PSARC 2009/181 Page Retirement Kernel KStat Addition 6819876 pages slated for capture under x86 are being ignored
Diffstat (limited to 'usr/src/uts/common/vm/page_retire.c')
-rw-r--r--usr/src/uts/common/vm/page_retire.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/usr/src/uts/common/vm/page_retire.c b/usr/src/uts/common/vm/page_retire.c
index 0dbcd41245..fa454101f8 100644
--- a/usr/src/uts/common/vm/page_retire.c
+++ b/usr/src/uts/common/vm/page_retire.c
@@ -178,6 +178,7 @@ struct page_retire_kstat {
kstat_named_t pr_enqueue_fail;
kstat_named_t pr_dequeue_fail;
kstat_named_t pr_pending;
+ kstat_named_t pr_pending_kas;
kstat_named_t pr_failed;
kstat_named_t pr_failed_kernel;
kstat_named_t pr_limit;
@@ -198,6 +199,7 @@ static struct page_retire_kstat page_retire_kstat = {
{ "pages_notenqueued", KSTAT_DATA_UINT64},
{ "pages_notdequeued", KSTAT_DATA_UINT64},
{ "pages_pending", KSTAT_DATA_UINT64},
+ { "pages_pending_kas", KSTAT_DATA_UINT64},
{ "pages_deferred", KSTAT_DATA_UINT64},
{ "pages_deferred_kernel", KSTAT_DATA_UINT64},
{ "pages_limit", KSTAT_DATA_UINT64},
@@ -222,6 +224,7 @@ static kstat_t *page_retire_ksp = NULL;
#define PR_KSTAT_RETIRED_FMA (page_retire_kstat.pr_fma.value.ui64)
#define PR_KSTAT_RETIRED_NOTUE (PR_KSTAT_RETIRED_CE + PR_KSTAT_RETIRED_FMA)
#define PR_KSTAT_PENDING (page_retire_kstat.pr_pending.value.ui64)
+#define PR_KSTAT_PENDING_KAS (page_retire_kstat.pr_pending_kas.value.ui64)
#define PR_KSTAT_EQFAIL (page_retire_kstat.pr_enqueue_fail.value.ui64)
#define PR_KSTAT_DQFAIL (page_retire_kstat.pr_dequeue_fail.value.ui64)
@@ -834,16 +837,30 @@ page_retire_pend_count(void)
return (PR_KSTAT_PENDING);
}
+uint64_t
+page_retire_pend_kas_count(void)
+{
+ return (PR_KSTAT_PENDING_KAS);
+}
+
void
-page_retire_incr_pend_count(void)
+page_retire_incr_pend_count(void *datap)
{
PR_INCR_KSTAT(pr_pending);
+
+ if ((datap == &kvp) || (datap == &zvp)) {
+ PR_INCR_KSTAT(pr_pending_kas);
+ }
}
void
-page_retire_decr_pend_count(void)
+page_retire_decr_pend_count(void *datap)
{
PR_DECR_KSTAT(pr_pending);
+
+ if ((datap == &kvp) || (datap == &zvp)) {
+ PR_DECR_KSTAT(pr_pending_kas);
+ }
}
/*
@@ -1042,7 +1059,7 @@ page_retire(uint64_t pa, uchar_t reason)
if (MTBF(pr_calls, pr_mtbf)) {
page_settoxic(pp, reason);
- if (page_trycapture(pp, 0, CAPTURE_RETIRE, NULL) == 0) {
+ if (page_trycapture(pp, 0, CAPTURE_RETIRE, pp->p_vnode) == 0) {
PR_DEBUG(prd_prlocked);
} else {
PR_DEBUG(prd_prnotlocked);