--- multipathd/main.c | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) Index: multipath-tools/multipathd/main.c =================================================================== --- multipath-tools.orig/multipathd/main.c +++ multipath-tools/multipathd/main.c @@ -15,6 +15,7 @@ #include #include #include +#include /* * libcheckers @@ -1389,17 +1390,35 @@ setscheduler (void) } static void -set_oom_adj (int val) +set_oom_adj (void) { + int retry = 1; + char *file = "/proc/self/oom_score_adj"; + int score = OOM_SCORE_ADJ_MIN; FILE *fp; + struct stat st; - fp = fopen("/proc/self/oom_adj", "w"); - - if (!fp) - return; - - fprintf(fp, "%i", val); - fclose(fp); + do { + if (stat(file, &st) == 0){ + fp = fopen(file, "w"); + if (!fp) { + condlog(0, "couldn't fopen %s : %s", file, + strerror(errno)); + return; + } + fprintf(fp, "%i", score); + fclose(fp); + return; + } + if (errno != ENOENT) { + condlog(0, "couldn't stat %s : %s", file, + strerror(errno)); + return; + } + file = "/proc/self/oom_adj"; + score = OOM_ADJUST_MIN; + } while (retry--); + condlog(0, "couldn't adjust oom score"); } void @@ -1489,7 +1508,7 @@ child (void * param) } signal_init(); setscheduler(); - set_oom_adj(-16); + set_oom_adj(); vecs = gvecs = init_vecs(); if (!vecs)