Print this page
*** 19,29 ****
* CDDL HEADER END
*/
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
! * Copyright 2016 Joyent, Inc.
* Copyright (c) 2016 by Delphix. All rights reserved.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
--- 19,29 ----
* CDDL HEADER END
*/
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
! * Copyright 2015, Joyent, Inc. All rights reserved.
* Copyright (c) 2016 by Delphix. All rights reserved.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
*** 70,81 ****
#include <vm/seg_spt.h>
#include <vm/page.h>
clock_t deadlk_wait = 1; /* number of ticks to wait before retrying */
- ulong_t as_user_seg_limit = 0xffff; /* max segments in an (non-kas) AS */
-
static struct kmem_cache *as_cache;
static void as_setwatchprot(struct as *, caddr_t, size_t, uint_t);
static void as_clearwatchprot(struct as *, caddr_t, size_t);
int as_map_locked(struct as *, caddr_t, size_t, int ((*)()), void *);
--- 70,79 ----
*** 889,912 ****
if (as == &kas)
CPU_STATS_ADDQ(CPU, vm, kernel_asflt, 1);
CPU_STATS_EXIT_K();
if (zonep->zone_pg_flt_delay != 0) {
/*
! * The zone in which this process is running is
! * currently over it's physical memory cap. Throttle
! * page faults to help the user-land memory capper
! * catch up. Note that drv_usectohz() rounds up.
*/
atomic_add_64(&zonep->zone_pf_throttle, 1);
atomic_add_64(&zonep->zone_pf_throttle_usec,
zonep->zone_pg_flt_delay);
! if (zonep->zone_pg_flt_delay < TICK_TO_USEC(1)) {
drv_usecwait(zonep->zone_pg_flt_delay);
! } else {
delay(drv_usectohz(zonep->zone_pg_flt_delay));
}
- }
break;
}
/* Kernel probe */
TNF_PROBE_3(address_fault, "vm pagefault", /* CSTYLED */,
--- 887,910 ----
if (as == &kas)
CPU_STATS_ADDQ(CPU, vm, kernel_asflt, 1);
CPU_STATS_EXIT_K();
if (zonep->zone_pg_flt_delay != 0) {
/*
! * The zone in which this process is running
! * is currently over it's physical memory cap.
! * Throttle page faults to help the user-land
! * memory capper catch up. Note that
! * drv_usectohz() rounds up.
*/
atomic_add_64(&zonep->zone_pf_throttle, 1);
atomic_add_64(&zonep->zone_pf_throttle_usec,
zonep->zone_pg_flt_delay);
! if (zonep->zone_pg_flt_delay < TICK_TO_USEC(1))
drv_usecwait(zonep->zone_pg_flt_delay);
! else
delay(drv_usectohz(zonep->zone_pg_flt_delay));
}
break;
}
/* Kernel probe */
TNF_PROBE_3(address_fault, "vm pagefault", /* CSTYLED */,
*** 1709,1741 ****
}
as->a_updatedir = 1; /* inform /proc */
gethrestime(&as->a_updatetime);
! if (as != &kas) {
! if (as->a_size + rsize > (size_t)p->p_vmem_ctl) {
AS_LOCK_EXIT(as);
! (void) rctl_action(rctlproc_legacy[RLIMIT_VMEM],
! p->p_rctls, p, RCA_UNSAFE_ALL);
! return (ENOMEM);
! }
- /*
- * Keep the number of segments in a userspace AS constrained to
- * a reasonable limit. Linux enforces a value slightly less
- * than 64k in order to avoid ELF limits if/when a process
- * dumps core. While SunOS avoids that specific problem with
- * other tricks, the limit is still valuable to keep kernel
- * memory consumption in check.
- */
- if (avl_numnodes(&as->a_segtree) >= as_user_seg_limit) {
- AS_LOCK_EXIT(as);
- atomic_inc_32(&p->p_zone->zone_mfseglim);
return (ENOMEM);
}
- }
if (AS_MAP_CHECK_VNODE_LPOOB(crfp, argsp)) {
crargs = *(struct segvn_crargs *)argsp;
error = as_map_vnsegs(as, raddr, rsize, crfp, &crargs, &unmap);
if (error != 0) {
--- 1707,1724 ----
}
as->a_updatedir = 1; /* inform /proc */
gethrestime(&as->a_updatetime);
! if (as != &kas && as->a_size + rsize > (size_t)p->p_vmem_ctl) {
AS_LOCK_EXIT(as);
! (void) rctl_action(rctlproc_legacy[RLIMIT_VMEM], p->p_rctls, p,
! RCA_UNSAFE_ALL);
return (ENOMEM);
}
if (AS_MAP_CHECK_VNODE_LPOOB(crfp, argsp)) {
crargs = *(struct segvn_crargs *)argsp;
error = as_map_vnsegs(as, raddr, rsize, crfp, &crargs, &unmap);
if (error != 0) {