summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4v/os/memseg.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/sun4v/os/memseg.c')
-rw-r--r--usr/src/uts/sun4v/os/memseg.c134
1 files changed, 15 insertions, 119 deletions
diff --git a/usr/src/uts/sun4v/os/memseg.c b/usr/src/uts/sun4v/os/memseg.c
index d562905eec..359588150a 100644
--- a/usr/src/uts/sun4v/os/memseg.c
+++ b/usr/src/uts/sun4v/os/memseg.c
@@ -44,9 +44,6 @@ extern struct memseg *memseg_alloc();
extern page_t *ppvm_base;
extern pgcnt_t ppvm_size;
-static vnode_t pp_vn, rsv_vn;
-static pgcnt_t rsv_metapgs;
-static int meta_rsv_enable;
static int sun4v_memseg_debug;
extern struct memseg *memseg_reuse(pgcnt_t);
@@ -77,12 +74,11 @@ extern void remap_to_dummy(caddr_t, pgcnt_t);
int
memseg_alloc_meta(pfn_t base, pgcnt_t npgs, void **ptp, pgcnt_t *metap)
{
- page_t *pp, *opp, *epp, *pgpp;
+ page_t *pp, *opp, *epp;
pgcnt_t metapgs;
- int i, rsv;
+ int i;
struct seg kseg;
caddr_t vaddr;
- u_offset_t off;
/*
* Verify incoming memory is within supported DR range.
@@ -95,7 +91,7 @@ memseg_alloc_meta(pfn_t base, pgcnt_t npgs, void **ptp, pgcnt_t *metap)
metapgs = btopr(npgs * sizeof (page_t));
if (!IS_P2ALIGNED((uint64_t)pp, PAGESIZE) &&
- page_find(&pp_vn, (u_offset_t)pp)) {
+ page_find(&mpvp, (u_offset_t)pp)) {
/*
* Another memseg has page_t's in the same
* page which 'pp' resides. This would happen
@@ -120,7 +116,7 @@ memseg_alloc_meta(pfn_t base, pgcnt_t npgs, void **ptp, pgcnt_t *metap)
}
if (!IS_P2ALIGNED((uint64_t)epp, PAGESIZE) &&
- page_find(&pp_vn, (u_offset_t)epp)) {
+ page_find(&mpvp, (u_offset_t)epp)) {
/*
* Another memseg has page_t's in the same
* page which 'epp' resides. This would happen
@@ -144,59 +140,20 @@ memseg_alloc_meta(pfn_t base, pgcnt_t npgs, void **ptp, pgcnt_t *metap)
vaddr = (caddr_t)pp;
for (i = 0; i < metapgs; i++)
- if (page_find(&pp_vn, (u_offset_t)(vaddr + i * PAGESIZE)))
+ if (page_find(&mpvp, (u_offset_t)(vaddr + i * PAGESIZE)))
panic("page_find(0x%p, %p)\n",
- (void *)&pp_vn, (void *)(vaddr + i * PAGESIZE));
+ (void *)&mpvp, (void *)(vaddr + i * PAGESIZE));
/*
* Allocate the metadata pages; these are the pages that will
* contain the page_t's for the incoming memory.
- *
- * If a normal allocation fails, use the reserved metapgs for
- * a small allocation; otherwise retry with PG_WAIT.
*/
- rsv = off = 0;
- if (metapgs <= rsv_metapgs) {
- MEMSEG_DEBUG("memseg_get: use rsv 0x%lx metapgs", metapgs);
- ASSERT(meta_rsv_enable);
- rsv = 1;
- } else if ((pgpp = page_create_va(&pp_vn, (u_offset_t)pp, ptob(metapgs),
+ if ((page_create_va(&mpvp, (u_offset_t)pp, ptob(metapgs),
PG_NORELOC | PG_EXCL, &kseg, vaddr)) == NULL) {
- cmn_err(CE_WARN, "memseg_get: can't get 0x%ld metapgs",
+ MEMSEG_DEBUG("memseg_alloc_meta: can't get 0x%ld metapgs",
metapgs);
return (KPHYSM_ERESOURCE);
}
- if (rsv) {
- /*
- * The reseve pages must be hashed out of the reserve vnode
- * and rehashed by <pp_vn,vaddr>. The resreved pages also
- * must be replenished immedidately at the end of the add
- * processing.
- */
- for (i = 0; i < metapgs; i++) {
- pgpp = page_find(&rsv_vn, off);
- ASSERT(pgpp);
- page_hashout(pgpp, 0);
- hat_devload(kas.a_hat, vaddr, PAGESIZE,
- page_pptonum(pgpp), PROT_READ | PROT_WRITE,
- HAT_LOAD | HAT_LOAD_REMAP | HAT_LOAD_NOCONSIST);
- ASSERT(!page_find(&pp_vn, (u_offset_t)vaddr));
- if (!page_hashin(pgpp, &pp_vn, (u_offset_t)vaddr, 0))
- panic("memseg_get: page_hashin(0x%p, 0x%p)",
- (void *)pgpp, (void *)vaddr);
- off += PAGESIZE;
- vaddr += PAGESIZE;
- rsv_metapgs--;
- }
- } else {
- for (i = 0; i < metapgs; i++) {
- hat_devload(kas.a_hat, vaddr, PAGESIZE,
- page_pptonum(pgpp), PROT_READ | PROT_WRITE,
- HAT_LOAD | HAT_LOAD_REMAP | HAT_LOAD_NOCONSIST);
- pgpp = pgpp->p_next;
- vaddr += PAGESIZE;
- }
- }
ASSERT(ptp);
ASSERT(metap);
@@ -228,7 +185,7 @@ memseg_free_meta(void *ptp, pgcnt_t metapgs)
* Free pages allocated during add.
*/
for (i = 0; i < metapgs; i++) {
- pp = page_find(&pp_vn, off);
+ pp = page_find(&mpvp, off);
ASSERT(pp);
ASSERT(pp->p_szc == 0);
page_io_unlock(pp);
@@ -248,7 +205,7 @@ memseg_get_metapfn(void *ptp, pgcnt_t metapg)
ASSERT(off);
ASSERT(IS_P2ALIGNED((uint64_t)off, PAGESIZE));
- pp = page_find(&pp_vn, off);
+ pp = page_find(&mpvp, off);
ASSERT(pp);
ASSERT(pp->p_szc == 0);
ASSERT(pp->p_pagenum != PFN_INVALID);
@@ -285,7 +242,7 @@ memseg_remap_meta(struct memseg *seg)
*/
if (!IS_P2ALIGNED((uint64_t)pp, PAGESIZE) &&
- page_find(&pp_vn, (u_offset_t)(pp - 1)) && !page_deleted(pp - 1)) {
+ page_find(&mpvp, (u_offset_t)(pp - 1)) && !page_deleted(pp - 1)) {
/*
* Another memseg has page_t's in the same
* page which 'pp' resides. This would happen
@@ -312,7 +269,7 @@ memseg_remap_meta(struct memseg *seg)
}
if (!IS_P2ALIGNED((uint64_t)epp, PAGESIZE) &&
- page_find(&pp_vn, (u_offset_t)epp) && !page_deleted(epp)) {
+ page_find(&mpvp, (u_offset_t)epp) && !page_deleted(epp)) {
/*
* Another memseg has page_t's in the same
* page which 'epp' resides. This would happen
@@ -333,13 +290,13 @@ memseg_remap_meta(struct memseg *seg)
off = (u_offset_t)pp;
- MEMSEG_DEBUG("memseg_remap: off=0x%lx metapgs=0x%lx\n", (uint64_t)off,
- metapgs);
+ MEMSEG_DEBUG("memseg_remap_meta: off=0x%lx metapgs=0x%lx\n",
+ (uint64_t)off, metapgs);
/*
* Free pages allocated during add.
*/
for (i = 0; i < metapgs; i++) {
- pp = page_find(&pp_vn, off);
+ pp = page_find(&mpvp, off);
ASSERT(pp);
ASSERT(pp->p_szc == 0);
page_io_unlock(pp);
@@ -347,64 +304,3 @@ memseg_remap_meta(struct memseg *seg)
off += PAGESIZE;
}
}
-
-static void
-rsv_alloc()
-{
- int i;
- page_t *pp;
- pgcnt_t metapgs;
- u_offset_t off;
- struct seg kseg;
-
- kseg.s_as = &kas;
-
- /*
- * Reserve enough page_t pages for an add request of
- * RSV_SIZE bytes.
- */
- metapgs = btopr(btop(RSV_SIZE) * sizeof (page_t)) - rsv_metapgs;
-
- for (i = off = 0; i < metapgs; i++, off += PAGESIZE) {
- (void) page_create_va(&rsv_vn, off, PAGESIZE,
- PG_NORELOC | PG_WAIT, &kseg, 0);
- pp = page_find(&rsv_vn, off);
- ASSERT(pp);
- ASSERT(PAGE_EXCL(pp));
- page_iolock_init(pp);
- rsv_metapgs++;
- }
-}
-
-void
-i_dr_mem_init(size_t *hint)
-{
- if (meta_rsv_enable) {
- rsv_alloc();
- if (hint)
- *hint = RSV_SIZE;
- }
-}
-
-void
-i_dr_mem_fini()
-{
- int i;
- page_t *pp;
- u_offset_t off;
-
- for (i = off = 0; i < rsv_metapgs; i++, off += PAGESIZE) {
- if (pp = page_find(&rsv_vn, off)) {
- ASSERT(PAGE_EXCL(pp));
- page_destroy(pp, 0);
- }
- ASSERT(!page_find(&rsv_vn, off));
- }
- rsv_metapgs = 0;
-}
-
-void
-i_dr_mem_update()
-{
- rsv_alloc();
-}