summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/vm
diff options
context:
space:
mode:
authorDave Plauger <Dave.Plauger@Sun.COM>2009-10-22 20:06:52 -0400
committerDave Plauger <Dave.Plauger@Sun.COM>2009-10-22 20:06:52 -0400
commitca3e8d88e8c867355e441fbc914c52e7416fc537 (patch)
tree27934a23f3f293cfac68ec2188db5bf26361c12e /usr/src/uts/common/vm
parentc9cc1492d5b27b76cf77300ab3aafd0857f38228 (diff)
downloadillumos-joyent-ca3e8d88e8c867355e441fbc914c52e7416fc537.tar.gz
6828976 Fast Crash Dump
6878030 live crash dump is much slower than reboot dump 6626023 Crash dump size is excessive on large memory machines
Diffstat (limited to 'usr/src/uts/common/vm')
-rw-r--r--usr/src/uts/common/vm/hat.h4
-rw-r--r--usr/src/uts/common/vm/vm_page.c14
-rw-r--r--usr/src/uts/common/vm/vm_pagelist.c4
3 files changed, 20 insertions, 2 deletions
diff --git a/usr/src/uts/common/vm/hat.h b/usr/src/uts/common/vm/hat.h
index b966acf7fc..bed40f63d9 100644
--- a/usr/src/uts/common/vm/hat.h
+++ b/usr/src/uts/common/vm/hat.h
@@ -200,6 +200,9 @@ void hat_thread_exit(kthread_t *);
* given to the specified virtual protection. If vprot is ~PROT_WRITE,
* then remove write permission, leaving the other permissions
* unchanged. If vprot is ~PROT_USER, remove user permissions.
+ *
+ * void hat_flush_range(hat, addr, size)
+ * Invalidate a virtual address translation for the local CPU.
*/
void hat_memload(struct hat *, caddr_t, struct page *, uint_t, uint_t);
@@ -218,6 +221,7 @@ void hat_unlock_region(struct hat *, caddr_t, size_t, hat_region_cookie_t);
void hat_unload(struct hat *, caddr_t, size_t, uint_t);
void hat_unload_callback(struct hat *, caddr_t, size_t, uint_t,
hat_callback_t *);
+void hat_flush_range(struct hat *, caddr_t, size_t);
void hat_sync(struct hat *, caddr_t, size_t, uint_t);
void hat_map(struct hat *, caddr_t, size_t, uint_t);
void hat_setattr(struct hat *, caddr_t, size_t, uint_t);
diff --git a/usr/src/uts/common/vm/vm_page.c b/usr/src/uts/common/vm/vm_page.c
index a6af733be8..43f153f19f 100644
--- a/usr/src/uts/common/vm/vm_page.c
+++ b/usr/src/uts/common/vm/vm_page.c
@@ -4267,6 +4267,8 @@ retry:
return (pp);
}
+#define SYNC_PROGRESS_NPAGES 1000
+
/*
* Returns a count of dirty pages that are in the process
* of being written out. If 'cleanit' is set, try to push the page.
@@ -4277,12 +4279,22 @@ page_busy(int cleanit)
page_t *page0 = page_first();
page_t *pp = page0;
pgcnt_t nppbusy = 0;
+ int counter = 0;
u_offset_t off;
do {
vnode_t *vp = pp->p_vnode;
/*
+ * Reset the sync timeout. The page list is very long
+ * on large memory systems.
+ */
+ if (++counter > SYNC_PROGRESS_NPAGES) {
+ counter = 0;
+ vfs_syncprogress();
+ }
+
+ /*
* A page is a candidate for syncing if it is:
*
* (a) On neither the freelist nor the cachelist
@@ -4299,7 +4311,6 @@ page_busy(int cleanit)
hat_ismod(pp) && !IS_SWAPVP(vp) && vp->v_vfsp != NULL &&
vfs_can_sync(vp->v_vfsp)) {
nppbusy++;
- vfs_syncprogress();
if (!cleanit)
continue;
@@ -4322,6 +4333,7 @@ page_busy(int cleanit)
}
} while ((pp = page_next(pp)) != page0);
+ vfs_syncprogress();
return (nppbusy);
}
diff --git a/usr/src/uts/common/vm/vm_pagelist.c b/usr/src/uts/common/vm/vm_pagelist.c
index d31ca1bda9..59b4e079c5 100644
--- a/usr/src/uts/common/vm/vm_pagelist.c
+++ b/usr/src/uts/common/vm/vm_pagelist.c
@@ -59,6 +59,7 @@
#include <sys/callb.h>
#include <sys/mem_cage.h>
#include <sys/sdt.h>
+#include <sys/dumphdr.h>
extern uint_t vac_colors;
@@ -2951,7 +2952,8 @@ try_again:
* page of each large page.
*/
first_pp = pp;
- while (!page_trylock_cons(pp, SE_EXCL)) {
+ while (!page_trylock_cons(pp, SE_EXCL) ||
+ IS_DUMP_PAGE(pp)) {
if (szc == 0) {
pp = pp->p_next;
} else {