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) {