- (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.
This commit is contained in:
Darren Tucker 2011-01-17 11:55:59 +11:00
parent 1ccbfa88b1
commit 0c93adc7c1
2 changed files with 39 additions and 19 deletions

View File

@ -6,6 +6,9 @@
its unique snowflake of a gdb error to the ones we look for. its unique snowflake of a gdb error to the ones we look for.
- (djm) [regress/agent-getpeereid.sh] leave stdout attached when running - (djm) [regress/agent-getpeereid.sh] leave stdout attached when running
ssh-add to avoid $SUDO failures on Linux 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 20110116
- (dtucker) [Makefile.in configure.ac regress/kextype.sh] Skip sha256-based - (dtucker) [Makefile.in configure.ac regress/kextype.sh] Skip sha256-based

View 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> * Copyright (c) 2005 Daniel Walsh <dwalsh@redhat.com>
@ -208,14 +208,22 @@ ssh_selinux_change_context(const char *newname)
#endif /* WITH_SELINUX */ #endif /* WITH_SELINUX */
#ifdef LINUX_OOM_ADJUST #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.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 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. * Tell the kernel's out-of-memory killer to avoid sshd.
@ -224,23 +232,31 @@ static int oom_adj_save = INT_MIN;
void void
oom_adjust_setup(void) oom_adjust_setup(void)
{ {
int i, value;
FILE *fp; FILE *fp;
debug3("%s", __func__); debug3("%s", __func__);
if ((fp = fopen(OOM_ADJ_PATH, "r+")) != NULL) { 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) if (fscanf(fp, "%d", &oom_adj_save) != 1)
verbose("error reading %s: %s", OOM_ADJ_PATH, strerror(errno)); verbose("error reading %s: %s", oom_adj_path,
strerror(errno));
else { else {
rewind(fp); rewind(fp);
if (fprintf(fp, "%d\n", OOM_ADJ_NOKILL) <= 0) if (fprintf(fp, "%d\n", value) <= 0)
verbose("error writing %s: %s", verbose("error writing %s: %s",
OOM_ADJ_PATH, strerror(errno)); oom_adj_path, strerror(errno));
else else
verbose("Set %s from %d to %d", verbose("Set %s from %d to %d",
OOM_ADJ_PATH, oom_adj_save, OOM_ADJ_NOKILL); oom_adj_path, oom_adj_save, value);
} }
fclose(fp); fclose(fp);
return;
} }
}
oom_adj_path = NULL;
} }
/* Restore the saved OOM adjustment */ /* Restore the saved OOM adjustment */
@ -250,13 +266,14 @@ oom_adjust_restore(void)
FILE *fp; FILE *fp;
debug3("%s", __func__); 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; return;
if (fprintf(fp, "%d\n", oom_adj_save) <= 0) 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 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); fclose(fp);
return; return;