FEATURE: ability to turn off transparent huge pages on arbitrary programs
authorSam <sam.saffron@gmail.com>
Thu, 2 Aug 2018 05:01:42 +0000 (15:01 +1000)
committerSam <sam.saffron@gmail.com>
Thu, 2 Aug 2018 05:01:56 +0000 (15:01 +1000)
image/base/Dockerfile
image/base/thpoff.c [new file with mode: 0644]

index 405932e4b44c9f80632d8ba36a5e58ceaedff389..1a77fabf4d55bf7577d9f53817b79721f04b6886 100644 (file)
@@ -91,6 +91,12 @@ RUN /tmp/install-gifsicle
 ADD install-pngquant /tmp/install-pngquant
 RUN /tmp/install-pngquant
 
+# This tool allows us to disable huge page support for our current process
+# since the flag is preserved through forks and execs it can be used on any
+# process
+ADD thpoff.c /src/thpoff.c
+RUN gcc -o /usr/local/sbin/thpoff /src/thpoff.c && rm /src/thpoff.c
+
 # clean up for docker squash
 RUN   rm -fr /usr/share/man &&\
       rm -fr /usr/share/doc &&\
diff --git a/image/base/thpoff.c b/image/base/thpoff.c
new file mode 100644 (file)
index 0000000..3195319
--- /dev/null
@@ -0,0 +1,39 @@
+// PUBLIC DOMAIN CODE
+//
+// A tiny program that disable transparent huge pages on arbitrary processes
+// thpoff echo 1 : will run echo 1 with SET_THP_DISABLE true on the process
+#include <stdio.h>
+#include <sys/prctl.h>
+#include <unistd.h>
+#include <errno.h>
+
+int main( int argc, char **argv) {
+    if (argc < 2) {
+       fprintf(stderr, "ERROR: expecting at least 1 argument!\n");
+       return -1;
+    }
+    prctl(PR_SET_THP_DISABLE, 1, 0, 0, 0);
+
+    char* newargv[argc];
+    int i;
+
+    newargv[argc-1] = NULL;
+    for (i=1; i<argc; i++) {
+       newargv[i-1] = argv[i];
+    }
+
+    execvp(argv[1], newargv);
+
+    if (errno == ENOENT) {
+       fprintf(stderr, "ERROR: file not found\n");
+       return -1;
+    } else if (errno == EACCES) {
+       fprintf(stderr, "ERROR: can not run file\n");
+       return -1;
+    } else if (errno > 0) {
+       fprintf(stderr, "ERROR: %i errno while attempting to run file\n", errno);
+       return -1;
+    }
+
+    return 0;
+}