The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxcfs/pull/369

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
When LXCFS has a bug and provides wrong or inconsistent values user
often want to turn off virtualization until we have figured out a fix
and rollout an upgrade to reload the shared library. Allow them to
toggle between virtualization mode and non-virtualization mode by
sending SIGUSR2 to lxcfs:

 Kernel supports pidfds
 api_extensions:
 - cgroups
 - sys_cpu_online
 - proc_cpuinfo
 - proc_diskstats
 - proc_loadavg
 - proc_meminfo
 - proc_stat
 - proc_swaps
 - proc_uptime
 - shared_pidns
 - cpuview_daemon
 - loadavg_daemon
 - pidfds
 Switched into non-virtualization mode
 Switched into virtualization mode
 Switched into non-virtualization mode
 Switched into virtualization mode
 Switched into non-virtualization mode

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From a2a6f3f9c77ffd8920ed9de9fef9a0385d8a2863 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Sat, 14 Mar 2020 18:25:46 +0100
Subject: [PATCH 1/2] bindings: allow users to switch between virtualization
 and non-virtualization mode

When LXCFS has a bug and provides wrong or inconsistent values user
often want to turn off virtualization until we have figured out a fix
and rollout an upgrade to reload the shared library. Allow them to
toggle between virtualization mode and non-virtualization mode by
sending SIGUSR2 to lxcfs:

 Kernel supports pidfds
 api_extensions:
 - cgroups
 - sys_cpu_online
 - proc_cpuinfo
 - proc_diskstats
 - proc_loadavg
 - proc_meminfo
 - proc_stat
 - proc_swaps
 - proc_uptime
 - shared_pidns
 - cpuview_daemon
 - loadavg_daemon
 - pidfds
 Switched into non-virtualization mode
 Switched into virtualization mode
 Switched into non-virtualization mode
 Switched into virtualization mode
 Switched into non-virtualization mode

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/bindings.c | 45 +++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 41 insertions(+), 4 deletions(-)

diff --git a/src/bindings.c b/src/bindings.c
index fb3dcb7..80fb948 100644
--- a/src/bindings.c
+++ b/src/bindings.c
@@ -50,11 +50,12 @@
 #include "utils.h"
 
 static bool can_use_pidfd;
-static bool reload_successful;
+
+static volatile sig_atomic_t reload_successful;
 
 bool liblxcfs_functional(void)
 {
-       return reload_successful;
+       return reload_successful != 0;
 }
 
 /* Define pivot_root() if missing from the C library */
@@ -721,6 +722,39 @@ static bool cgfs_setup_controllers(void)
        return true;
 }
 
+static void sigusr2_handler(int signo, siginfo_t *info, void *extra)
+{
+       if (reload_successful) {
+               reload_successful = 0;
+
+               /* write() is async signal safe */
+               (void)write(STDERR_FILENO,
+                           "Switched into non-virtualization mode\n",
+                           STRLITERALLEN("Switched into non-virtualization 
mode\n"));
+       } else {
+               reload_successful = 1;
+
+               /* write() is async signal safe */
+               (void)write(STDERR_FILENO, "Switched into virtualization 
mode\n",
+                           STRLITERALLEN("Switched into virtualization 
mode\n"));
+       }
+}
+
+static int set_sigusr2_handler(void)
+{
+       int ret;
+       struct sigaction action = {
+               .sa_flags = SA_SIGINFO,
+               .sa_sigaction = sigusr2_handler,
+       };
+
+       ret = sigaction(SIGUSR2, &action, NULL);
+       if (ret)
+               return log_error_errno(-1, errno, "Failed to set SIGUSR2 signal 
handler");
+
+       return 0;
+}
+
 static void __attribute__((constructor)) lxcfs_init(void)
 {
        __do_close_prot_errno int init_ns = -EBADF, root_fd = -EBADF,
@@ -788,11 +822,14 @@ static void __attribute__((constructor)) lxcfs_init(void)
        else if (fchdir(root_fd) < 0)
                lxcfs_info("%s - Failed to change to root directory", 
strerror(errno));
 
-       reload_successful = true;
+       if (set_sigusr2_handler())
+               goto broken_upgrade;
+
+       reload_successful = 1;
        return;
 
 broken_upgrade:
-       reload_successful = false;
+       reload_successful = 0;
        lxcfs_info("Failed to run constructor %s to reload liblxcfs", __func__);
 }
 

From 3860bd92afbe11282e8b12ba02117e2c4f81678b Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Sat, 14 Mar 2020 18:35:45 +0100
Subject: [PATCH 2/2] test_proc: add SIGUSR2 virtualization switch tests

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 tests/main.sh   | 6 +++---
 tests/test_proc | 6 ++++++
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/tests/main.sh b/tests/main.sh
index 2b49510..944f610 100755
--- a/tests/main.sh
+++ b/tests/main.sh
@@ -8,7 +8,7 @@ set -eu
 
 # Run lxcfs testsuite
 export LXCFSDIR=$(mktemp -d)
-pidfile=$(mktemp)
+export PIDFILE=$(mktemp)
 
 cmdline=$(realpath $0)
 dirname=$(dirname ${cmdline})
@@ -26,7 +26,7 @@ cleanup() {
                umount -l ${LXCFSDIR}
                rmdir ${LXCFSDIR}
        fi
-       rm -f ${pidfile}
+       rm -f ${PIDFILE}
        if [ ${FAILED} -eq 1 ]; then
                echo "=> FAILED at $TESTCASE"
                exit 1
@@ -45,7 +45,7 @@ if [ -x ${lxcfs} ]; then
                export LD_LIBRARY_PATH="${topdir}/src/.libs/"
        fi
        echo "=> Spawning ${lxcfs} ${LXCFSDIR}"
-       ${lxcfs} -p ${pidfile} ${LXCFSDIR} &
+       ${lxcfs} -p ${PIDFILE} ${LXCFSDIR} &
        p=$!
 else
        pidof lxcfs
diff --git a/tests/test_proc b/tests/test_proc
index fbb38d4..97ed1dd 100755
--- a/tests/test_proc
+++ b/tests/test_proc
@@ -49,6 +49,12 @@ echo "==> Testing /proc/cpuinfo"
 [ "$(grep "^processor" ${LXCFSDIR}/proc/cpuinfo | wc -l)" = "1" ]
 grep -q "^processor.*0$" ${LXCFSDIR}/proc/cpuinfo || grep -q "^processor 0:.*" 
${LXCFSDIR}/proc/cpuinfo
 
+echo "==> Switching to non-virtualization mode"
+kill -USR2 $(cat ${PIDFILE})
+[ "$(grep "^processor" ${LXCFSDIR}/proc/cpuinfo | wc -l)" = "$(grep 
"^processor" /proc/cpuinfo | wc -l)" ]
+echo "==> Switching to virtualization mode"
+kill -USR2 $(cat ${PIDFILE})
+
 # Test stat
 echo "==> Testing /proc/stat"
 [ "$(grep "^cpu" ${LXCFSDIR}/proc/stat | wc -l)" = "2" ]
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to