cleanerd is a very important process in a system which uses nilfs. So it should
adjust the OOM killer for reducing possibility of the killing as much as
possible.

Signed-off-by: Hitoshi Mitake <mitake.hito...@lab.ntt.co.jp>
---
 sbin/cleanerd/cleanerd.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/sbin/cleanerd/cleanerd.c b/sbin/cleanerd/cleanerd.c
index edfa083..3494a9a 100644
--- a/sbin/cleanerd/cleanerd.c
+++ b/sbin/cleanerd/cleanerd.c
@@ -654,6 +654,40 @@ nilfs_cleanerd_select_segments(struct nilfs_cleanerd 
*cleanerd,
        return nssegs;
 }
 
+static int oom_adjust(void)
+{
+       int fd, err;
+       const char *path, *score;
+       struct stat st;
+
+       /* Avoid oom-killer */
+       path = "/proc/self/oom_score_adj";
+       score = "-1000\n";
+
+       if (stat(path, &st)) {
+               /* oom_score_adj cannot be used, try oom_adj */
+               path = "/proc/self/oom_adj";
+               score = "-17\n";
+       }
+
+       fd = open(path, O_WRONLY);
+       if (fd < 0) {
+               fprintf(stderr, "can't adjust oom-killer's pardon %s, %m\n",
+                       path);
+               return errno;
+       }
+
+       err = write(fd, score, strlen(score));
+       if (err < 0) {
+               fprintf(stderr, "can't adjust oom-killer's pardon %s, %m\n",
+                       path);
+               close(fd);
+               return errno;
+       }
+       close(fd);
+       return 0;
+}
+
 #define DEVNULL        "/dev/null"
 #define ROOTDIR        "/"
 
@@ -1549,6 +1583,11 @@ int main(int argc, char *argv[])
                exit(1);
        }
 
+       if (oom_adjust() < 0) {
+               fprintf(stderr, "adjusting the OOM killer falied: %m\n");
+               exit(1);
+       }
+
        openlog(progname, LOG_PID, LOG_DAEMON);
        syslog(LOG_INFO, "start");
 
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to