root/opal/util/sys_limits.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. opal_setlimit
  2. opal_util_init_sys_limits
  3. opal_getpagesize

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
   4  *                         University Research and Technology
   5  *                         Corporation.  All rights reserved.
   6  * Copyright (c) 2004-2005 The University of Tennessee and The University
   7  *                         of Tennessee Research Foundation.  All rights
   8  *                         reserved.
   9  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
  10  *                         University of Stuttgart.  All rights reserved.
  11  * Copyright (c) 2004-2005 The Regents of the University of California.
  12  *                         All rights reserved.
  13  * Copyright (c) 2007      Cisco Systems, Inc.  All rights reserved.
  14  * Copyright (c) 2013-2015 Los Alamos National Security, LLC. All rights
  15  *                         reserved.
  16  * Copyright (c) 2014      Intel, Inc. All rights reserved.
  17  * Copyright (c) 2015      Research Organization for Information Science
  18  *                         and Technology (RIST). All rights reserved.
  19  * $COPYRIGHT$
  20  *
  21  * Additional copyrights may follow
  22  *
  23  * $HEADER$
  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  * Create and initialize storage for the system limits
  54  */
  55 OPAL_DECLSPEC opal_sys_limits_t opal_sys_limits = {
  56     /* initialized = */     false,
  57     /* num_files   = */     -1,
  58     /* num_procs   = */     -1,
  59     /* file_size   = */      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             /* if unlimited wasn't allowed, try to set
  89              * to max allowed
  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     /* if limits were not given, then nothing to do */
 115     if (NULL == opal_set_max_sys_limits) {
 116         return OPAL_SUCCESS;
 117     }
 118 
 119     /* parse the requested limits to set */
 120     lims = opal_argv_split(opal_set_max_sys_limits, ',');
 121     if (NULL == lims) {
 122         return OPAL_ERR_OUT_OF_RESOURCE;
 123     }
 124 
 125     /* each limit is expressed as a "param:value" pair */
 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         /* for historical reasons, a value of "1" means
 135          * that we set the limits on #files, #children,
 136          * and max file size
 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             /* user didn't want anything set */
 165             break;
 166         }
 167 
 168         /* process them separately */
 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     /* indicate we initialized the limits structure */
 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 // testing in a loop showed sysconf() took ~5 usec vs ~0.3 usec with it cached
 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; /* safer to overestimate than under */
 253 #endif
 254 }

/* [<][>][^][v][top][bottom][index][help] */