summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorJoe Bonasera <joe.bonasera@oracle.com>2010-06-21 13:32:50 -0700
committerJoe Bonasera <joe.bonasera@oracle.com>2010-06-21 13:32:50 -0700
commit2d44e9740097a75299dcb5544ebf4b18c77ce5a2 (patch)
tree959584ca6f61b7e672a7d08317febf6a511100bd /usr/src
parent7eb216a6c5a89431f61ad730be3b25f70e8624f0 (diff)
downloadillumos-gate-2d44e9740097a75299dcb5544ebf4b18c77ce5a2.tar.gz
6961709 x86 global zone panics hosting solaris10 containers with vm_page.c line: 3558
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/i86pc/vm/htable.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/usr/src/uts/i86pc/vm/htable.c b/usr/src/uts/i86pc/vm/htable.c
index 725fab693e..925a2b3533 100644
--- a/usr/src/uts/i86pc/vm/htable.c
+++ b/usr/src/uts/i86pc/vm/htable.c
@@ -1475,6 +1475,26 @@ htable_attach(
pp = boot_claim_page(pfn);
ASSERT(pp != NULL);
+
+ /*
+ * Page table pages that were allocated by dboot or
+ * in very early startup didn't go through boot_mapin()
+ * and so won't have vnode/offsets. Fix that here.
+ */
+ if (pp->p_vnode == NULL) {
+ /* match offset calculation in page_get_physical() */
+ u_offset_t offset = (uintptr_t)ht;
+ if (offset > kernelbase)
+ offset -= kernelbase;
+ offset <<= MMU_PAGESHIFT;
+#if defined(__amd64)
+ offset += mmu.hole_start; /* something in VA hole */
+#else
+ offset += 1ULL << 40; /* something > 4 Gig */
+#endif
+ ASSERT(page_exists(&kvp, offset) == NULL);
+ (void) page_hashin(pp, &kvp, offset, NULL);
+ }
page_downgrade(pp);
#if defined(__xpv) && defined(__amd64)
/*