diff options
author | Oleksandr Natalenko <onatalen@redhat.com> | 2016-09-28 14:29:23 +0200 |
---|---|---|
committer | Kaleb KEITHLEY <kkeithle@redhat.com> | 2016-10-11 05:18:05 -0700 |
commit | de07155bfae3c5846797cbb19ee044751cbe6f6e (patch) | |
tree | d0e8459bbed4cac48859e8af9f74c8d26fd3ba8b /glusterfsd/src | |
parent | 0fed7e7f0aad9973900c89434f736797d9ace2bd (diff) |
glusterfsd/main: fix OOM adjustment for older kernels
Milind Changire reported that GlusterFS fails to build on RHEL5
because linux/oom.h is unavailable.
Milind's initial patch disables OOM adjustment completely
for those environments that do not have this header. However,
I'd take another approach that:
1) checks for linux/oom.h in compile-time and defines necessary
constants if the header is not present;
2) checks for available OOM API in /proc in run-time and uses it
accordingly.
This allows OOM to be adjusted properly on RHEL5 (the kernel is pretty new
to present /proc API for that) as well as RHEL6 (the kernel has many thing
backported including new /proc API).
Change-Id: I1bc610586872d208430575c149a7d0c54bd82370
BUG: 1379769
Signed-off-by: Oleksandr Natalenko <onatalen@redhat.com>
Reviewed-on: http://review.gluster.org/15587
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
Smoke: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Diffstat (limited to 'glusterfsd/src')
-rw-r--r-- | glusterfsd/src/glusterfsd.c | 80 |
1 files changed, 63 insertions, 17 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index 7c07e3d0bfb..9a5edd4ddf4 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -33,7 +33,14 @@ #include <pwd.h> #ifdef GF_LINUX_HOST_OS +#ifdef HAVE_LINUX_OOM_H #include <linux/oom.h> +#else +#define OOM_SCORE_ADJ_MIN (-1000) +#define OOM_SCORE_ADJ_MAX 1000 +#define OOM_DISABLE (-17) +#define OOM_ADJUST_MAX 15 +#endif #endif #ifdef HAVE_MALLOC_H @@ -773,21 +780,50 @@ out: } +#ifdef GF_LINUX_HOST_OS +static struct oom_api_info { + char *oom_api_file; + int32_t oom_min; + int32_t oom_max; +} oom_api_info[] = { + { "/proc/self/oom_score_adj", OOM_SCORE_ADJ_MIN, OOM_SCORE_ADJ_MAX }, + { "/proc/self/oom_adj", OOM_DISABLE, OOM_ADJUST_MAX }, + { NULL, 0, 0 } +}; + + +static struct oom_api_info * +get_oom_api_info (void) +{ + struct oom_api_info *api = NULL; + + for (api = oom_api_info; api->oom_api_file; api++) { + if (sys_access (api->oom_api_file, F_OK) != -1) { + return api; + } + } + + return NULL; +} +#endif static error_t parse_opts (int key, char *arg, struct argp_state *state) { - cmd_args_t *cmd_args = NULL; - uint32_t n = 0; - int32_t k = 0; - double d = 0.0; - gf_boolean_t b = _gf_false; - char *pwd = NULL; - char tmp_buf[2048] = {0,}; - char *tmp_str = NULL; - char *port_str = NULL; - struct passwd *pw = NULL; - int ret = 0; + cmd_args_t *cmd_args = NULL; + uint32_t n = 0; +#ifdef GF_LINUX_HOST_OS + int32_t k = 0; + struct oom_api_info *api = NULL; +#endif + double d = 0.0; + gf_boolean_t b = _gf_false; + char *pwd = NULL; + char tmp_buf[2048] = {0,}; + char *tmp_str = NULL; + char *port_str = NULL; + struct passwd *pw = NULL; + int ret = 0; cmd_args = state->input; @@ -1132,8 +1168,12 @@ parse_opts (int key, char *arg, struct argp_state *state) case ARGP_OOM_SCORE_ADJ_KEY: k = 0; + api = get_oom_api_info(); + if (!api) + goto no_oom_api; + if (gf_string2int (arg, &k) == 0 && - k >= OOM_SCORE_ADJ_MIN && k <= OOM_SCORE_ADJ_MAX) { + k >= api->oom_min && k <= api->oom_max) { cmd_args->oom_score_adj = gf_strdup (arg); break; } @@ -1141,6 +1181,7 @@ parse_opts (int key, char *arg, struct argp_state *state) argp_failure (state, -1, 0, "unknown oom_score_adj value %s", arg); +no_oom_api: break; #endif @@ -2216,17 +2257,22 @@ out: static int set_oom_score_adj (glusterfs_ctx_t *ctx) { - int ret = -1; - cmd_args_t *cmd_args = NULL; - int fd = -1; - size_t oom_score_len = 0; + int ret = -1; + cmd_args_t *cmd_args = NULL; + int fd = -1; + size_t oom_score_len = 0; + struct oom_api_info *api = NULL; cmd_args = &ctx->cmd_args; if (!cmd_args->oom_score_adj) goto success; - fd = open ("/proc/self/oom_score_adj", O_WRONLY); + api = get_oom_api_info(); + if (!api) + goto out; + + fd = open (api->oom_api_file, O_WRONLY); if (fd < 0) goto out; |