nbd-client: adjust the oom-killer score in swap mode
authorDmitry V. Levin <ldv@altlinux.org>
Thu, 21 Jun 2012 20:59:22 +0000 (00:59 +0400)
committerWouter Verhelst <w@uter.be>
Sat, 23 Jun 2012 23:38:34 +0000 (01:38 +0200)
In swap mode, it is highly desirable to take all available measures that
could help nbd-client survival in low memory conditions.  One of such
measures is to disable oom killing of nbd-client by adjusting the
oom-killer score.

Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
man/nbd-client.8.in.sgml
nbd-client.c

index 4f24a617b447d385932cf389b24962da5c037353..8c862a1a02ebd64ab01487576a082e391c7cac3a 100644 (file)
@@ -211,8 +211,9 @@ manpage.1: manpage.sgml
        <listitem>
          <para>Specifies that this NBD device will be used as
          swapspace. This option attempts to prevent deadlocks by
-         performing mlockall() at an appropriate time. It does not
-         however guarantee that such deadlocks can be avoided.</para>
+         performing mlockall() and adjusting the oom-killer score
+         at an appropriate time. It does not however guarantee
+         that such deadlocks can be avoided.</para>
        </listitem>
       </varlistentry>
       <varlistentry>
index 2321e7bbd6df2a32041f069746a22bb1051e9fe5..5526db00750af9a0c34a9e787db88020530d3aea 100644 (file)
@@ -372,6 +372,23 @@ void finish_sock(int sock, int nbd, int swap) {
                mlockall(MCL_CURRENT | MCL_FUTURE);
 }
 
+#ifdef __linux__
+static int
+oom_adjust(const char *file, const char *value)
+{
+       int fd, rc;
+       size_t len;
+
+       fd = open(file, O_WRONLY);
+       if (fd < 0)
+               return -1;
+       len = strlen(value);
+       rc = write(fd, value, len) != (ssize_t) len;
+       close(fd);
+       return rc ? -1 : 0;
+}
+#endif
+
 void usage(char* errmsg, ...) {
        if(errmsg) {
                char tmp[256];
@@ -561,6 +578,15 @@ int main(int argc, char *argv[]) {
        setsizes(nbd, size64, blocksize, flags);
        set_timeout(nbd, timeout);
        finish_sock(sock, nbd, swap);
+#ifdef __linux__
+       if (swap) {
+               /* try linux >= 2.6.36 interface first */
+               if (oom_adjust("/proc/self/oom_score_adj", "-1000")) {
+                       /* fall back to linux <= 2.6.35 interface */
+                       oom_adjust("/proc/self/oom_adj", "-17");
+               }
+       }
+#endif
 
        /* Go daemon */