- (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:
parent
1ccbfa88b1
commit
0c93adc7c1
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
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));
|
||||
verbose("error reading %s: %s", oom_adj_path,
|
||||
strerror(errno));
|
||||
else {
|
||||
rewind(fp);
|
||||
if (fprintf(fp, "%d\n", OOM_ADJ_NOKILL) <= 0)
|
||||
if (fprintf(fp, "%d\n", value) <= 0)
|
||||
verbose("error writing %s: %s",
|
||||
OOM_ADJ_PATH, strerror(errno));
|
||||
oom_adj_path, strerror(errno));
|
||||
else
|
||||
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);
|
||||
return;
|
||||
}
|
||||
}
|
||||
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;
|
||||
|
|
Loading…
Reference in New Issue