March 9, 2026 at 18:44, "Sun Jian" <[email protected] mailto:[email protected]?to=%22Sun%20Jian%22%20%3Csun.jian.kdev%40gmail.com%3E > wrote:
> > livepatch_trampoline relies on livepatch sysfs and livepatch-sample.ko. > When CONFIG_LIVEPATCH is disabled or the samples module isn't built, the > test fails with ENOENT and causes false failures in minimal CI configs. > > Skip the test when livepatch sysfs or the sample module is unavailable. > Also avoid writing to livepatch sysfs when it's not present. > > Signed-off-by: Sun Jian <[email protected]> > --- > v4: > - Drop redundant <errno.h> and <unistd.h> includes; both are already > included by test_progs.h (per Jiayuan Chen) > - Tested: ./test_progs -t livepatch_trampoline -vv (SKIP when > livepatch-sample.ko missing) > > v3: > - Skip on -ENOENT from load_livepatch() instead of duplicating module path > logic (suggested by Jiri Olsa) > - Tested: ./test_progs -t livepatch_trampoline (SKIP when > livepatch-sample.ko missing) > > v2: > - Skip when /sys/kernel/livepatch is missing > - Guard sysfs write in unload_livepatch() when enabled knob is absent > > v3: > https://lore.kernel.org/bpf/[email protected]/ > v2: > https://patchwork.kernel.org/project/netdevbpf/patch/[email protected]/ > v1: https://patchew.org/linux/[email protected]/ > > .../bpf/prog_tests/livepatch_trampoline.c | 20 +++++++++++++++++-- > 1 file changed, 18 insertions(+), 2 deletions(-) > > diff --git a/tools/testing/selftests/bpf/prog_tests/livepatch_trampoline.c > b/tools/testing/selftests/bpf/prog_tests/livepatch_trampoline.c > index 72aa5376c30e..0a12af924a99 100644 > --- a/tools/testing/selftests/bpf/prog_tests/livepatch_trampoline.c > +++ b/tools/testing/selftests/bpf/prog_tests/livepatch_trampoline.c > @@ -5,6 +5,8 @@ > #include "testing_helpers.h" > #include "livepatch_trampoline.skel.h" > > +#define LIVEPATCH_ENABLED_PATH > "/sys/kernel/livepatch/livepatch_sample/enabled" > + > static int load_livepatch(void) > { > char path[4096]; > @@ -19,7 +21,8 @@ static int load_livepatch(void) > static void unload_livepatch(void) > { > /* Disable the livepatch before unloading the module */ > - system("echo 0 > /sys/kernel/livepatch/livepatch_sample/enabled"); > + if (!access(LIVEPATCH_ENABLED_PATH, F_OK)) > + system("echo 0 > " LIVEPATCH_ENABLED_PATH); > > unload_module("livepatch_sample", env_verbosity > VERBOSE_NONE); > } > @@ -81,9 +84,22 @@ static void __test_livepatch_trampoline(bool fexit_first) > void test_livepatch_trampoline(void) > { > int retry_cnt = 0; > + int err; > + > + /* Skip if kernel was built without CONFIG_LIVEPATCH */ > + if (access("/sys/kernel/livepatch", F_OK)) { > + test__skip(); > + return; > + } > I think Jiri's suggestion in v2 means that you should drop the path check here and in unload_livepatch() and just keep checking -ENOENT. -ENOENT returned by load_livepatch() means the ko doesn't exist, which happens when either CONFIG_LIVEPATCH is disabled or livepatch_sample is not compiled. > retry: > - if (load_livepatch()) { > + err = load_livepatch(); > + if (err) { > + if (err == -ENOENT) { > + test__skip(); > + return; > + } > + > if (retry_cnt) { > ASSERT_OK(1, "load_livepatch"); > goto out; > > base-commit: 1f318b96cc84d7c2ab792fcc0bfd42a7ca890681 > -- > 2.43.0 >
