From 1835a22f342f23ae31e1fd778a997139ae4d2ca9 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Tue, 8 Feb 2022 22:54:02 -0800 Subject: [PATCH] support systemd service convention for runtime directory MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Systemd.exec supports configuring the runtime directory of a service via RuntimeDirectory=. This creates the directory with the necessary permissions which actual service may not have if running in container. The change to DPDK is to look for the environment RUNTIME_DIRECTORY first and use that in preference to the fallback alternatives. Signed-off-by: Stephen Hemminger Acked-by: Bruce Richardson Reviewed-by: Morten Brørup --- lib/eal/linux/eal.c | 23 +++++++++++++---------- usertools/dpdk-telemetry.py | 10 +++++++--- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index e37372ac73..e9764f6c9f 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -86,25 +86,28 @@ struct lcore_config lcore_config[RTE_MAX_LCORE]; /* used by rte_rdtsc() */ int rte_cycles_vmware_tsc_map; -static const char *default_runtime_dir = "/var/run"; - int eal_create_runtime_dir(void) { - const char *directory = default_runtime_dir; - const char *xdg_runtime_dir = getenv("XDG_RUNTIME_DIR"); - const char *fallback = "/tmp"; + const char *directory; char run_dir[PATH_MAX]; char tmp[PATH_MAX]; int ret; - if (getuid() != 0) { - /* try XDG path first, fall back to /tmp */ - if (xdg_runtime_dir != NULL) - directory = xdg_runtime_dir; + /* from RuntimeDirectory= see systemd.exec */ + directory = getenv("RUNTIME_DIRECTORY"); + if (directory == NULL) { + /* + * Used standard convention defined in + * XDG Base Directory Specification and + * Filesystem Hierarchy Standard. + */ + if (getuid() == 0) + directory = "/var/run"; else - directory = fallback; + directory = getenv("XDG_RUNTIME_DIR") ? : "/tmp"; } + /* create DPDK subdirectory under runtime dir */ ret = snprintf(tmp, sizeof(tmp), "%s/dpdk", directory); if (ret < 0 || ret == sizeof(tmp)) { diff --git a/usertools/dpdk-telemetry.py b/usertools/dpdk-telemetry.py index 5b3bf83356..a81868a547 100755 --- a/usertools/dpdk-telemetry.py +++ b/usertools/dpdk-telemetry.py @@ -75,9 +75,13 @@ def print_socket_options(prefix, paths): def get_dpdk_runtime_dir(fp): """ Using the same logic as in DPDK's EAL, get the DPDK runtime directory based on the file-prefix and user """ - if (os.getuid() == 0): - return os.path.join('/var/run/dpdk', fp) - return os.path.join(os.environ.get('XDG_RUNTIME_DIR', '/tmp'), 'dpdk', fp) + run_dir = os.environ.get('RUNTIME_DIRECTORY') + if not run_dir: + if (os.getuid() == 0): + run_dir = '/var/run' + else: + run_dir = os.environ.get('XDG_RUNTIME_DIR', '/tmp') + return os.path.join(run_dir, 'dpdk', fp) def list_fp(): -- 2.39.5