device-mapper-multipath/0105-fix-oom-adj.patch
Benjamin Marzinski ec58dfa358 Modify 0103-add-disable-sync-option.patch
Add 0104-RHBZ-737989-systemd-unit-fix.patch
 * systemd will only start multipathd if /etc/multipath.conf exists
Add 0105-fix-oom-adj.patch
 * first try setting oom_score_adj
2011-09-21 06:45:47 -05:00

70 lines
1.4 KiB
Diff

---
multipathd/main.c | 37 ++++++++++++++++++++++++++++---------
1 file changed, 28 insertions(+), 9 deletions(-)
Index: multipath-tools/multipathd/main.c
===================================================================
--- multipath-tools.orig/multipathd/main.c
+++ multipath-tools/multipathd/main.c
@@ -15,6 +15,7 @@
#include <sys/time.h>
#include <sys/resource.h>
#include <limits.h>
+#include <linux/oom.h>
/*
* libcheckers
@@ -1389,17 +1390,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");
}
void
@@ -1489,7 +1508,7 @@ child (void * param)
}
signal_init();
setscheduler();
- set_oom_adj(-16);
+ set_oom_adj();
vecs = gvecs = init_vecs();
if (!vecs)