[dm-devel] [RESEND][PATCH] multipath: add support for setting oom_score_adj
Benjamin Marzinski
bmarzins at redhat.com
Fri Sep 23 14:35:59 UTC 2011
The oom_adj procfs interface is deprecated. I've added support for using the
new oom_score_adj interface. The code still falls back to using oom_adj
if oom_score_adj doesn't exist.
Resending, since I was obviously working far too late last night.
Signed-off-by: Benjamin Marzinski <bmarzins at redhat.com>
---
multipathd/main.c | 37 ++++++++++++++++++++++++++++---------
1 file changed, 28 insertions(+), 9 deletions(-)
Index: multipath-tools-110916/multipathd/main.c
===================================================================
--- multipath-tools-110916.orig/multipathd/main.c
+++ multipath-tools-110916/multipathd/main.c
@@ -15,6 +15,7 @@
#include <sys/time.h>
#include <sys/resource.h>
#include <limits.h>
+#include <linux/oom.h>
/*
* libcheckers
@@ -1458,17 +1459,35 @@ setscheduler (void)
}
static void
-set_oom_adj (int val)
+set_oom_adj (void)
{
+ int retry = 1;
+ char *file = "/proc/self/oom_score_adj";
+ int score = OOM_SCORE_ADJ_MIN;
FILE *fp;
+ struct stat st;
- fp = fopen("/proc/self/oom_adj", "w");
-
- if (!fp)
- return;
-
- fprintf(fp, "%i", val);
- fclose(fp);
+ do {
+ if (stat(file, &st) == 0){
+ fp = fopen(file, "w");
+ if (!fp) {
+ condlog(0, "couldn't fopen %s : %s", file,
+ strerror(errno));
+ return;
+ }
+ fprintf(fp, "%i", score);
+ fclose(fp);
+ return;
+ }
+ if (errno != ENOENT) {
+ condlog(0, "couldn't stat %s : %s", file,
+ strerror(errno));
+ return;
+ }
+ file = "/proc/self/oom_adj";
+ score = OOM_ADJUST_MIN;
+ } while (retry--);
+ condlog(0, "couldn't adjust oom score");
}
static int
@@ -1547,7 +1566,7 @@ child (void * param)
signal_init();
setscheduler();
- set_oom_adj(-16);
+ set_oom_adj();
vecs = gvecs = init_vecs();
if (!vecs)
More information about the dm-devel
mailing list