Print this page
OS-803 make phys mem cap a bit harder
OS-1043 minimize vm_getusage impact

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/vm/vm_as.c
          +++ new/usr/src/uts/common/vm/vm_as.c
↓ open down ↓ 50 lines elided ↑ open up ↑
  51   51  #include <sys/sysmacros.h>
  52   52  #include <sys/cpuvar.h>
  53   53  #include <sys/sysinfo.h>
  54   54  #include <sys/kmem.h>
  55   55  #include <sys/vnode.h>
  56   56  #include <sys/vmsystm.h>
  57   57  #include <sys/cmn_err.h>
  58   58  #include <sys/debug.h>
  59   59  #include <sys/tnf_probe.h>
  60   60  #include <sys/vtrace.h>
       61 +#include <sys/ddi.h>
  61   62  
  62   63  #include <vm/hat.h>
  63   64  #include <vm/as.h>
  64   65  #include <vm/seg.h>
  65   66  #include <vm/seg_vn.h>
  66   67  #include <vm/seg_dev.h>
  67   68  #include <vm/seg_kmem.h>
  68   69  #include <vm/seg_map.h>
  69   70  #include <vm/seg_spt.h>
  70   71  #include <vm/page.h>
↓ open down ↓ 772 lines elided ↑ open up ↑
 843  844  {
 844  845          struct seg *seg;
 845  846          caddr_t raddr;                  /* rounded down addr */
 846  847          size_t rsize;                   /* rounded up size */
 847  848          size_t ssize;
 848  849          faultcode_t res = 0;
 849  850          caddr_t addrsav;
 850  851          struct seg *segsav;
 851  852          int as_lock_held;
 852  853          klwp_t *lwp = ttolwp(curthread);
      854 +        zone_t *zonep = curzone;
 853  855  
 854      -
 855      -
 856  856  retry:
 857  857          /*
 858  858           * Indicate that the lwp is not to be stopped while waiting for a
 859  859           * pagefault.  This is to avoid deadlock while debugging a process
 860  860           * via /proc over NFS (in particular).
 861  861           */
 862  862          if (lwp != NULL)
 863  863                  lwp->lwp_nostop++;
 864  864  
 865  865          /*
↓ open down ↓ 14 lines elided ↑ open up ↑
 880  880          case F_PROT:
 881  881                  CPU_STATS_ADD_K(vm, prot_fault, 1);
 882  882                  break;
 883  883  
 884  884          case F_INVAL:
 885  885                  CPU_STATS_ENTER_K();
 886  886                  CPU_STATS_ADDQ(CPU, vm, as_fault, 1);
 887  887                  if (as == &kas)
 888  888                          CPU_STATS_ADDQ(CPU, vm, kernel_asflt, 1);
 889  889                  CPU_STATS_EXIT_K();
      890 +                if (zonep->zone_pg_flt_delay != 0) {
      891 +                        /*
      892 +                         * The zone in which this process is running
      893 +                         * is currently over it's physical memory cap.
      894 +                         * Throttle page faults to help the user-land
      895 +                         * memory capper catch up. Note that
      896 +                         * drv_usectohz() rounds up.
      897 +                         */
      898 +                        atomic_add_64(&zonep->zone_pf_throttle, 1);
      899 +                        atomic_add_64(&zonep->zone_pf_throttle_usec,
      900 +                            zonep->zone_pg_flt_delay);
      901 +                        if (zonep->zone_pg_flt_delay < TICK_TO_USEC(1))
      902 +                                drv_usecwait(zonep->zone_pg_flt_delay);
      903 +                        else
      904 +                                delay(drv_usectohz(zonep->zone_pg_flt_delay));
      905 +                }
 890  906                  break;
 891  907          }
 892  908  
 893  909          /* Kernel probe */
 894  910          TNF_PROBE_3(address_fault, "vm pagefault", /* CSTYLED */,
 895  911              tnf_opaque, address,        addr,
 896  912              tnf_fault_type,     fault_type,     type,
 897  913              tnf_seg_access,     access,         rw);
 898  914  
 899  915          raddr = (caddr_t)((uintptr_t)addr & (uintptr_t)PAGEMASK);
↓ open down ↓ 2699 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX