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 }