diff options
| author | Dave Plauger <Dave.Plauger@Sun.COM> | 2009-10-22 20:06:52 -0400 |
|---|---|---|
| committer | Dave Plauger <Dave.Plauger@Sun.COM> | 2009-10-22 20:06:52 -0400 |
| commit | ca3e8d88e8c867355e441fbc914c52e7416fc537 (patch) | |
| tree | 27934a23f3f293cfac68ec2188db5bf26361c12e /usr/src/uts/common/vm | |
| parent | c9cc1492d5b27b76cf77300ab3aafd0857f38228 (diff) | |
| download | illumos-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.h | 4 | ||||
| -rw-r--r-- | usr/src/uts/common/vm/vm_page.c | 14 | ||||
| -rw-r--r-- | usr/src/uts/common/vm/vm_pagelist.c | 4 |
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 { |
