* [RFC] eal: support systemd service convention for runtime directory @ 2021-12-23 23:39 Stephen Hemminger 2021-12-26 12:20 ` Morten Brørup ` (3 more replies) 0 siblings, 4 replies; 22+ messages in thread From: Stephen Hemminger @ 2021-12-23 23:39 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger 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 <stephen@networkplumber.org> --- lib/eal/linux/eal.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index 60b49248388e..e729c713b393 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -86,25 +86,26 @@ 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; - else - directory = fallback; + /* from RuntimeDirectory= see systemd.exec */ + directory = getenv("RUNTIME_DIRECTORY"); + if (directory == NULL) { + if (getuid() == 0) + directory = "/var/run"; + else { + directory = getenv("XDG_RUNTIME_DIR"); + if (directory == NULL) + directory = "/tmp"; + } } + /* create DPDK subdirectory under runtime dir */ ret = snprintf(tmp, sizeof(tmp), "%s/dpdk", directory); if (ret < 0 || ret == sizeof(tmp)) { -- 2.30.2 ^ permalink raw reply [flat|nested] 22+ messages in thread
* RE: [RFC] eal: support systemd service convention for runtime directory 2021-12-23 23:39 [RFC] eal: support systemd service convention for runtime directory Stephen Hemminger @ 2021-12-26 12:20 ` Morten Brørup 2022-01-05 18:01 ` [RFC] eal: remove size for eal_set_runtime_dir Stephen Hemminger 2022-01-07 12:07 ` [RFC] eal: support systemd service convention for runtime directory Bruce Richardson ` (2 subsequent siblings) 3 siblings, 1 reply; 22+ messages in thread From: Morten Brørup @ 2021-12-26 12:20 UTC (permalink / raw) To: Stephen Hemminger, dev > From: Stephen Hemminger [mailto:stephen@networkplumber.org] > Sent: Friday, 24 December 2021 00.39 > > 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 <stephen@networkplumber.org> > --- > lib/eal/linux/eal.c | 23 ++++++++++++----------- > 1 file changed, 12 insertions(+), 11 deletions(-) > > diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c > index 60b49248388e..e729c713b393 100644 > --- a/lib/eal/linux/eal.c > +++ b/lib/eal/linux/eal.c > @@ -86,25 +86,26 @@ 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; > - else > - directory = fallback; > + /* from RuntimeDirectory= see systemd.exec */ > + directory = getenv("RUNTIME_DIRECTORY"); > + if (directory == NULL) { > + if (getuid() == 0) > + directory = "/var/run"; > + else { > + directory = getenv("XDG_RUNTIME_DIR"); > + if (directory == NULL) > + directory = "/tmp"; > + } > } > + > /* create DPDK subdirectory under runtime dir */ > ret = snprintf(tmp, sizeof(tmp), "%s/dpdk", directory); > if (ret < 0 || ret == sizeof(tmp)) { > -- > 2.30.2 > Reviewed-by: Morten Brørup <mb@smartsharesystems.com> Also, while reviewing this, I stumbled across eal_set_runtime_dir() in eal_common_config.c, which I think should be fixed: int eal_set_runtime_dir(char *run_dir, size_t size) { size_t str_size; - str_size = strlcpy(runtime_dir, run_dir, size); - if (str_size >= size) { + str_size = strlcpy(runtime_dir, run_dir, sizeof(runtime_dir)); + if (str_size >= sizeof(runtime_dir)) { RTE_LOG(ERR, EAL, "Runtime directory string too long\n"); return -1; } return 0; } And I don't understand why size is passed as a parameter to eal_set_runtime_dir(). ^ permalink raw reply [flat|nested] 22+ messages in thread
* [RFC] eal: remove size for eal_set_runtime_dir 2021-12-26 12:20 ` Morten Brørup @ 2022-01-05 18:01 ` Stephen Hemminger 2022-01-05 20:04 ` Morten Brørup 0 siblings, 1 reply; 22+ messages in thread From: Stephen Hemminger @ 2022-01-05 18:01 UTC (permalink / raw) To: Morten Brørup; +Cc: dev, Stephen Hemminger The size argument to eal_set_runtime_dir is useless and was being used incorrectly in strlcpy. It worked only because all callers passed PATH_MAX which is same as sizeof the destination runtime_dir. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> Suggested-by: Morten Brørup <mb@smartsharesystems.com> --- lib/eal/common/eal_common_config.c | 7 ++----- lib/eal/common/eal_private.h | 4 +--- lib/eal/freebsd/eal.c | 2 +- lib/eal/linux/eal.c | 2 +- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/eal/common/eal_common_config.c b/lib/eal/common/eal_common_config.c index 1c4c4dd585d0..62a9d7a198db 100644 --- a/lib/eal/common/eal_common_config.c +++ b/lib/eal/common/eal_common_config.c @@ -29,12 +29,9 @@ rte_eal_get_runtime_dir(void) } int -eal_set_runtime_dir(char *run_dir, size_t size) +eal_set_runtime_dir(const char *run_dir) { - size_t str_size; - - str_size = strlcpy(runtime_dir, run_dir, size); - if (str_size >= size) { + if (strlcpy(runtime_dir, run_dir, PATH_MAX) >= PATH_MAX) { RTE_LOG(ERR, EAL, "Runtime directory string too long\n"); return -1; } diff --git a/lib/eal/common/eal_private.h b/lib/eal/common/eal_private.h index 36bcc0b5a492..734f1f334b69 100644 --- a/lib/eal/common/eal_private.h +++ b/lib/eal/common/eal_private.h @@ -681,13 +681,11 @@ eal_mem_set_dump(void *virt, size_t size, bool dump); * * @param run_dir * The new runtime directory path of DPDK - * @param size - * The size of the new runtime directory path in bytes. * @return * 0 on success, (-1) on failure. */ int -eal_set_runtime_dir(char *run_dir, size_t size); +eal_set_runtime_dir(const char *run_dir); /** * Get the internal configuration structure. diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c index a1cd2462db1b..503e276dc27f 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -123,7 +123,7 @@ eal_create_runtime_dir(void) return -1; } - if (eal_set_runtime_dir(run_dir, sizeof(run_dir))) + if (eal_set_runtime_dir(run_dir)) return -1; return 0; diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index 80ffe1c7f9d8..a73ff75f65c9 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -135,7 +135,7 @@ eal_create_runtime_dir(void) return -1; } - if (eal_set_runtime_dir(run_dir, sizeof(run_dir))) + if (eal_set_runtime_dir(run_dir)) return -1; return 0; -- 2.30.2 ^ permalink raw reply [flat|nested] 22+ messages in thread
* RE: [RFC] eal: remove size for eal_set_runtime_dir 2022-01-05 18:01 ` [RFC] eal: remove size for eal_set_runtime_dir Stephen Hemminger @ 2022-01-05 20:04 ` Morten Brørup 0 siblings, 0 replies; 22+ messages in thread From: Morten Brørup @ 2022-01-05 20:04 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev > From: Stephen Hemminger [mailto:stephen@networkplumber.org] > Sent: Wednesday, 5 January 2022 19.02 > > The size argument to eal_set_runtime_dir is useless and was > being used incorrectly in strlcpy. It worked only because > all callers passed PATH_MAX which is same as sizeof the destination > runtime_dir. > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> > Suggested-by: Morten Brørup <mb@smartsharesystems.com> > --- > lib/eal/common/eal_common_config.c | 7 ++----- > lib/eal/common/eal_private.h | 4 +--- > lib/eal/freebsd/eal.c | 2 +- > lib/eal/linux/eal.c | 2 +- > 4 files changed, 5 insertions(+), 10 deletions(-) > > diff --git a/lib/eal/common/eal_common_config.c > b/lib/eal/common/eal_common_config.c > index 1c4c4dd585d0..62a9d7a198db 100644 > --- a/lib/eal/common/eal_common_config.c > +++ b/lib/eal/common/eal_common_config.c > @@ -29,12 +29,9 @@ rte_eal_get_runtime_dir(void) > } > > int > -eal_set_runtime_dir(char *run_dir, size_t size) > +eal_set_runtime_dir(const char *run_dir) > { > - size_t str_size; > - > - str_size = strlcpy(runtime_dir, run_dir, size); > - if (str_size >= size) { > + if (strlcpy(runtime_dir, run_dir, PATH_MAX) >= PATH_MAX) { > RTE_LOG(ERR, EAL, "Runtime directory string too long\n"); > return -1; > } > diff --git a/lib/eal/common/eal_private.h > b/lib/eal/common/eal_private.h > index 36bcc0b5a492..734f1f334b69 100644 > --- a/lib/eal/common/eal_private.h > +++ b/lib/eal/common/eal_private.h > @@ -681,13 +681,11 @@ eal_mem_set_dump(void *virt, size_t size, bool > dump); > * > * @param run_dir > * The new runtime directory path of DPDK > - * @param size > - * The size of the new runtime directory path in bytes. > * @return > * 0 on success, (-1) on failure. > */ > int > -eal_set_runtime_dir(char *run_dir, size_t size); > +eal_set_runtime_dir(const char *run_dir); > > /** > * Get the internal configuration structure. > diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c > index a1cd2462db1b..503e276dc27f 100644 > --- a/lib/eal/freebsd/eal.c > +++ b/lib/eal/freebsd/eal.c > @@ -123,7 +123,7 @@ eal_create_runtime_dir(void) > return -1; > } > > - if (eal_set_runtime_dir(run_dir, sizeof(run_dir))) > + if (eal_set_runtime_dir(run_dir)) > return -1; > > return 0; > diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c > index 80ffe1c7f9d8..a73ff75f65c9 100644 > --- a/lib/eal/linux/eal.c > +++ b/lib/eal/linux/eal.c > @@ -135,7 +135,7 @@ eal_create_runtime_dir(void) > return -1; > } > > - if (eal_set_runtime_dir(run_dir, sizeof(run_dir))) > + if (eal_set_runtime_dir(run_dir)) > return -1; > > return 0; > -- > 2.30.2 > Reviewed-by: Morten Brørup<mb@smartsharesystems.com> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC] eal: support systemd service convention for runtime directory 2021-12-23 23:39 [RFC] eal: support systemd service convention for runtime directory Stephen Hemminger 2021-12-26 12:20 ` Morten Brørup @ 2022-01-07 12:07 ` Bruce Richardson 2022-02-02 21:03 ` Thomas Monjalon 2022-02-03 6:00 ` [PATCH 0/2] better support of configuring " Stephen Hemminger 2022-02-09 6:54 ` [PATCH v3 0/3] " Stephen Hemminger 3 siblings, 1 reply; 22+ messages in thread From: Bruce Richardson @ 2022-01-07 12:07 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev On Thu, Dec 23, 2021 at 03:39:07PM -0800, Stephen Hemminger wrote: > 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 <stephen@networkplumber.org> > --- > lib/eal/linux/eal.c | 23 ++++++++++++----------- > 1 file changed, 12 insertions(+), 11 deletions(-) > Seems reasonable. The path lookup for telemetry in the dpdk-telemetry.py script will need updating to match this. Otherwise: Acked-by: Bruce Richardson <bruce.richardson@intel.com> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC] eal: support systemd service convention for runtime directory 2022-01-07 12:07 ` [RFC] eal: support systemd service convention for runtime directory Bruce Richardson @ 2022-02-02 21:03 ` Thomas Monjalon 2022-02-02 21:07 ` Stephen Hemminger 0 siblings, 1 reply; 22+ messages in thread From: Thomas Monjalon @ 2022-02-02 21:03 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev, Bruce Richardson, david.marchand 07/01/2022 13:07, Bruce Richardson: > On Thu, Dec 23, 2021 at 03:39:07PM -0800, Stephen Hemminger wrote: > > 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 <stephen@networkplumber.org> > > --- > > lib/eal/linux/eal.c | 23 ++++++++++++----------- > > 1 file changed, 12 insertions(+), 11 deletions(-) > > > Seems reasonable. The path lookup for telemetry in the dpdk-telemetry.py > script will need updating to match this. Any followup? Do you plan a v2 to address comments from Morten and Bruce? ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC] eal: support systemd service convention for runtime directory 2022-02-02 21:03 ` Thomas Monjalon @ 2022-02-02 21:07 ` Stephen Hemminger 0 siblings, 0 replies; 22+ messages in thread From: Stephen Hemminger @ 2022-02-02 21:07 UTC (permalink / raw) To: Thomas Monjalon; +Cc: dev, Bruce Richardson, david.marchand On Wed, 02 Feb 2022 22:03:44 +0100 Thomas Monjalon <thomas@monjalon.net> wrote: > 07/01/2022 13:07, Bruce Richardson: > > On Thu, Dec 23, 2021 at 03:39:07PM -0800, Stephen Hemminger wrote: > > > 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 <stephen@networkplumber.org> > > > --- > > > lib/eal/linux/eal.c | 23 ++++++++++++----------- > > > 1 file changed, 12 insertions(+), 11 deletions(-) > > > > > Seems reasonable. The path lookup for telemetry in the dpdk-telemetry.py > > script will need updating to match this. > > Any followup? > Do you plan a v2 to address comments from Morten and Bruce? Was waiting for any more responses, not urgent ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 0/2] better support of configuring runtime directory 2021-12-23 23:39 [RFC] eal: support systemd service convention for runtime directory Stephen Hemminger 2021-12-26 12:20 ` Morten Brørup 2022-01-07 12:07 ` [RFC] eal: support systemd service convention for runtime directory Bruce Richardson @ 2022-02-03 6:00 ` Stephen Hemminger 2022-02-03 6:00 ` [PATCH 1/2] eal: remove size for eal_set_runtime_dir Stephen Hemminger ` (2 more replies) 2022-02-09 6:54 ` [PATCH v3 0/3] " Stephen Hemminger 3 siblings, 3 replies; 22+ messages in thread From: Stephen Hemminger @ 2022-02-03 6:00 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Found this while exploring running a DPDK service with systemd container environment. It helps if the place DPDK puts its runtime directory is configurable. This version supersedes earlier RFC and includes the feedback. Stephen Hemminger (2): eal: remove size for eal_set_runtime_dir eal: support systemd service convention for runtime directory lib/eal/common/eal_common_config.c | 7 ++----- lib/eal/common/eal_private.h | 4 +--- lib/eal/freebsd/eal.c | 2 +- lib/eal/linux/eal.c | 25 ++++++++++++++----------- usertools/dpdk-telemetry.py | 9 +++++++-- 5 files changed, 25 insertions(+), 22 deletions(-) -- 2.34.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 1/2] eal: remove size for eal_set_runtime_dir 2022-02-03 6:00 ` [PATCH 0/2] better support of configuring " Stephen Hemminger @ 2022-02-03 6:00 ` Stephen Hemminger 2022-02-03 6:00 ` [PATCH 2/2] eal: support systemd service convention for runtime directory Stephen Hemminger 2022-02-05 17:10 ` [PATCH v2 0/2] eal: support configuring " Stephen Hemminger 2 siblings, 0 replies; 22+ messages in thread From: Stephen Hemminger @ 2022-02-03 6:00 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger, talshn, Morten Brørup The size argument to eal_set_runtime_dir is useless and was being used incorrectly in strlcpy. It worked only because all callers passed PATH_MAX which is same as sizeof the destination runtime_dir. Note: this is an internal API so no user exposed change. Fixes: 57a2efb30477 ("eal: move OS common config objects") Cc: talshn@mellanox.com Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> Reviewed-by: Morten Brørup<mb@smartsharesystems.com> --- lib/eal/common/eal_common_config.c | 7 ++----- lib/eal/common/eal_private.h | 4 +--- lib/eal/freebsd/eal.c | 2 +- lib/eal/linux/eal.c | 2 +- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/eal/common/eal_common_config.c b/lib/eal/common/eal_common_config.c index 1c4c4dd585d0..62a9d7a198db 100644 --- a/lib/eal/common/eal_common_config.c +++ b/lib/eal/common/eal_common_config.c @@ -29,12 +29,9 @@ rte_eal_get_runtime_dir(void) } int -eal_set_runtime_dir(char *run_dir, size_t size) +eal_set_runtime_dir(const char *run_dir) { - size_t str_size; - - str_size = strlcpy(runtime_dir, run_dir, size); - if (str_size >= size) { + if (strlcpy(runtime_dir, run_dir, PATH_MAX) >= PATH_MAX) { RTE_LOG(ERR, EAL, "Runtime directory string too long\n"); return -1; } diff --git a/lib/eal/common/eal_private.h b/lib/eal/common/eal_private.h index 36bcc0b5a492..734f1f334b69 100644 --- a/lib/eal/common/eal_private.h +++ b/lib/eal/common/eal_private.h @@ -681,13 +681,11 @@ eal_mem_set_dump(void *virt, size_t size, bool dump); * * @param run_dir * The new runtime directory path of DPDK - * @param size - * The size of the new runtime directory path in bytes. * @return * 0 on success, (-1) on failure. */ int -eal_set_runtime_dir(char *run_dir, size_t size); +eal_set_runtime_dir(const char *run_dir); /** * Get the internal configuration structure. diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c index a1cd2462db1b..503e276dc27f 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -123,7 +123,7 @@ eal_create_runtime_dir(void) return -1; } - if (eal_set_runtime_dir(run_dir, sizeof(run_dir))) + if (eal_set_runtime_dir(run_dir)) return -1; return 0; diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index 60b49248388e..f2551c64b10c 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -137,7 +137,7 @@ eal_create_runtime_dir(void) return -1; } - if (eal_set_runtime_dir(run_dir, sizeof(run_dir))) + if (eal_set_runtime_dir(run_dir)) return -1; return 0; -- 2.34.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 2/2] eal: support systemd service convention for runtime directory 2022-02-03 6:00 ` [PATCH 0/2] better support of configuring " Stephen Hemminger 2022-02-03 6:00 ` [PATCH 1/2] eal: remove size for eal_set_runtime_dir Stephen Hemminger @ 2022-02-03 6:00 ` Stephen Hemminger 2022-02-03 11:37 ` Bruce Richardson 2022-02-05 17:10 ` [PATCH v2 0/2] eal: support configuring " Stephen Hemminger 2 siblings, 1 reply; 22+ messages in thread From: Stephen Hemminger @ 2022-02-03 6:00 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger, Bruce Richardson, Morten Brørup 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 <stephen@networkplumber.org> Acked-by: Bruce Richardson <bruce.richardson@intel.com> Reviewed-by: Morten Brørup <mb@smartsharesystems.com> --- lib/eal/linux/eal.c | 23 +++++++++++++---------- usertools/dpdk-telemetry.py | 9 +++++++-- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index f2551c64b10c..8a5723f3b3a7 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 Hierachy 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 5b3bf83356c3..a49f0e76d07b 100755 --- a/usertools/dpdk-telemetry.py +++ b/usertools/dpdk-telemetry.py @@ -75,9 +75,14 @@ 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 """ + run_dir = os.environ.get('RUNTIME_DIRECTORY') + if run_dir: + return run_dir 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 = '/var/run' + else: + run_dir = os.environ.get('XDG_RUNTIME_DIR', '/tmp')) + return os.path.join(run_dir, 'dpdk', fp) def list_fp(): -- 2.34.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/2] eal: support systemd service convention for runtime directory 2022-02-03 6:00 ` [PATCH 2/2] eal: support systemd service convention for runtime directory Stephen Hemminger @ 2022-02-03 11:37 ` Bruce Richardson 0 siblings, 0 replies; 22+ messages in thread From: Bruce Richardson @ 2022-02-03 11:37 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev, Morten Brørup On Wed, Feb 02, 2022 at 10:00:25PM -0800, Stephen Hemminger wrote: > 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 <stephen@networkplumber.org> > Acked-by: Bruce Richardson <bruce.richardson@intel.com> > Reviewed-by: Morten Brørup <mb@smartsharesystems.com> > --- > lib/eal/linux/eal.c | 23 +++++++++++++---------- > usertools/dpdk-telemetry.py | 9 +++++++-- > 2 files changed, 20 insertions(+), 12 deletions(-) > > diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c > index f2551c64b10c..8a5723f3b3a7 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 Hierachy 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 5b3bf83356c3..a49f0e76d07b 100755 > --- a/usertools/dpdk-telemetry.py > +++ b/usertools/dpdk-telemetry.py > @@ -75,9 +75,14 @@ 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 """ > + run_dir = os.environ.get('RUNTIME_DIRECTORY') > + if run_dir: > + return run_dir This bit doesn't seem to match the EAL changes above, since in the EAL code you are still appending the "dpdk" suffixes to the value returned from RUNTIME_DIRECTORY. > 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 = '/var/run' > + else: > + run_dir = os.environ.get('XDG_RUNTIME_DIR', '/tmp')) > + return os.path.join(run_dir, 'dpdk', fp) > > > def list_fp(): > -- > 2.34.1 > ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v2 0/2] eal: support configuring runtime directory 2022-02-03 6:00 ` [PATCH 0/2] better support of configuring " Stephen Hemminger 2022-02-03 6:00 ` [PATCH 1/2] eal: remove size for eal_set_runtime_dir Stephen Hemminger 2022-02-03 6:00 ` [PATCH 2/2] eal: support systemd service convention for runtime directory Stephen Hemminger @ 2022-02-05 17:10 ` Stephen Hemminger 2022-02-05 17:11 ` [PATCH v2 1/2] eal: remove size for eal_set_runtime_dir Stephen Hemminger ` (2 more replies) 2 siblings, 3 replies; 22+ messages in thread From: Stephen Hemminger @ 2022-02-05 17:10 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Found this while exploring running a DPDK service with systemd container environment. It helps if the place DPDK puts its runtime directory is configurable. v2 - fix dpdk_telemetry.py to use append dpdk Stephen Hemminger (2): eal: remove size for eal_set_runtime_dir eal: support systemd service convention for runtime directory lib/eal/common/eal_common_config.c | 7 ++----- lib/eal/common/eal_private.h | 4 +--- lib/eal/freebsd/eal.c | 2 +- lib/eal/linux/eal.c | 25 ++++++++++++++----------- usertools/dpdk-telemetry.py | 10 +++++++--- 5 files changed, 25 insertions(+), 23 deletions(-) -- 2.34.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v2 1/2] eal: remove size for eal_set_runtime_dir 2022-02-05 17:10 ` [PATCH v2 0/2] eal: support configuring " Stephen Hemminger @ 2022-02-05 17:11 ` Stephen Hemminger 2022-02-05 17:11 ` [PATCH v2 2/2] eal: support systemd service convention for runtime directory Stephen Hemminger 2022-02-08 4:43 ` [PATCH v2 0/2] eal: support configuring " Stephen Hemminger 2 siblings, 0 replies; 22+ messages in thread From: Stephen Hemminger @ 2022-02-05 17:11 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger, Morten Brørup The size argument to eal_set_runtime_dir is useless and was being used incorrectly in strlcpy. It worked only because all callers passed PATH_MAX which is same as sizeof the destination runtime_dir. Note: this is an internal API so no user exposed change. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> Reviewed-by: Morten Brørup<mb@smartsharesystems.com> --- lib/eal/common/eal_common_config.c | 7 ++----- lib/eal/common/eal_private.h | 4 +--- lib/eal/freebsd/eal.c | 2 +- lib/eal/linux/eal.c | 2 +- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/eal/common/eal_common_config.c b/lib/eal/common/eal_common_config.c index 1c4c4dd585d0..62a9d7a198db 100644 --- a/lib/eal/common/eal_common_config.c +++ b/lib/eal/common/eal_common_config.c @@ -29,12 +29,9 @@ rte_eal_get_runtime_dir(void) } int -eal_set_runtime_dir(char *run_dir, size_t size) +eal_set_runtime_dir(const char *run_dir) { - size_t str_size; - - str_size = strlcpy(runtime_dir, run_dir, size); - if (str_size >= size) { + if (strlcpy(runtime_dir, run_dir, PATH_MAX) >= PATH_MAX) { RTE_LOG(ERR, EAL, "Runtime directory string too long\n"); return -1; } diff --git a/lib/eal/common/eal_private.h b/lib/eal/common/eal_private.h index 36bcc0b5a492..734f1f334b69 100644 --- a/lib/eal/common/eal_private.h +++ b/lib/eal/common/eal_private.h @@ -681,13 +681,11 @@ eal_mem_set_dump(void *virt, size_t size, bool dump); * * @param run_dir * The new runtime directory path of DPDK - * @param size - * The size of the new runtime directory path in bytes. * @return * 0 on success, (-1) on failure. */ int -eal_set_runtime_dir(char *run_dir, size_t size); +eal_set_runtime_dir(const char *run_dir); /** * Get the internal configuration structure. diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c index a1cd2462db1b..503e276dc27f 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -123,7 +123,7 @@ eal_create_runtime_dir(void) return -1; } - if (eal_set_runtime_dir(run_dir, sizeof(run_dir))) + if (eal_set_runtime_dir(run_dir)) return -1; return 0; diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index 60b49248388e..f2551c64b10c 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -137,7 +137,7 @@ eal_create_runtime_dir(void) return -1; } - if (eal_set_runtime_dir(run_dir, sizeof(run_dir))) + if (eal_set_runtime_dir(run_dir)) return -1; return 0; -- 2.34.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v2 2/2] eal: support systemd service convention for runtime directory 2022-02-05 17:10 ` [PATCH v2 0/2] eal: support configuring " Stephen Hemminger 2022-02-05 17:11 ` [PATCH v2 1/2] eal: remove size for eal_set_runtime_dir Stephen Hemminger @ 2022-02-05 17:11 ` Stephen Hemminger 2022-02-08 4:43 ` [PATCH v2 0/2] eal: support configuring " Stephen Hemminger 2 siblings, 0 replies; 22+ messages in thread From: Stephen Hemminger @ 2022-02-05 17:11 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger, Bruce Richardson, Morten Brørup 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 <stephen@networkplumber.org> Acked-by: Bruce Richardson <bruce.richardson@intel.com> Reviewed-by: Morten Brørup <mb@smartsharesystems.com> --- 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 f2551c64b10c..8a5723f3b3a7 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 Hierachy 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 5b3bf83356c3..a81868a54789 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.34.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v2 0/2] eal: support configuring runtime directory 2022-02-05 17:10 ` [PATCH v2 0/2] eal: support configuring " Stephen Hemminger 2022-02-05 17:11 ` [PATCH v2 1/2] eal: remove size for eal_set_runtime_dir Stephen Hemminger 2022-02-05 17:11 ` [PATCH v2 2/2] eal: support systemd service convention for runtime directory Stephen Hemminger @ 2022-02-08 4:43 ` Stephen Hemminger 2022-02-08 10:48 ` Bruce Richardson 2 siblings, 1 reply; 22+ messages in thread From: Stephen Hemminger @ 2022-02-08 4:43 UTC (permalink / raw) To: Bruce Richardson; +Cc: dev On Sat, 5 Feb 2022 09:10:59 -0800 Stephen Hemminger <stephen@networkplumber.org> wrote: > Found this while exploring running a DPDK service with systemd > container environment. It helps if the place DPDK puts its runtime > directory is configurable. > > v2 - fix dpdk_telemetry.py to use append dpdk > > Stephen Hemminger (2): > eal: remove size for eal_set_runtime_dir > eal: support systemd service convention for runtime directory > > lib/eal/common/eal_common_config.c | 7 ++----- > lib/eal/common/eal_private.h | 4 +--- > lib/eal/freebsd/eal.c | 2 +- > lib/eal/linux/eal.c | 25 ++++++++++++++----------- > usertools/dpdk-telemetry.py | 10 +++++++--- > 5 files changed, 25 insertions(+), 23 deletions(-) > Bruce is it worth moving this (and the sysfs logic) from Linux only into unix/ directory and have common code with FreeBSD? ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v2 0/2] eal: support configuring runtime directory 2022-02-08 4:43 ` [PATCH v2 0/2] eal: support configuring " Stephen Hemminger @ 2022-02-08 10:48 ` Bruce Richardson 0 siblings, 0 replies; 22+ messages in thread From: Bruce Richardson @ 2022-02-08 10:48 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev On Mon, Feb 07, 2022 at 08:43:48PM -0800, Stephen Hemminger wrote: > On Sat, 5 Feb 2022 09:10:59 -0800 > Stephen Hemminger <stephen@networkplumber.org> wrote: > > > Found this while exploring running a DPDK service with systemd > > container environment. It helps if the place DPDK puts its runtime > > directory is configurable. > > > > v2 - fix dpdk_telemetry.py to use append dpdk > > > > Stephen Hemminger (2): > > eal: remove size for eal_set_runtime_dir > > eal: support systemd service convention for runtime directory > > > > lib/eal/common/eal_common_config.c | 7 ++----- > > lib/eal/common/eal_private.h | 4 +--- > > lib/eal/freebsd/eal.c | 2 +- > > lib/eal/linux/eal.c | 25 ++++++++++++++----------- > > usertools/dpdk-telemetry.py | 10 +++++++--- > > 5 files changed, 25 insertions(+), 23 deletions(-) > > > > Bruce is it worth moving this (and the sysfs logic) from > Linux only into unix/ directory and have common code with FreeBSD? > The "create_runtime_dir()" function is indeed a copy-paste between the two OS's so looks like it should be moved into a common unix implementation. ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v3 0/3] eal: support configuring runtime directory 2021-12-23 23:39 [RFC] eal: support systemd service convention for runtime directory Stephen Hemminger ` (2 preceding siblings ...) 2022-02-03 6:00 ` [PATCH 0/2] better support of configuring " Stephen Hemminger @ 2022-02-09 6:54 ` Stephen Hemminger 2022-02-09 6:54 ` [PATCH v3 1/3] eal: remove size for eal_set_runtime_dir Stephen Hemminger ` (3 more replies) 3 siblings, 4 replies; 22+ messages in thread From: Stephen Hemminger @ 2022-02-09 6:54 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Systemd defines a standard way for setting the runtime directory for services by setting RUNTIME_DIRECTORY in the environment, and this is a useful way to interact with DPDK internals. DPDK was already following the relevant standards but there can be time when running as a non-root user that the defaults don't work well. v3 - move to common code between Linux and FreeBSD there is lots more code that could be combined here in future. v2 - fix dpdk_telemetry.py to use append dpdk Stephen Hemminger (3): eal: remove size for eal_set_runtime_dir eal: support systemd service convention for runtime directory eal: move common filesystem setup code into one file lib/eal/common/eal_common_config.c | 7 +- lib/eal/common/eal_private.h | 4 +- lib/eal/freebsd/eal.c | 88 ----------------------- lib/eal/linux/eal.c | 87 ----------------------- lib/eal/unix/eal_filesystem.c | 110 +++++++++++++++++++++++++++++ lib/eal/unix/meson.build | 1 + usertools/dpdk-telemetry.py | 10 ++- 7 files changed, 121 insertions(+), 186 deletions(-) create mode 100644 lib/eal/unix/eal_filesystem.c -- 2.34.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v3 1/3] eal: remove size for eal_set_runtime_dir 2022-02-09 6:54 ` [PATCH v3 0/3] " Stephen Hemminger @ 2022-02-09 6:54 ` Stephen Hemminger 2022-02-09 6:54 ` [PATCH v3 2/3] eal: support systemd service convention for runtime directory Stephen Hemminger ` (2 subsequent siblings) 3 siblings, 0 replies; 22+ messages in thread From: Stephen Hemminger @ 2022-02-09 6:54 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger, Morten Brørup The size argument to eal_set_runtime_dir is useless and was being used incorrectly in strlcpy. It worked only because all callers passed PATH_MAX which is same as sizeof the destination runtime_dir. Note: this is an internal API so no user exposed change. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> Reviewed-by: Morten Brørup<mb@smartsharesystems.com> --- lib/eal/common/eal_common_config.c | 7 ++----- lib/eal/common/eal_private.h | 4 +--- lib/eal/freebsd/eal.c | 2 +- lib/eal/linux/eal.c | 2 +- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/eal/common/eal_common_config.c b/lib/eal/common/eal_common_config.c index 6d19aadb2057..3cef43a4f706 100644 --- a/lib/eal/common/eal_common_config.c +++ b/lib/eal/common/eal_common_config.c @@ -29,12 +29,9 @@ rte_eal_get_runtime_dir(void) } int -eal_set_runtime_dir(char *run_dir, size_t size) +eal_set_runtime_dir(const char *run_dir) { - size_t str_size; - - str_size = strlcpy(runtime_dir, run_dir, size); - if (str_size >= size) { + if (strlcpy(runtime_dir, run_dir, PATH_MAX) >= PATH_MAX) { RTE_LOG(ERR, EAL, "Runtime directory string too long\n"); return -1; } diff --git a/lib/eal/common/eal_private.h b/lib/eal/common/eal_private.h index 36bcc0b5a492..734f1f334b69 100644 --- a/lib/eal/common/eal_private.h +++ b/lib/eal/common/eal_private.h @@ -681,13 +681,11 @@ eal_mem_set_dump(void *virt, size_t size, bool dump); * * @param run_dir * The new runtime directory path of DPDK - * @param size - * The size of the new runtime directory path in bytes. * @return * 0 on success, (-1) on failure. */ int -eal_set_runtime_dir(char *run_dir, size_t size); +eal_set_runtime_dir(const char *run_dir); /** * Get the internal configuration structure. diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c index a1cd2462db1b..503e276dc27f 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -123,7 +123,7 @@ eal_create_runtime_dir(void) return -1; } - if (eal_set_runtime_dir(run_dir, sizeof(run_dir))) + if (eal_set_runtime_dir(run_dir)) return -1; return 0; diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index 9c8395ab14d0..e37372ac7305 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -137,7 +137,7 @@ eal_create_runtime_dir(void) return -1; } - if (eal_set_runtime_dir(run_dir, sizeof(run_dir))) + if (eal_set_runtime_dir(run_dir)) return -1; return 0; -- 2.34.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v3 2/3] eal: support systemd service convention for runtime directory 2022-02-09 6:54 ` [PATCH v3 0/3] " Stephen Hemminger 2022-02-09 6:54 ` [PATCH v3 1/3] eal: remove size for eal_set_runtime_dir Stephen Hemminger @ 2022-02-09 6:54 ` Stephen Hemminger 2022-02-09 6:54 ` [PATCH v3 3/3] eal: move common filesystem setup code into one file Stephen Hemminger 2022-02-09 18:14 ` [PATCH v3 0/3] eal: support configuring runtime directory Thomas Monjalon 3 siblings, 0 replies; 22+ messages in thread From: Stephen Hemminger @ 2022-02-09 6:54 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger, Bruce Richardson, Morten Brørup 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 <stephen@networkplumber.org> Acked-by: Bruce Richardson <bruce.richardson@intel.com> Reviewed-by: Morten Brørup <mb@smartsharesystems.com> --- 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 e37372ac7305..e9764f6c9f37 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 5b3bf83356c3..a81868a54789 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.34.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v3 3/3] eal: move common filesystem setup code into one file 2022-02-09 6:54 ` [PATCH v3 0/3] " Stephen Hemminger 2022-02-09 6:54 ` [PATCH v3 1/3] eal: remove size for eal_set_runtime_dir Stephen Hemminger 2022-02-09 6:54 ` [PATCH v3 2/3] eal: support systemd service convention for runtime directory Stephen Hemminger @ 2022-02-09 6:54 ` Stephen Hemminger 2022-02-09 9:18 ` Bruce Richardson 2022-02-09 18:14 ` [PATCH v3 0/3] eal: support configuring runtime directory Thomas Monjalon 3 siblings, 1 reply; 22+ messages in thread From: Stephen Hemminger @ 2022-02-09 6:54 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Both Linux and FreeBSD have same code for creating runtime directory and reading sysfs files. Put them in the new lib/eal/unix subdirectory. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- lib/eal/freebsd/eal.c | 88 --------------------------- lib/eal/linux/eal.c | 90 ---------------------------- lib/eal/unix/eal_filesystem.c | 110 ++++++++++++++++++++++++++++++++++ lib/eal/unix/meson.build | 1 + 4 files changed, 111 insertions(+), 178 deletions(-) create mode 100644 lib/eal/unix/eal_filesystem.c diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c index 503e276dc27f..eacd432ab621 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -72,62 +72,6 @@ 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"; - 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; - else - directory = fallback; - } - /* create DPDK subdirectory under runtime dir */ - ret = snprintf(tmp, sizeof(tmp), "%s/dpdk", directory); - if (ret < 0 || ret == sizeof(tmp)) { - RTE_LOG(ERR, EAL, "Error creating DPDK runtime path name\n"); - return -1; - } - - /* create prefix-specific subdirectory under DPDK runtime dir */ - ret = snprintf(run_dir, sizeof(run_dir), "%s/%s", - tmp, eal_get_hugefile_prefix()); - if (ret < 0 || ret == sizeof(run_dir)) { - RTE_LOG(ERR, EAL, "Error creating prefix-specific runtime path name\n"); - return -1; - } - - /* create the path if it doesn't exist. no "mkdir -p" here, so do it - * step by step. - */ - ret = mkdir(tmp, 0700); - if (ret < 0 && errno != EEXIST) { - RTE_LOG(ERR, EAL, "Error creating '%s': %s\n", - tmp, strerror(errno)); - return -1; - } - - ret = mkdir(run_dir, 0700); - if (ret < 0 && errno != EEXIST) { - RTE_LOG(ERR, EAL, "Error creating '%s': %s\n", - run_dir, strerror(errno)); - return -1; - } - - if (eal_set_runtime_dir(run_dir)) - return -1; - - return 0; -} int eal_clean_runtime_dir(void) @@ -138,38 +82,6 @@ eal_clean_runtime_dir(void) return 0; } -/* parse a sysfs (or other) file containing one integer value */ -int -eal_parse_sysfs_value(const char *filename, unsigned long *val) -{ - FILE *f; - char buf[BUFSIZ]; - char *end = NULL; - - if ((f = fopen(filename, "r")) == NULL) { - RTE_LOG(ERR, EAL, "%s(): cannot open sysfs value %s\n", - __func__, filename); - return -1; - } - - if (fgets(buf, sizeof(buf), f) == NULL) { - RTE_LOG(ERR, EAL, "%s(): cannot read sysfs value %s\n", - __func__, filename); - fclose(f); - return -1; - } - *val = strtoul(buf, &end, 0); - if ((buf[0] == '\0') || (end == NULL) || (*end != '\n')) { - RTE_LOG(ERR, EAL, "%s(): cannot parse sysfs value %s\n", - __func__, filename); - fclose(f); - return -1; - } - fclose(f); - return 0; -} - - /* create memory configuration in shared/mmap memory. Take out * a write lock on the memsegs, so we can auto-detect primary/secondary. * This means we never close the file while running (auto-close on exit). diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index e9764f6c9f37..b99cab25ce48 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -86,65 +86,6 @@ struct lcore_config lcore_config[RTE_MAX_LCORE]; /* used by rte_rdtsc() */ int rte_cycles_vmware_tsc_map; -int -eal_create_runtime_dir(void) -{ - const char *directory; - char run_dir[PATH_MAX]; - char tmp[PATH_MAX]; - int ret; - - /* 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 = 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)) { - RTE_LOG(ERR, EAL, "Error creating DPDK runtime path name\n"); - return -1; - } - - /* create prefix-specific subdirectory under DPDK runtime dir */ - ret = snprintf(run_dir, sizeof(run_dir), "%s/%s", - tmp, eal_get_hugefile_prefix()); - if (ret < 0 || ret == sizeof(run_dir)) { - RTE_LOG(ERR, EAL, "Error creating prefix-specific runtime path name\n"); - return -1; - } - - /* create the path if it doesn't exist. no "mkdir -p" here, so do it - * step by step. - */ - ret = mkdir(tmp, 0700); - if (ret < 0 && errno != EEXIST) { - RTE_LOG(ERR, EAL, "Error creating '%s': %s\n", - tmp, strerror(errno)); - return -1; - } - - ret = mkdir(run_dir, 0700); - if (ret < 0 && errno != EEXIST) { - RTE_LOG(ERR, EAL, "Error creating '%s': %s\n", - run_dir, strerror(errno)); - return -1; - } - - if (eal_set_runtime_dir(run_dir)) - return -1; - - return 0; -} int eal_clean_runtime_dir(void) @@ -232,37 +173,6 @@ eal_clean_runtime_dir(void) return -1; } -/* parse a sysfs (or other) file containing one integer value */ -int -eal_parse_sysfs_value(const char *filename, unsigned long *val) -{ - FILE *f; - char buf[BUFSIZ]; - char *end = NULL; - - if ((f = fopen(filename, "r")) == NULL) { - RTE_LOG(ERR, EAL, "%s(): cannot open sysfs value %s\n", - __func__, filename); - return -1; - } - - if (fgets(buf, sizeof(buf), f) == NULL) { - RTE_LOG(ERR, EAL, "%s(): cannot read sysfs value %s\n", - __func__, filename); - fclose(f); - return -1; - } - *val = strtoul(buf, &end, 0); - if ((buf[0] == '\0') || (end == NULL) || (*end != '\n')) { - RTE_LOG(ERR, EAL, "%s(): cannot parse sysfs value %s\n", - __func__, filename); - fclose(f); - return -1; - } - fclose(f); - return 0; -} - /* create memory configuration in shared/mmap memory. Take out * a write lock on the memsegs, so we can auto-detect primary/secondary. diff --git a/lib/eal/unix/eal_filesystem.c b/lib/eal/unix/eal_filesystem.c new file mode 100644 index 000000000000..4759651a9581 --- /dev/null +++ b/lib/eal/unix/eal_filesystem.c @@ -0,0 +1,110 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2018 Intel Corporation. + * Copyright(c) 2012-2014 6WIND S.A. + */ + +#include <errno.h> +#include <limits.h> +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> + +#include <rte_common.h> +#include <rte_log.h> + +#include "eal_private.h" +#include "eal_filesystem.h" + +int +eal_create_runtime_dir(void) +{ + const char *directory; + char run_dir[PATH_MAX]; + char tmp[PATH_MAX]; + int ret; + + /* 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 = 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)) { + RTE_LOG(ERR, EAL, "Error creating DPDK runtime path name\n"); + return -1; + } + + /* create prefix-specific subdirectory under DPDK runtime dir */ + ret = snprintf(run_dir, sizeof(run_dir), "%s/%s", + tmp, eal_get_hugefile_prefix()); + if (ret < 0 || ret == sizeof(run_dir)) { + RTE_LOG(ERR, EAL, "Error creating prefix-specific runtime path name\n"); + return -1; + } + + /* create the path if it doesn't exist. no "mkdir -p" here, so do it + * step by step. + */ + ret = mkdir(tmp, 0700); + if (ret < 0 && errno != EEXIST) { + RTE_LOG(ERR, EAL, "Error creating '%s': %s\n", + tmp, strerror(errno)); + return -1; + } + + ret = mkdir(run_dir, 0700); + if (ret < 0 && errno != EEXIST) { + RTE_LOG(ERR, EAL, "Error creating '%s': %s\n", + run_dir, strerror(errno)); + return -1; + } + + if (eal_set_runtime_dir(run_dir)) + return -1; + + return 0; +} +/* parse a sysfs (or other) file containing one integer value */ +int +eal_parse_sysfs_value(const char *filename, unsigned long *val) +{ + FILE *f; + char buf[BUFSIZ]; + char *end = NULL; + + if ((f = fopen(filename, "r")) == NULL) { + RTE_LOG(ERR, EAL, "%s(): cannot open sysfs value %s\n", + __func__, filename); + return -1; + } + + if (fgets(buf, sizeof(buf), f) == NULL) { + RTE_LOG(ERR, EAL, "%s(): cannot read sysfs value %s\n", + __func__, filename); + fclose(f); + return -1; + } + *val = strtoul(buf, &end, 0); + if ((buf[0] == '\0') || (end == NULL) || (*end != '\n')) { + RTE_LOG(ERR, EAL, "%s(): cannot parse sysfs value %s\n", + __func__, filename); + fclose(f); + return -1; + } + fclose(f); + return 0; +} diff --git a/lib/eal/unix/meson.build b/lib/eal/unix/meson.build index e3ecd3e956b2..a22ea7cabc46 100644 --- a/lib/eal/unix/meson.build +++ b/lib/eal/unix/meson.build @@ -6,5 +6,6 @@ sources += files( 'eal_unix_memory.c', 'eal_unix_timer.c', 'eal_firmware.c', + 'eal_filesystem.c', 'rte_thread.c', ) -- 2.34.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v3 3/3] eal: move common filesystem setup code into one file 2022-02-09 6:54 ` [PATCH v3 3/3] eal: move common filesystem setup code into one file Stephen Hemminger @ 2022-02-09 9:18 ` Bruce Richardson 0 siblings, 0 replies; 22+ messages in thread From: Bruce Richardson @ 2022-02-09 9:18 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev On Tue, Feb 08, 2022 at 10:54:03PM -0800, Stephen Hemminger wrote: > Both Linux and FreeBSD have same code for creating runtime > directory and reading sysfs files. Put them in the new lib/eal/unix > subdirectory. > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> LGTM, apart from one minor nit inline below. Acked-by: Bruce Richardson <bruce.richardson@intel.com> > --- > lib/eal/freebsd/eal.c | 88 --------------------------- > lib/eal/linux/eal.c | 90 ---------------------------- > lib/eal/unix/eal_filesystem.c | 110 ++++++++++++++++++++++++++++++++++ > lib/eal/unix/meson.build | 1 + > 4 files changed, 111 insertions(+), 178 deletions(-) > create mode 100644 lib/eal/unix/eal_filesystem.c > <snip> > + > + /* create the path if it doesn't exist. no "mkdir -p" here, so do it > + * step by step. > + */ > + ret = mkdir(tmp, 0700); > + if (ret < 0 && errno != EEXIST) { > + RTE_LOG(ERR, EAL, "Error creating '%s': %s\n", > + tmp, strerror(errno)); > + return -1; > + } > + > + ret = mkdir(run_dir, 0700); > + if (ret < 0 && errno != EEXIST) { > + RTE_LOG(ERR, EAL, "Error creating '%s': %s\n", > + run_dir, strerror(errno)); > + return -1; > + } > + > + if (eal_set_runtime_dir(run_dir)) > + return -1; > + > + return 0; > +} Missing a blank line here between the two functions. > +/* parse a sysfs (or other) file containing one integer value */ > +int > +eal_parse_sysfs_value(const char *filename, unsigned long *val) > +{ > + FILE *f; > + char buf[BUFSIZ]; > + char *end = NULL; > + > + if ((f = fopen(filename, "r")) == NULL) { > + RTE_LOG(ERR, EAL, "%s(): cannot open sysfs value %s\n", > + __func__, filename); > + return -1; > + } > + > + if (fgets(buf, sizeof(buf), f) == NULL) { > + RTE_LOG(ERR, EAL, "%s(): cannot read sysfs value %s\n", > + __func__, filename); > + fclose(f); > + return -1; > + } > + *val = strtoul(buf, &end, 0); > + if ((buf[0] == '\0') || (end == NULL) || (*end != '\n')) { > + RTE_LOG(ERR, EAL, "%s(): cannot parse sysfs value %s\n", > + __func__, filename); > + fclose(f); > + return -1; > + } > + fclose(f); > + return 0; > +} > diff --git a/lib/eal/unix/meson.build b/lib/eal/unix/meson.build > index e3ecd3e956b2..a22ea7cabc46 100644 > --- a/lib/eal/unix/meson.build > +++ b/lib/eal/unix/meson.build > @@ -6,5 +6,6 @@ sources += files( > 'eal_unix_memory.c', > 'eal_unix_timer.c', > 'eal_firmware.c', > + 'eal_filesystem.c', > 'rte_thread.c', > ) > -- > 2.34.1 > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v3 0/3] eal: support configuring runtime directory 2022-02-09 6:54 ` [PATCH v3 0/3] " Stephen Hemminger ` (2 preceding siblings ...) 2022-02-09 6:54 ` [PATCH v3 3/3] eal: move common filesystem setup code into one file Stephen Hemminger @ 2022-02-09 18:14 ` Thomas Monjalon 3 siblings, 0 replies; 22+ messages in thread From: Thomas Monjalon @ 2022-02-09 18:14 UTC (permalink / raw) To: Stephen Hemminger; +Cc: dev, bruce.richardson 09/02/2022 07:54, Stephen Hemminger: > Systemd defines a standard way for setting the runtime directory > for services by setting RUNTIME_DIRECTORY in the environment, > and this is a useful way to interact with DPDK internals. > DPDK was already following the relevant standards > but there can be time when running as a non-root user that > the defaults don't work well. Applied with suggested minor fix, thanks. ^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2022-02-09 18:15 UTC | newest] Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-12-23 23:39 [RFC] eal: support systemd service convention for runtime directory Stephen Hemminger 2021-12-26 12:20 ` Morten Brørup 2022-01-05 18:01 ` [RFC] eal: remove size for eal_set_runtime_dir Stephen Hemminger 2022-01-05 20:04 ` Morten Brørup 2022-01-07 12:07 ` [RFC] eal: support systemd service convention for runtime directory Bruce Richardson 2022-02-02 21:03 ` Thomas Monjalon 2022-02-02 21:07 ` Stephen Hemminger 2022-02-03 6:00 ` [PATCH 0/2] better support of configuring " Stephen Hemminger 2022-02-03 6:00 ` [PATCH 1/2] eal: remove size for eal_set_runtime_dir Stephen Hemminger 2022-02-03 6:00 ` [PATCH 2/2] eal: support systemd service convention for runtime directory Stephen Hemminger 2022-02-03 11:37 ` Bruce Richardson 2022-02-05 17:10 ` [PATCH v2 0/2] eal: support configuring " Stephen Hemminger 2022-02-05 17:11 ` [PATCH v2 1/2] eal: remove size for eal_set_runtime_dir Stephen Hemminger 2022-02-05 17:11 ` [PATCH v2 2/2] eal: support systemd service convention for runtime directory Stephen Hemminger 2022-02-08 4:43 ` [PATCH v2 0/2] eal: support configuring " Stephen Hemminger 2022-02-08 10:48 ` Bruce Richardson 2022-02-09 6:54 ` [PATCH v3 0/3] " Stephen Hemminger 2022-02-09 6:54 ` [PATCH v3 1/3] eal: remove size for eal_set_runtime_dir Stephen Hemminger 2022-02-09 6:54 ` [PATCH v3 2/3] eal: support systemd service convention for runtime directory Stephen Hemminger 2022-02-09 6:54 ` [PATCH v3 3/3] eal: move common filesystem setup code into one file Stephen Hemminger 2022-02-09 9:18 ` Bruce Richardson 2022-02-09 18:14 ` [PATCH v3 0/3] eal: support configuring runtime directory Thomas Monjalon
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).