There can be cases such as containers or other runtime environments
where DPDK may not be able to access the default runtime path.
This patch introduces DPDK_RUNTIME_DIR as an environment variable
to allow controlling and overriding the path.

The example we have is DPDK application running in an untrusted
systemd container. In this case, it is not root, and XDG_RUNTIME_DIR
is not set (since it is not a user application), and /tmp is
blocked. The correct place for this application is to use /run.

In any case, hard coded path assumptions are a problem.

Signed-off-by: Stephen Hemminger <step...@networkplumber.org>
---
 lib/librte_eal/linux/eal.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/lib/librte_eal/linux/eal.c b/lib/librte_eal/linux/eal.c
index 6c34ac890386..f2a5e73817d6 100644
--- a/lib/librte_eal/linux/eal.c
+++ b/lib/librte_eal/linux/eal.c
@@ -90,20 +90,26 @@ static const char *default_runtime_dir = "/var/run";
 int
 eal_create_runtime_dir(void)
 {
-       const char *directory = default_runtime_dir;
+       const char *directory;
        const char *xdg_runtime_dir = getenv("XDG_RUNTIME_DIR");
        const char *fallback = "/tmp";
        char run_dir[PATH_MAX];
        char tmp[PATH_MAX];
        int ret;
 
-       if (getuid() != 0) {
+       directory = getenv("DPDK_RUNTIME_DIR");
+       if (directory != NULL) {
+               RTE_LOG(DEBUG, EAL, "Using DPDK runtime directory: %s\n", 
directory);
+       } else if (getuid() == 0) {
+               directory = default_runtime_dir;
+       } else {
                /* try XDG path first, fall back to /tmp */
                if (xdg_runtime_dir != NULL)
                        directory = xdg_runtime_dir;
                else
                        directory = fallback;
        }
+
        /* create DPDK subdirectory under runtime dir */
        ret = snprintf(tmp, sizeof(tmp), "%s/dpdk", directory);
        if (ret < 0 || ret == sizeof(tmp)) {
-- 
2.30.1

Reply via email to