diff options
author | Joe Bonasera <joe.bonasera@oracle.com> | 2010-06-21 13:32:50 -0700 |
---|---|---|
committer | Joe Bonasera <joe.bonasera@oracle.com> | 2010-06-21 13:32:50 -0700 |
commit | 2d44e9740097a75299dcb5544ebf4b18c77ce5a2 (patch) | |
tree | 959584ca6f61b7e672a7d08317febf6a511100bd /usr/src | |
parent | 7eb216a6c5a89431f61ad730be3b25f70e8624f0 (diff) | |
download | illumos-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.c | 20 |
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) /* |