[lxc-devel] [lxcfs/master] option to disable swap in meminfo

dmaj on Github lxc-bot at linuxcontainers.org
Mon Feb 18 05:27:13 UTC 2019


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 1606 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190217/37c4c1f4/attachment.bin>
-------------- next part --------------
From fe2549f18f95abd42bf412887e595a5de675f3e0 Mon Sep 17 00:00:00 2001
From: dm <dm at localhost>
Date: Mon, 18 Feb 2019 06:17:30 +0100
Subject: [PATCH] option to disable swap in meminfo

Signed-off-by: Dieter Maier <dma at web.de>
---
 README.md  | 17 +++++++++++++++++
 bindings.c | 35 +++++++++++++++++++++++++----------
 bindings.h |  4 ++++
 lxcfs.c    | 20 ++++++++++++++++----
 4 files changed, 62 insertions(+), 14 deletions(-)

diff --git a/README.md b/README.md
index 4c1434a..93e7b37 100644
--- a/README.md
+++ b/README.md
@@ -60,3 +60,20 @@ send `SIGUSR1` to the pid of the running `LXCFS` process. This can be as simple
 as doing:
 
     kill -s USR1 $(pidof lxcfs)
+    
+## Using with Docker
+
+```
+docker run -it -m 256m --memory-swap 256m \
+      -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
+      -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
+      -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
+      -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
+      -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
+      -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
+      ubuntu:18.04 /bin/bash
+ ```
+ 
+ In a system with swap enabled, the parameter "-n" can be used to set all values in "meminfo" that refer to the swap to 0.
+ 
+ sudo lxcfs -u /var/lib/lxcfs
diff --git a/bindings.c b/bindings.c
index 097ca81..a90f349 100644
--- a/bindings.c
+++ b/bindings.c
@@ -3437,6 +3437,7 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset,
 		struct fuse_file_info *fi)
 {
 	struct fuse_context *fc = fuse_get_context();
+	struct lxcfs_opts *opts = (struct lxcfs_opts *) fuse_get_context()->private_data;
 	struct file_info *d = (struct file_info *)fi->fh;
 	char *cg;
 	char *memusage_str = NULL, *memstat_str = NULL,
@@ -3517,18 +3518,32 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset,
 		} else if (startswith(line, "MemAvailable:")) {
 			snprintf(lbuf, 100, "MemAvailable:   %8lu kB\n", memlimit - memusage + cached);
 			printme = lbuf;
-		} else if (startswith(line, "SwapTotal:") && memswlimit > 0) {
-			sscanf(line+sizeof("SwapTotal:")-1, "%lu", &hostswtotal);
-			if (hostswtotal < memswlimit)
-				memswlimit = hostswtotal;
-			snprintf(lbuf, 100, "SwapTotal:      %8lu kB\n", memswlimit);
-			printme = lbuf;
-		} else if (startswith(line, "SwapFree:") && memswlimit > 0 && memswusage > 0) {
-			unsigned long swaptotal = memswlimit,
+		} else if (startswith(line, "SwapTotal:")) {
+                        if (memswlimit > 0) {
+                            sscanf(line+sizeof("SwapTotal:")-1, "%lu", &hostswtotal);
+                            if (hostswtotal < memswlimit)
+                                    memswlimit = hostswtotal;
+                            snprintf(lbuf, 100, "SwapTotal:      %8lu kB\n", memswlimit);
+                            printme = lbuf;
+                        }
+                        if (opts->swap_off == true) {
+                            memswlimit = 0;
+                            snprintf(lbuf, 100, "SwapTotal:      %8lu kB\n", memswlimit);
+                            printme = lbuf;
+                        }
+		} else if (startswith(line, "SwapFree:")) {
+                        if (memswlimit > 0 && memswusage > 0) {
+                            unsigned long swaptotal = memswlimit,
 					swapusage = memswusage - memusage,
 					swapfree = swapusage < swaptotal ? swaptotal - swapusage : 0;
-			snprintf(lbuf, 100, "SwapFree:       %8lu kB\n", swapfree);
-			printme = lbuf;
+                            snprintf(lbuf, 100, "SwapFree:       %8lu kB\n", swapfree);
+                            printme = lbuf;
+                        }
+                        if (opts->swap_off == true) {
+                            unsigned long swapfree = 0;
+                            snprintf(lbuf, 100, "SwapFree:       %8lu kB\n", swapfree);
+                            printme = lbuf;
+                        }
 		} else if (startswith(line, "Slab:")) {
 			snprintf(lbuf, 100, "Slab:        %8lu kB\n", 0UL);
 			printme = lbuf;
diff --git a/bindings.h b/bindings.h
index f1a4627..2f76861 100644
--- a/bindings.h
+++ b/bindings.h
@@ -7,6 +7,10 @@
 #define BASEDIR RUNTIME_PATH "/lxcfs/controllers"
 #define ROOTDIR RUNTIME_PATH "/lxcfs/root"
 
+struct lxcfs_opts {
+    bool swap_off;
+};
+
 extern int cg_write(const char *path, const char *buf, size_t size, off_t offset,
 	     struct fuse_file_info *fi);
 extern int cg_mkdir(const char *path, mode_t mode);
diff --git a/lxcfs.c b/lxcfs.c
index 76b3ea2..953266b 100644
--- a/lxcfs.c
+++ b/lxcfs.c
@@ -792,9 +792,10 @@ static void usage()
 {
 	fprintf(stderr, "Usage:\n");
 	fprintf(stderr, "\n");
-	fprintf(stderr, "lxcfs [-f|-d] -l [-p pidfile] mountpoint\n");
+	fprintf(stderr, "lxcfs [-f|-d] -u -l -n [-p pidfile] mountpoint\n");
 	fprintf(stderr, "  -f running foreground by default; -d enable debug output \n");
 	fprintf(stderr, "  -l use loadavg \n");
+        fprintf(stderr, "  -u no swap \n");
 	fprintf(stderr, "  Default pidfile is %s/lxcfs.pid\n", RUNTIME_PATH);
 	fprintf(stderr, "lxcfs -h\n");
 	exit(1);
@@ -903,7 +904,15 @@ int main(int argc, char *argv[])
 	 */
 	int nargs = 5, cnt = 0;
 	char *newargv[6];
-
+	
+        struct lxcfs_opts *opts;
+	opts = malloc(sizeof(struct lxcfs_opts));
+	if (opts == NULL) {
+		fprintf(stderr, "Error setting options: %m\n");
+		goto out;
+	}
+        opts->swap_off = false;
+        
 	/* accomodate older init scripts */
 	swallow_arg(&argc, argv, "-s");
 	swallow_arg(&argc, argv, "-f");
@@ -911,6 +920,9 @@ int main(int argc, char *argv[])
 	if (swallow_arg(&argc, argv, "-l")) {
 		load_use = true;
 	}
+        if (swallow_arg(&argc, argv, "-u")) {
+		opts->swap_off = true;
+	}
 	if (swallow_option(&argc, argv, "-o", &v)) {
 		/* Parse multiple values */
 		for (; (token = strtok_r(v, ",", &saveptr)); v = NULL) {
@@ -929,7 +941,7 @@ int main(int argc, char *argv[])
 	}
 	if (swallow_option(&argc, argv, "-p", &v))
 		pidfile = v;
-
+        
 	if (argc == 2  && strcmp(argv[1], "--version") == 0) {
 		fprintf(stderr, "%s\n", VERSION);
 		exit(EXIT_SUCCESS);
@@ -967,7 +979,7 @@ int main(int argc, char *argv[])
 	if (load_use && start_loadavg() != 0)
 		goto out;
 
-	if (!fuse_main(nargs, newargv, &lxcfs_ops, NULL))
+	if (!fuse_main(nargs, newargv, &lxcfs_ops, opts))
 		ret = EXIT_SUCCESS;
 	if (load_use)
 		stop_loadavg();


More information about the lxc-devel mailing list