summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr/src/uts/common/os/fork.c1
-rw-r--r--usr/src/uts/common/vm/seg_vn.c40
-rw-r--r--usr/src/uts/common/vm/vm_as.c2
3 files changed, 29 insertions, 14 deletions
diff --git a/usr/src/uts/common/os/fork.c b/usr/src/uts/common/os/fork.c
index 74d791ac47..05344477bd 100644
--- a/usr/src/uts/common/os/fork.c
+++ b/usr/src/uts/common/os/fork.c
@@ -308,7 +308,6 @@ cfork(int isvfork, int isfork1, int flags)
error = (error == ENOMEM) ? ENOMEM : EAGAIN;
goto forkerr;
}
- cp->p_as->a_proc = cp;
/* Duplicate parent's shared memory */
if (p->p_segacct)
diff --git a/usr/src/uts/common/vm/seg_vn.c b/usr/src/uts/common/vm/seg_vn.c
index f8ca679fcf..fba2fbc5fe 100644
--- a/usr/src/uts/common/vm/seg_vn.c
+++ b/usr/src/uts/common/vm/seg_vn.c
@@ -595,7 +595,8 @@ segvn_create(struct seg *seg, void *argsp)
*/
if (!(a->flags & MAP_NORESERVE) && ((a->vp == NULL && a->amp == NULL) ||
(a->type == MAP_PRIVATE && (a->prot & PROT_WRITE)))) {
- if (anon_resv(seg->s_size) == 0)
+ if (anon_resv_zone(seg->s_size,
+ seg->s_as->a_proc->p_zone) == 0)
return (EAGAIN);
swresv = seg->s_size;
TRACE_3(TR_FAC_VM, TR_ANON_PROC, "anon proc:%p %lu %u",
@@ -626,7 +627,8 @@ segvn_create(struct seg *seg, void *argsp)
a->maxprot, a->type, cred, NULL);
if (error) {
if (swresv != 0) {
- anon_unresv(swresv);
+ anon_unresv_zone(swresv,
+ seg->s_as->a_proc->p_zone);
TRACE_3(TR_FAC_VM, TR_ANON_PROC,
"anon proc:%p %lu %u", seg, swresv, 0);
}
@@ -1469,6 +1471,7 @@ segvn_dup(struct seg *seg, struct seg *newseg)
struct anon_map *amp;
ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock));
+ ASSERT(newseg->s_as->a_proc->p_parent == curproc);
/*
* If segment has anon reserved, reserve more for the new seg.
@@ -2005,7 +2008,8 @@ retry:
* case it's MAP_SHARED
*/
if (svd->type == MAP_SHARED) {
- anon_unresv(len);
+ anon_unresv_zone(len,
+ seg->s_as->a_proc->p_zone);
amp->swresv -= len;
}
}
@@ -2025,7 +2029,8 @@ retry:
svd->swresv = ptob(anon_pages(amp->ahp,
svd->anon_index, npages));
- anon_unresv(oswresv - svd->swresv);
+ anon_unresv_zone(oswresv - svd->swresv,
+ seg->s_as->a_proc->p_zone);
} else {
size_t unlen;
@@ -2040,7 +2045,8 @@ retry:
ASSERT(svd->swresv == seg->s_size);
unlen = len;
}
- anon_unresv(unlen);
+ anon_unresv_zone(unlen,
+ seg->s_as->a_proc->p_zone);
}
TRACE_3(TR_FAC_VM, TR_ANON_PROC, "anon proc:%p %lu %u",
seg, len, 0);
@@ -2108,7 +2114,8 @@ retry:
* case it's MAP_SHARED
*/
if (svd->type == MAP_SHARED) {
- anon_unresv(len);
+ anon_unresv_zone(len,
+ seg->s_as->a_proc->p_zone);
amp->swresv -= len;
}
}
@@ -2123,7 +2130,8 @@ retry:
oswresv = svd->swresv;
svd->swresv = ptob(anon_pages(amp->ahp,
svd->anon_index, npages));
- anon_unresv(oswresv - svd->swresv);
+ anon_unresv_zone(oswresv - svd->swresv,
+ seg->s_as->a_proc->p_zone);
} else {
size_t unlen;
@@ -2138,7 +2146,8 @@ retry:
ASSERT(svd->swresv == seg->s_size);
unlen = len;
}
- anon_unresv(unlen);
+ anon_unresv_zone(unlen,
+ seg->s_as->a_proc->p_zone);
}
TRACE_3(TR_FAC_VM, TR_ANON_PROC,
"anon proc:%p %lu %u", seg, len, 0);
@@ -2253,7 +2262,8 @@ retry:
* case it's MAP_SHARED
*/
if (svd->type == MAP_SHARED) {
- anon_unresv(len);
+ anon_unresv_zone(len,
+ seg->s_as->a_proc->p_zone);
amp->swresv -= len;
}
}
@@ -2292,7 +2302,8 @@ retry:
nsvd->swresv = ptob(anon_pages(nsvd->amp->ahp,
nsvd->anon_index, btop(nseg->s_size)));
ASSERT(oswresv >= (svd->swresv + nsvd->swresv));
- anon_unresv(oswresv - (svd->swresv + nsvd->swresv));
+ anon_unresv_zone(oswresv - (svd->swresv + nsvd->swresv),
+ seg->s_as->a_proc->p_zone);
} else {
size_t unlen;
@@ -2313,7 +2324,8 @@ retry:
nsvd->swresv = nseg->s_size;
unlen = len;
}
- anon_unresv(unlen);
+ anon_unresv_zone(unlen,
+ seg->s_as->a_proc->p_zone);
}
TRACE_3(TR_FAC_VM, TR_ANON_PROC, "anon proc:%p %lu %u",
seg, len, 0);
@@ -2397,7 +2409,8 @@ segvn_free(struct seg *seg)
anon_free(amp->ahp, 0, amp->size);
}
if ((len = amp->swresv) != 0) {
- anon_unresv(len);
+ anon_unresv_zone(len,
+ seg->s_as->a_proc->p_zone);
TRACE_3(TR_FAC_VM, TR_ANON_PROC,
"anon proc:%p %lu %u", seg, len, 0);
}
@@ -2428,7 +2441,8 @@ segvn_free(struct seg *seg)
* Release swap reservation.
*/
if ((len = svd->swresv) != 0) {
- anon_unresv(svd->swresv);
+ anon_unresv_zone(svd->swresv,
+ seg->s_as->a_proc->p_zone);
TRACE_3(TR_FAC_VM, TR_ANON_PROC, "anon proc:%p %lu %u",
seg, len, 0);
svd->swresv = 0;
diff --git a/usr/src/uts/common/vm/vm_as.c b/usr/src/uts/common/vm/vm_as.c
index d120f6b84f..567cc3c16b 100644
--- a/usr/src/uts/common/vm/vm_as.c
+++ b/usr/src/uts/common/vm/vm_as.c
@@ -789,6 +789,8 @@ as_dup(struct as *as, struct as **outas)
as_clearwatch(as);
newas = as_alloc();
newas->a_userlimit = as->a_userlimit;
+ newas->a_proc = as->a_proc->p_child;
+
AS_LOCK_ENTER(newas, &newas->a_lock, RW_WRITER);
/* This will prevent new XHATs from attaching */