Print this page
    
OS-399 zone phys. mem. cap should be a rctl and have associated kstat
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/uts/common/syscall/sysconfig.c
          +++ new/usr/src/uts/common/syscall/sysconfig.c
   1    1  /*
   2    2   * CDDL HEADER START
   3    3   *
   4    4   * The contents of this file are subject to the terms of the
   5    5   * Common Development and Distribution License (the "License").
   6    6   * You may not use this file except in compliance with the License.
   7    7   *
   8    8   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9    9   * or http://www.opensolaris.org/os/licensing.
  10   10   * See the License for the specific language governing permissions
  11   11   * and limitations under the License.
  12   12   *
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  
    | 
      ↓ open down ↓ | 
    14 lines elided | 
    
      ↑ open up ↑ | 
  
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
       25 + * Copyright 2011 Joyent, Inc.  All rights reserved.
  25   26   */
  26   27  
  27   28  /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
  28   29  /*        All Rights Reserved   */
  29   30  
  30   31  #include <sys/param.h>
  31   32  #include <sys/types.h>
  32   33  #include <sys/sysmacros.h>
  33   34  #include <sys/systm.h>
  34   35  #include <sys/tuneable.h>
  35   36  #include <sys/errno.h>
  36   37  #include <sys/var.h>
  37   38  #include <sys/signal.h>
  38   39  #include <sys/time.h>
  39   40  #include <sys/sysconfig.h>
  40   41  #include <sys/resource.h>
  41   42  #include <sys/ulimit.h>
  42   43  #include <sys/unistd.h>
  43   44  #include <sys/debug.h>
  44   45  #include <sys/cpuvar.h>
  45   46  #include <sys/mman.h>
  46   47  #include <sys/timer.h>
  47   48  #include <sys/zone.h>
  48   49  #include <sys/vm_usage.h>
  49   50  
  50   51  extern rctl_hndl_t rc_process_sigqueue;
  51   52  
  52   53  long
  53   54  sysconfig(int which)
  54   55  {
  55   56          switch (which) {
  56   57  
  57   58          /*
  58   59           * if it is not handled in mach_sysconfig either
  59   60           * it must be EINVAL.
  60   61           */
  61   62          default:
  62   63                  return (mach_sysconfig(which)); /* `uname -i`/os */
  63   64  
  64   65          case _CONFIG_CLK_TCK:
  65   66                  return ((long)hz);      /* clock frequency per second */
  66   67  
  67   68          case _CONFIG_PROF_TCK:
  68   69                  return ((long)hz);      /* profiling clock freq per sec */
  69   70  
  70   71          case _CONFIG_NGROUPS:
  71   72                  /*
  72   73                   * Maximum number of supplementary groups.
  73   74                   */
  74   75                  return (ngroups_max);
  75   76  
  76   77          case _CONFIG_OPEN_FILES:
  77   78                  /*
  78   79                   * Maximum number of open files (soft limit).
  79   80                   */
  80   81                  {
  81   82                          rlim64_t fd_ctl;
  82   83                          mutex_enter(&curproc->p_lock);
  83   84                          fd_ctl = rctl_enforced_value(
  84   85                              rctlproc_legacy[RLIMIT_NOFILE], curproc->p_rctls,
  85   86                              curproc);
  86   87                          mutex_exit(&curproc->p_lock);
  87   88                          return ((ulong_t)fd_ctl);
  88   89                  }
  89   90  
  90   91          case _CONFIG_CHILD_MAX:
  91   92                  /*
  92   93                   * Maximum number of processes.
  93   94                   */
  94   95                  return (v.v_maxup);
  95   96  
  96   97          case _CONFIG_POSIX_VER:
  97   98                  return (_POSIX_VERSION); /* current POSIX version */
  98   99  
  99  100          case _CONFIG_PAGESIZE:
 100  101                  return (PAGESIZE);
 101  102  
 102  103          case _CONFIG_XOPEN_VER:
 103  104                  return (_XOPEN_VERSION); /* current XOPEN version */
 104  105  
 105  106          case _CONFIG_NPROC_CONF:
 106  107                  return (zone_ncpus_get(curproc->p_zone));
 107  108  
 108  109          case _CONFIG_NPROC_ONLN:
 109  110                  return (zone_ncpus_online_get(curproc->p_zone));
 110  111  
 111  112          case _CONFIG_NPROC_MAX:
 112  113                  return (max_ncpus);
 113  114  
 114  115          case _CONFIG_STACK_PROT:
 115  116                  return (curproc->p_stkprot & ~PROT_USER);
 116  117  
 117  118          case _CONFIG_AIO_LISTIO_MAX:
 118  119                  return (_AIO_LISTIO_MAX);
 119  120  
 120  121          case _CONFIG_AIO_MAX:
 121  122                  return (_AIO_MAX);
 122  123  
 123  124          case _CONFIG_AIO_PRIO_DELTA_MAX:
 124  125                  return (0);
 125  126  
 126  127          case _CONFIG_DELAYTIMER_MAX:
 127  128                  return (INT_MAX);
 128  129  
 129  130          case _CONFIG_MQ_OPEN_MAX:
 130  131                  return (_MQ_OPEN_MAX);
 131  132  
 132  133          case _CONFIG_MQ_PRIO_MAX:
 133  134                  return (_MQ_PRIO_MAX);
 134  135  
 135  136          case _CONFIG_RTSIG_MAX:
 136  137                  return (_SIGRTMAX - _SIGRTMIN + 1);
 137  138  
 138  139          case _CONFIG_SEM_NSEMS_MAX:
 139  140                  return (_SEM_NSEMS_MAX);
 140  141  
 141  142          case _CONFIG_SEM_VALUE_MAX:
 142  143                  return (_SEM_VALUE_MAX);
 143  144  
 144  145          case _CONFIG_SIGQUEUE_MAX:
 145  146                  /*
 146  147                   * Maximum number of outstanding queued signals.
 147  148                   */
 148  149                  {
 149  150                          rlim64_t sigqsz_max;
 150  151                          mutex_enter(&curproc->p_lock);
 151  152                          sigqsz_max = rctl_enforced_value(rc_process_sigqueue,
 152  153                              curproc->p_rctls, curproc);
 153  154                          mutex_exit(&curproc->p_lock);
 154  155                          return ((uint_t)sigqsz_max);
 155  156                  }
 156  157  
 157  158          case _CONFIG_SIGRT_MIN:
 158  159                  return (_SIGRTMIN);
 159  160  
 160  161          case _CONFIG_SIGRT_MAX:
 161  162                  return (_SIGRTMAX);
 162  163  
  
    | 
      ↓ open down ↓ | 
    128 lines elided | 
    
      ↑ open up ↑ | 
  
 163  164          case _CONFIG_TIMER_MAX:
 164  165                  return (timer_max);
 165  166  
 166  167          case _CONFIG_PHYS_PAGES:
 167  168                  /*
 168  169                   * If the non-global zone has a phys. memory cap, use that.
 169  170                   * We always report the system-wide value for the global zone,
 170  171                   * even though rcapd can be used on the global zone too.
 171  172                   */
 172  173                  if (!INGLOBALZONE(curproc) &&
 173      -                    curproc->p_zone->zone_phys_mcap != 0)
 174      -                        return (MIN(btop(curproc->p_zone->zone_phys_mcap),
      174 +                    curproc->p_zone->zone_phys_mem_ctl != UINT64_MAX)
      175 +                        return (MIN(btop(curproc->p_zone->zone_phys_mem_ctl),
 175  176                              physinstalled));
 176  177  
 177  178                  return (physinstalled);
 178  179  
 179  180          case _CONFIG_AVPHYS_PAGES:
 180  181                  /*
 181  182                   * If the non-global zone has a phys. memory cap, use
 182  183                   * the phys. memory cap - zone's current rss.  We always
 183  184                   * report the system-wide value for the global zone, even
 184  185                   * though rcapd can be used on the global zone too.
 185  186                   */
 186  187                  if (!INGLOBALZONE(curproc) &&
 187      -                    curproc->p_zone->zone_phys_mcap != 0) {
      188 +                    curproc->p_zone->zone_phys_mem_ctl != UINT64_MAX) {
 188  189                          pgcnt_t cap, rss, free;
 189  190                          vmusage_t in_use;
 190  191                          size_t cnt = 1;
 191  192  
 192      -                        cap = btop(curproc->p_zone->zone_phys_mcap);
      193 +                        cap = btop(curproc->p_zone->zone_phys_mem_ctl);
 193  194                          if (cap > physinstalled)
 194  195                                  return (freemem);
 195  196  
 196  197                          if (vm_getusage(VMUSAGE_ZONE, 1, &in_use, &cnt,
 197  198                              FKIOCTL) != 0)
 198  199                                  in_use.vmu_rss_all = 0;
 199  200                          rss = btop(in_use.vmu_rss_all);
 200  201                          /*
 201  202                           * Because rcapd implements a soft cap, it is possible
 202  203                           * for rss to be temporarily over the cap.
 203  204                           */
 204  205                          if (cap > rss)
 205  206                                  free = cap - rss;
 206  207                          else
 207  208                                  free = 0;
 208  209                          return (MIN(free, freemem));
 209  210                  }
 210  211  
 211  212                  return (freemem);
 212  213  
 213  214          case _CONFIG_MAXPID:
 214  215                  return (maxpid);
 215  216  
 216  217          case _CONFIG_CPUID_MAX:
 217  218                  return (max_cpuid);
 218  219  
 219  220          case _CONFIG_EPHID_MAX:
 220  221                  return (MAXEPHUID);
 221  222  
 222  223          case _CONFIG_SYMLOOP_MAX:
 223  224                  return (MAXSYMLINKS);
 224  225          }
 225  226  }
  
    | 
      ↓ open down ↓ | 
    23 lines elided | 
    
      ↑ open up ↑ | 
  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX