This is one way to prevent the kernel warning message without having to
introduce a new constant. Scale the old oom_adj-style value the same way
the kernel internally does it and use that instead if oom_score_adj is
available for writing.

Signed-off-by: Dan McGee <d...@archlinux.org>
---

This addresses some of the concerns raised on the ML and will at least keep
those of us running modern kernels happy.

Alternatively one could switch the symbol used to be the new style and have the
old one computed; however this is a pain for legacy vs. current versions.

 src/backend/postmaster/fork_process.c |   22 +++++++++++++++++++++-
 1 files changed, 21 insertions(+), 1 deletions(-)

diff --git a/src/backend/postmaster/fork_process.c 
b/src/backend/postmaster/fork_process.c
index b2fe9a1..3cded54 100644
--- a/src/backend/postmaster/fork_process.c
+++ b/src/backend/postmaster/fork_process.c
@@ -81,16 +81,36 @@ fork_process(void)
                         * Use open() not stdio, to ensure we control the open 
flags. Some
                         * Linux security environments reject anything but 
O_WRONLY.
                         */
-                       int                     fd = open("/proc/self/oom_adj", 
O_WRONLY, 0);
+                       int                     fd = 
open("/proc/self/oom_score_adj", O_WRONLY, 0);
 
                        /* We ignore all errors */
                        if (fd >= 0)
                        {
                                char            buf[16];
+                               int             oom_score_adj;
 
+                               /*
+                                * The compile-time value is the old style 
oom_adj;
+                                * scale it the same way the kernel does to
+                                * convert to the new style oom_score_adj. This
+                                * should become a constant at compile time.
+                                * Valid values range from -17 (never kill) to
+                                * 15; no attempt of validation is done.
+                                */
+                               oom_score_adj = LINUX_OOM_ADJ * 1000 / 17;
                                snprintf(buf, sizeof(buf), "%d\n", 
LINUX_OOM_ADJ);
                                (void) write(fd, buf, strlen(buf));
                                close(fd);
+                       } else if (errno == EEXIST) {
+                               int             fd = open("/proc/self/oom_adj", 
O_WRONLY, 0);
+                               if (fd >= 0)
+                               {
+                                       char    buf[16];
+
+                                       snprintf(buf, sizeof(buf), "%d\n", 
LINUX_OOM_ADJ);
+                                       (void) write(fd, buf, strlen(buf));
+                                       close(fd);
+                               }
                        }
                }
 #endif   /* LINUX_OOM_ADJ */
-- 
1.7.6.1


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to