This source file includes following definitions.
- opal_setlimit
- opal_util_init_sys_limits
- opal_getpagesize
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 #include "opal_config.h"
  27 
  28 #include <string.h>
  29 
  30 #include <errno.h>
  31 #ifdef HAVE_SYS_TYPES_H
  32 #include <sys/types.h>
  33 #endif
  34 #ifdef HAVE_SYS_TIME_H
  35 #include <sys/time.h>
  36 #endif
  37 #ifdef HAVE_SYS_RESOURCE_H
  38 #include <sys/resource.h>
  39 #endif
  40 #ifdef HAVE_UNISTD_H
  41 #include <unistd.h>
  42 #endif
  43 
  44 #include "opal/constants.h"
  45 #include "opal/runtime/opal_params.h"
  46 
  47 #include "opal/util/sys_limits.h"
  48 #include "opal/util/show_help.h"
  49 #include "opal/util/output.h"
  50 #include "opal/util/argv.h"
  51 
  52 
  53 
  54 
  55 OPAL_DECLSPEC opal_sys_limits_t opal_sys_limits = {
  56          false,
  57          -1,
  58          -1,
  59           0
  60 };
  61 
  62 static int opal_setlimit(int resource, char *value, rlim_t *out)
  63 {
  64     struct rlimit rlim, rlim_set;
  65     rlim_t maxlim;
  66 
  67     rlim.rlim_cur = 0;
  68 
  69     if (0 == strcmp(value, "max")) {
  70             maxlim = -1;
  71     } else if (0 == strncmp(value, "unlimited", strlen(value))) {
  72             maxlim = RLIM_INFINITY;
  73     } else {
  74         maxlim = strtol(value, NULL, 10);
  75     }
  76 
  77     if (0 <= getrlimit(resource, &rlim)) {
  78         if (rlim.rlim_max < maxlim) {
  79             rlim_set.rlim_cur = rlim.rlim_cur;
  80             rlim_set.rlim_max = rlim.rlim_max;
  81         } else {
  82             rlim_set.rlim_cur = maxlim;
  83             rlim_set.rlim_max = maxlim;
  84         }
  85         if (0 <= setrlimit(resource, &rlim_set)) {
  86             rlim.rlim_cur = rlim_set.rlim_cur;
  87         } else if (RLIM_INFINITY == maxlim) {
  88             
  89 
  90 
  91             rlim_set.rlim_cur = rlim.rlim_max;
  92             rlim_set.rlim_max = rlim.rlim_max;
  93             if (0 <= setrlimit(resource, &rlim_set)) {
  94                 rlim.rlim_cur = rlim_set.rlim_cur;
  95             } else {
  96                 return OPAL_ERROR;
  97             }
  98         } else {
  99             return OPAL_ERROR;
 100         }
 101     } else {
 102         return OPAL_ERROR;
 103     }
 104     *out = rlim.rlim_cur;
 105     return OPAL_SUCCESS;
 106 }
 107 
 108 int opal_util_init_sys_limits(char **errmsg)
 109 {
 110     char **lims, **lim=NULL, *setlim;
 111     int i, rc = OPAL_ERROR;
 112     rlim_t value;
 113 
 114     
 115     if (NULL == opal_set_max_sys_limits) {
 116         return OPAL_SUCCESS;
 117     }
 118 
 119     
 120     lims = opal_argv_split(opal_set_max_sys_limits, ',');
 121     if (NULL == lims) {
 122         return OPAL_ERR_OUT_OF_RESOURCE;
 123     }
 124 
 125     
 126     for (i=0; NULL != lims[i]; i++) {
 127         lim = opal_argv_split(lims[i], ':');
 128         if (1 == opal_argv_count(lim)) {
 129             setlim = "max";
 130         } else {
 131             setlim = lim[1];
 132         }
 133 
 134         
 135 
 136 
 137 
 138         if (0 == strcmp(lim[0], "1")) {
 139 #if HAVE_DECL_RLIMIT_NOFILE
 140             if (OPAL_SUCCESS !=
 141                 opal_setlimit(RLIMIT_NOFILE, "max", &value)) {
 142                 *errmsg = opal_show_help_string("help-opal-util.txt", "sys-limit-failed", true, "openfiles", "max");
 143                 goto out;
 144             }
 145             opal_sys_limits.num_files = value;
 146 #endif
 147 #if HAVE_DECL_RLIMIT_NPROC
 148             if (OPAL_SUCCESS != opal_setlimit(RLIMIT_NPROC, "max", &value)) {
 149                 *errmsg = opal_show_help_string("help-opal-util.txt", "sys-limit-failed", true, "maxchildren", "max");
 150                 goto out;
 151             }
 152             opal_sys_limits.num_procs = value;
 153 #endif
 154 #if HAVE_DECL_RLIMIT_FSIZE
 155             if (OPAL_SUCCESS !=
 156                 opal_setlimit(RLIMIT_FSIZE, "max", &value)) {
 157                 *errmsg = opal_show_help_string("help-opal-util.txt", "sys-limit-failed", true, "filesize", "max");
 158                 goto out;
 159             }
 160             opal_sys_limits.file_size = value;
 161 #endif
 162             break;
 163         } else if (0 == strcmp(lim[0], "0")) {
 164             
 165             break;
 166         }
 167 
 168         
 169         if (0 == strcmp(lim[0], "core")) {
 170 #if HAVE_DECL_RLIMIT_CORE
 171             if (OPAL_SUCCESS != opal_setlimit(RLIMIT_CORE, setlim, &value)) {
 172                 *errmsg = opal_show_help_string("help-opal-util.txt", "sys-limit-failed", true, "openfiles", setlim);
 173                 goto out;
 174             }
 175 #endif
 176         } else if (0 == strcmp(lim[0], "filesize")) {
 177 #if HAVE_DECL_RLIMIT_FSIZE
 178             if (OPAL_SUCCESS != opal_setlimit(RLIMIT_FSIZE, setlim, &value)) {
 179                 *errmsg = opal_show_help_string("help-opal-util.txt", "sys-limit-failed", true, "filesize", setlim);
 180                 goto out;
 181             }
 182             opal_sys_limits.file_size = value;
 183 #endif
 184         } else if (0 == strcmp(lim[0], "maxmem")) {
 185 #if HAVE_DECL_RLIMIT_AS
 186             if (OPAL_SUCCESS != opal_setlimit(RLIMIT_AS, setlim, &value)) {
 187                 *errmsg = opal_show_help_string("help-opal-util.txt", "sys-limit-failed", true, "maxmem", setlim);
 188                 goto out;
 189             }
 190 #endif
 191         } else if (0 == strcmp(lim[0], "openfiles")) {
 192 #if HAVE_DECL_RLIMIT_NOFILE
 193             if (OPAL_SUCCESS != opal_setlimit(RLIMIT_NOFILE, setlim, &value)) {
 194                 *errmsg = opal_show_help_string("help-opal-util.txt", "sys-limit-failed", true, "openfiles", setlim);
 195                 goto out;
 196             }
 197             opal_sys_limits.num_files = value;
 198 #endif
 199         } else if (0 == strcmp(lim[0], "stacksize")) {
 200 #if HAVE_DECL_RLIMIT_STACK
 201             if (OPAL_SUCCESS != opal_setlimit(RLIMIT_STACK, setlim, &value)) {
 202                 *errmsg = opal_show_help_string("help-opal-util.txt", "sys-limit-failed", true, "stacksize", setlim);
 203                 goto out;
 204             }
 205 #endif
 206         } else if (0 == strcmp(lim[0], "maxchildren")) {
 207 #if HAVE_DECL_RLIMIT_NPROC
 208             if (OPAL_SUCCESS != opal_setlimit(RLIMIT_NPROC, setlim, &value)) {
 209                 *errmsg = opal_show_help_string("help-opal-util.txt", "sys-limit-failed", true, "maxchildren", setlim);
 210                 goto out;
 211             }
 212             opal_sys_limits.num_procs = value;
 213 #endif
 214         } else {
 215             *errmsg = opal_show_help_string("help-opal-util.txt", "sys-limit-unrecognized", true, lim[0], setlim);
 216             goto out;
 217         }
 218         opal_argv_free(lim);
 219         lim = NULL;
 220     }
 221 
 222     
 223     opal_sys_limits.initialized = true;
 224 
 225     rc = OPAL_SUCCESS;
 226 
 227 out:
 228     opal_argv_free(lims);
 229     if (NULL != lim) {
 230         opal_argv_free(lim);
 231     }
 232 
 233     return rc;
 234 }
 235 
 236 int opal_getpagesize(void)
 237 {
 238     static int page_size = -1;
 239 
 240     if (page_size != -1) {
 241 
 242         return page_size;
 243     }
 244 
 245 #ifdef HAVE_GETPAGESIZE
 246     return page_size = getpagesize();
 247 #elif defined(_SC_PAGESIZE )
 248     return page_size = sysconf(_SC_PAGESIZE);
 249 #elif defined(_SC_PAGE_SIZE)
 250     return page_size = sysconf(_SC_PAGE_SIZE);
 251 #else
 252     return page_size = 65536; 
 253 #endif
 254 }