[LTP] [PATCH] lib: tst_kconfig: Add runtime checks
Petr Vorel
pvorel@suse.cz
Thu Feb 5 18:47:56 CET 2026
Hi Cyril, Li,
Thanks!
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Few notes below.
> So far for CONFIG_*_NS.
> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
> ---
> lib/newlib_tests/test_kconfig.c | 1 +
> lib/tst_kconfig.c | 35 +++++++++++++++++++++++++++++++++
> lib/tst_ns_checks.h | 32 ++++++++++++++++++++++++++++++
> 3 files changed, 68 insertions(+)
> create mode 100644 lib/tst_ns_checks.h
> diff --git a/lib/newlib_tests/test_kconfig.c b/lib/newlib_tests/test_kconfig.c
> index cea36b5ee..ed2c4610a 100644
> --- a/lib/newlib_tests/test_kconfig.c
> +++ b/lib/newlib_tests/test_kconfig.c
> @@ -18,6 +18,7 @@ static const char *kconfigs[] = {
> "CONFIG_MMU & CONFIG_EXT4_FS=m",
> "CONFIG_EXT4_FS=m | CONFIG_MMU",
> "CONFIG_DEFAULT_HOSTNAME=\"(none)\"",
> + "CONFIG_USER_NS",
> NULL
> };
> diff --git a/lib/tst_kconfig.c b/lib/tst_kconfig.c
> index 9bcd57721..8d0f8ae3a 100644
> --- a/lib/tst_kconfig.c
> +++ b/lib/tst_kconfig.c
> @@ -16,6 +16,8 @@
> #include "tst_bool_expr.h"
> #include "tst_safe_stdio.h"
> +#include "tst_ns_checks.h"
nit: don't we want to have tst_kconfig_checks.h which would have all configs?
Sure it can be this way, but I tend to have less files with more content.
I would be even ok with having everything in tst_kconfig.c, but understand you
don't want it.
> +
> static int kconfig_skip_check(void)
> {
> char *skipped = getenv("KCONFIG_SKIP_CHECK");
> @@ -110,6 +112,37 @@ static void close_kconfig(FILE *fp)
> fclose(fp);
> }
> +static struct runtime_check {
> + const char *config;
> + bool (*runtime_check)(void);
> +} runtime_checks[] = {
> + {"CONFIG_USER_NS", tst_user_ns_enabled},
> + {"CONFIG_NET_NS", tst_net_ns_enabled},
> + {"CONFIG_PID_NS", tst_pid_ns_enabled},
> + {"CONFIG_MNT_NS", tst_mnt_ns_enabled},
> + {"CONFIG_IPC_NS", tst_ipc_ns_enabled},
> + {}
> +};
> +
> +static void runtime_check(struct tst_kconfig_var *var)
> +{
> + size_t i;
> +
> + for (i = 0; runtime_checks[i].config; i++) {
> + if (strcmp(runtime_checks[i].config, var->id))
> + continue;
> +
> + tst_res(TDEBUG, "Running runtime check for '%s'", var->id);
This will not work since Li's change:
aa5a6fcdcd ("lib: suppress early TDEBUG output before context initialization")
@Li I'm not sure what "unless explicitly enabled" means, but I guess we cannot
simple enable it for the test library (following patch). I vote to either revert
aa5a6fcdcd or change it (effectively revert it, but keep doc and the rest of the
code).
I understand having the output in each test is not ideal:
utsname01.c:39: TDEBUG: mmap((nil), 64, PROT_READ | PROT_WRITE(3), 33, -1, 0)
utsname01.c:40: TDEBUG: mmap((nil), 64, PROT_READ | PROT_WRITE(3), 33, -1, 0)
but better more output code than no code.
+++ lib/tst_test.c
@@ -492,16 +492,12 @@ void tst_res_(const char *file, const int lineno, int ttype,
/*
* Suppress TDEBUG output in these cases:
* 1. No context available (e.g., called before IPC initialization)
- * 2. Called from the library process, unless explicitly enabled
- * 3. Debug output is not enabled (context->tdebug == 0)
+ * 2. Debug output is not enabled (context->tdebug == 0)
*/
if (ttype == TDEBUG) {
if (!context)
return;
- if (context->lib_pid == getpid())
- return;
-
if (!context->tdebug)
return;
}
> +
> + if (!runtime_checks[i].runtime_check()) {
> + tst_res(TINFO,
> + "%s=%c present but disabled at runtime",
> + var->id, var->choice);
> + var->choice = 'n';
> + }
> + }
> +}
> +
> static inline int kconfig_parse_line(const char *line,
> struct tst_kconfig_var *vars,
> unsigned int vars_len)
> @@ -183,9 +216,11 @@ out:
> switch (val[0]) {
> case 'y':
> vars[i].choice = 'y';
> + runtime_check(&vars[i]);
> return 1;
> case 'm':
> vars[i].choice = 'm';
> + runtime_check(&vars[i]);
> return 1;
> }
> }
> diff --git a/lib/tst_ns_checks.h b/lib/tst_ns_checks.h
> new file mode 100644
> index 000000000..743d3d09d
> --- /dev/null
> +++ b/lib/tst_ns_checks.h
> @@ -0,0 +1,32 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
nit: please use /* */ otherwise checkpatch complains.
/* SPDX-License-Identifier: GPL-2.0-or-later */
Kind regards,
Petr
> +/*
> + * Copyright (c) 2026 Cyril Hrubis <chrubis@suse.cz>
> + */
> +
> +#include <unistd.h>
> +#include <stdbool.h>
> +
> +static inline bool tst_user_ns_enabled(void)
> +{
> + return access("/proc/self/ns/user", F_OK) == 0;
> +}
> +
> +static inline bool tst_net_ns_enabled(void)
> +{
> + return access("/proc/self/ns/net", F_OK) == 0;
> +}
> +
> +static inline bool tst_pid_ns_enabled(void)
> +{
> + return access("/proc/self/ns/pid", F_OK) == 0;
> +}
> +
> +static inline bool tst_mnt_ns_enabled(void)
> +{
> + return access("/proc/self/ns/mnt", F_OK) == 0;
> +}
> +
> +static inline bool tst_ipc_ns_enabled(void)
> +{
> + return access("/proc/self/ns/ipc", F_OK) == 0;
> +}
More information about the ltp
mailing list