]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
- (dtucker) [openbsd-compat/port-linux.c] Bug #1838: Add support for the new
authorDarren Tucker <dtucker@zip.com.au>
Mon, 17 Jan 2011 00:55:59 +0000 (11:55 +1100)
committerDarren Tucker <dtucker@zip.com.au>
Mon, 17 Jan 2011 00:55:59 +0000 (11:55 +1100)
   Linux OOM-killer magic values that changed in 2.6.36 kernels, with fallback
   to the old values.  Feedback from vapier at gentoo org and djm, ok djm.

ChangeLog
openbsd-compat/port-linux.c

index 7dda03e0eb238c799b48d760293dac0cbf022f17..e64a550f1602deaae08a8f75957ad7ae0ae12e59 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,9 @@
    its unique snowflake of a gdb error to the ones we look for.
  - (djm) [regress/agent-getpeereid.sh] leave stdout attached when running
    ssh-add to avoid $SUDO failures on Linux
+ - (dtucker) [openbsd-compat/port-linux.c] Bug #1838: Add support for the new
+   Linux OOM-killer magic values that changed in 2.6.36 kernels, with fallback
+   to the old values.  Feedback from vapier at gentoo org and djm, ok djm.
 
 20110116
  - (dtucker) [Makefile.in configure.ac regress/kextype.sh] Skip sha256-based
index 86d16dc6e027df923d18288b7350b8575338176f..d89101d18ed0c81a96b83963d52e9808147c0b4e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: port-linux.c,v 1.9 2010/09/10 00:30:25 dtucker Exp $ */
+/* $Id: port-linux.c,v 1.10 2011/01/17 00:56:00 dtucker Exp $ */
 
 /*
  * Copyright (c) 2005 Daniel Walsh <dwalsh@redhat.com>
@@ -208,14 +208,22 @@ ssh_selinux_change_context(const char *newname)
 #endif /* WITH_SELINUX */
 
 #ifdef LINUX_OOM_ADJUST
-#define OOM_ADJ_PATH   "/proc/self/oom_adj"
 /*
- * The magic "don't kill me", as documented in eg:
+ * The magic "don't kill me" values, old and new, as documented in eg:
  * http://lxr.linux.no/#linux+v2.6.32/Documentation/filesystems/proc.txt
+ * http://lxr.linux.no/#linux+v2.6.36/Documentation/filesystems/proc.txt
  */
-#define OOM_ADJ_NOKILL -17
 
 static int oom_adj_save = INT_MIN;
+static char *oom_adj_path = NULL;
+struct {
+       char *path;
+       int value;
+} oom_adjust[] = {
+       {"/proc/self/oom_score_adj", -1000},    /* kernels >= 2.6.36 */
+       {"/proc/self/oom_adj", -17},            /* kernels <= 2.6.35 */
+       {NULL, 0},
+};
 
 /*
  * Tell the kernel's out-of-memory killer to avoid sshd.
@@ -224,23 +232,31 @@ static int oom_adj_save = INT_MIN;
 void
 oom_adjust_setup(void)
 {
+       int i, value;
        FILE *fp;
 
        debug3("%s", __func__);
-       if ((fp = fopen(OOM_ADJ_PATH, "r+")) != NULL) {
-               if (fscanf(fp, "%d", &oom_adj_save) != 1)
-                       verbose("error reading %s: %s", OOM_ADJ_PATH, strerror(errno));
-               else {
-                       rewind(fp);
-                       if (fprintf(fp, "%d\n", OOM_ADJ_NOKILL) <= 0)
-                               verbose("error writing %s: %s",
-                                   OOM_ADJ_PATH, strerror(errno));
-                       else
-                               verbose("Set %s from %d to %d",
-                                   OOM_ADJ_PATH, oom_adj_save, OOM_ADJ_NOKILL);
+        for (i = 0; oom_adjust[i].path != NULL; i++) {
+               oom_adj_path = oom_adjust[i].path;
+               value = oom_adjust[i].value;
+               if ((fp = fopen(oom_adj_path, "r+")) != NULL) {
+                       if (fscanf(fp, "%d", &oom_adj_save) != 1)
+                               verbose("error reading %s: %s", oom_adj_path,
+                                   strerror(errno));
+                       else {
+                               rewind(fp);
+                               if (fprintf(fp, "%d\n", value) <= 0)
+                                       verbose("error writing %s: %s",
+                                          oom_adj_path, strerror(errno));
+                               else
+                                       verbose("Set %s from %d to %d",
+                                          oom_adj_path, oom_adj_save, value);
+                       }
+                       fclose(fp);
+                       return;
                }
-               fclose(fp);
        }
+       oom_adj_path = NULL;
 }
 
 /* Restore the saved OOM adjustment */
@@ -250,13 +266,14 @@ oom_adjust_restore(void)
        FILE *fp;
 
        debug3("%s", __func__);
-       if (oom_adj_save == INT_MIN || (fp = fopen(OOM_ADJ_PATH, "w")) == NULL)
+       if (oom_adj_save == INT_MIN || oom_adj_save == NULL ||
+           (fp = fopen(oom_adj_path, "w")) == NULL)
                return;
 
        if (fprintf(fp, "%d\n", oom_adj_save) <= 0)
-               verbose("error writing %s: %s", OOM_ADJ_PATH, strerror(errno));
+               verbose("error writing %s: %s", oom_adj_path, strerror(errno));
        else
-               verbose("Set %s to %d", OOM_ADJ_PATH, oom_adj_save);
+               verbose("Set %s to %d", oom_adj_path, oom_adj_save);
 
        fclose(fp);
        return;