]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/bpf: Fix cgroup_xattr/read_cgroupfs_xattr
authorSong Liu <song@kernel.org>
Fri, 27 Jun 2025 19:12:21 +0000 (12:12 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 27 Jun 2025 21:34:08 +0000 (14:34 -0700)
cgroup_xattr/read_cgroupfs_xattr has two issues:

1. cgroup_xattr/read_cgroupfs_xattr messes up lo without creating a netns
   first. This causes issue with other tests.

   Fix this by using a different hook (lsm.s/file_open) and not messing
   with lo.

2. cgroup_xattr/read_cgroupfs_xattr sets up cgroups without proper
   mount namespaces.

   Fix this by using the existing cgroup helpers. A new helper
   set_cgroup_xattr() is added to set xattr on cgroup files.

Fixes: f4fba2d6d282 ("selftests/bpf: Add tests for bpf_cgroup_read_xattr")
Reported-by: Alexei Starovoitov <ast@kernel.org>
Closes: https://lore.kernel.org/bpf/CAADnVQ+iqMi2HEj_iH7hsx+XJAsqaMWqSDe4tzcGAnehFWA9Sw@mail.gmail.com/
Signed-off-by: Song Liu <song@kernel.org>
Tested-by: Eduard Zingerman <eddyz87@gmail.com>
Tested-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Link: https://lore.kernel.org/r/20250627191221.765921-1-song@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/cgroup_helpers.c
tools/testing/selftests/bpf/cgroup_helpers.h
tools/testing/selftests/bpf/prog_tests/cgroup_xattr.c
tools/testing/selftests/bpf/progs/read_cgroupfs_xattr.c

index e4535451322ef01a47887a4b4c91d851dde18124..15f6260148728dc6a00ca3de54fd81b711051e3f 100644 (file)
@@ -4,6 +4,7 @@
 #include <sys/mount.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/xattr.h>
 #include <linux/limits.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -318,6 +319,26 @@ int join_parent_cgroup(const char *relative_path)
        return join_cgroup_from_top(cgroup_path);
 }
 
+/**
+ * set_cgroup_xattr() - Set xattr on a cgroup dir
+ * @relative_path: The cgroup path, relative to the workdir, to set xattr
+ * @name: xattr name
+ * @value: xattr value
+ *
+ * This function set xattr on cgroup dir.
+ *
+ * On success, it returns 0, otherwise on failure it returns -1.
+ */
+int set_cgroup_xattr(const char *relative_path,
+                    const char *name,
+                    const char *value)
+{
+       char cgroup_path[PATH_MAX + 1];
+
+       format_cgroup_path(cgroup_path, relative_path);
+       return setxattr(cgroup_path, name, value, strlen(value) + 1, 0);
+}
+
 /**
  * __cleanup_cgroup_environment() - Delete temporary cgroups
  *
index 502845160d886a4c101a32b7587e6a447e01452b..182e1ac36c95dd3f16e4a99fafc366f72310bd6d 100644 (file)
@@ -26,6 +26,10 @@ int join_cgroup(const char *relative_path);
 int join_root_cgroup(void);
 int join_parent_cgroup(const char *relative_path);
 
+int set_cgroup_xattr(const char *relative_path,
+                    const char *name,
+                    const char *value);
+
 int setup_cgroup_environment(void);
 void cleanup_cgroup_environment(void);
 
index 87978a0f7eb7c07edd70f0306edf7928b703b065..e0dd966e4a3ef329531e4c7fbb1b7d637ff9ddd0 100644 (file)
 #include <string.h>
 #include <unistd.h>
 #include <sys/socket.h>
-#include <sys/xattr.h>
-
 #include <test_progs.h>
+#include "cgroup_helpers.h"
 
 #include "read_cgroupfs_xattr.skel.h"
 #include "cgroup_read_xattr.skel.h"
 
-#define CGROUP_FS_ROOT "/sys/fs/cgroup/"
-#define CGROUP_FS_PARENT CGROUP_FS_ROOT "foo/"
+#define CGROUP_FS_PARENT "foo/"
 #define CGROUP_FS_CHILD CGROUP_FS_PARENT "bar/"
-
-static int move_pid_to_cgroup(const char *cgroup_folder, pid_t pid)
-{
-       char filename[128];
-       char pid_str[64];
-       int procs_fd;
-       int ret;
-
-       snprintf(filename, sizeof(filename), "%scgroup.procs", cgroup_folder);
-       snprintf(pid_str, sizeof(pid_str), "%d", pid);
-
-       procs_fd = open(filename, O_WRONLY | O_APPEND);
-       if (!ASSERT_OK_FD(procs_fd, "open"))
-               return -1;
-
-       ret = write(procs_fd, pid_str, strlen(pid_str));
-       close(procs_fd);
-       if (!ASSERT_GT(ret, 0, "write cgroup.procs"))
-               return -1;
-       return 0;
-}
-
-static void reset_cgroups_and_lo(void)
-{
-       rmdir(CGROUP_FS_CHILD);
-       rmdir(CGROUP_FS_PARENT);
-       system("ip addr del 1.1.1.1/32 dev lo");
-       system("ip link set dev lo down");
-}
+#define TMP_FILE "/tmp/selftests_cgroup_xattr"
 
 static const char xattr_value_a[] = "bpf_selftest_value_a";
 static const char xattr_value_b[] = "bpf_selftest_value_b";
 static const char xattr_name[] = "user.bpf_test";
 
-static int setup_cgroups_and_lo(void)
-{
-       int err;
-
-       err = mkdir(CGROUP_FS_PARENT, 0755);
-       if (!ASSERT_OK(err, "mkdir 1"))
-               goto error;
-       err = mkdir(CGROUP_FS_CHILD, 0755);
-       if (!ASSERT_OK(err, "mkdir 2"))
-               goto error;
-
-       err = setxattr(CGROUP_FS_PARENT, xattr_name, xattr_value_a,
-                      strlen(xattr_value_a) + 1, 0);
-       if (!ASSERT_OK(err, "setxattr 1"))
-               goto error;
-
-       err = setxattr(CGROUP_FS_CHILD, xattr_name, xattr_value_b,
-                      strlen(xattr_value_b) + 1, 0);
-       if (!ASSERT_OK(err, "setxattr 2"))
-               goto error;
-
-       err = system("ip link set dev lo up");
-       if (!ASSERT_OK(err, "lo up"))
-               goto error;
-
-       err = system("ip addr add 1.1.1.1 dev lo");
-       if (!ASSERT_OK(err, "lo addr v4"))
-               goto error;
-
-       err = write_sysctl("/proc/sys/net/ipv4/ping_group_range", "0 0");
-       if (!ASSERT_OK(err, "write_sysctl"))
-               goto error;
-
-       return 0;
-error:
-       reset_cgroups_and_lo();
-       return err;
-}
-
 static void test_read_cgroup_xattr(void)
 {
-       struct sockaddr_in sa4 = {
-               .sin_family = AF_INET,
-               .sin_addr.s_addr = htonl(INADDR_LOOPBACK),
-       };
+       int tmp_fd, parent_cgroup_fd = -1, child_cgroup_fd = -1;
        struct read_cgroupfs_xattr *skel = NULL;
-       pid_t pid = gettid();
-       int sock_fd = -1;
-       int connect_fd = -1;
 
-       if (!ASSERT_OK(setup_cgroups_and_lo(), "setup_cgroups_and_lo"))
+       parent_cgroup_fd = test__join_cgroup(CGROUP_FS_PARENT);
+       if (!ASSERT_OK_FD(parent_cgroup_fd, "create parent cgroup"))
                return;
-       if (!ASSERT_OK(move_pid_to_cgroup(CGROUP_FS_CHILD, pid),
-                      "move_pid_to_cgroup"))
+       if (!ASSERT_OK(set_cgroup_xattr(CGROUP_FS_PARENT, xattr_name, xattr_value_a),
+                      "set parent xattr"))
+               goto out;
+
+       child_cgroup_fd = test__join_cgroup(CGROUP_FS_CHILD);
+       if (!ASSERT_OK_FD(child_cgroup_fd, "create child cgroup"))
+               goto out;
+       if (!ASSERT_OK(set_cgroup_xattr(CGROUP_FS_CHILD, xattr_name, xattr_value_b),
+                      "set child xattr"))
                goto out;
 
        skel = read_cgroupfs_xattr__open_and_load();
        if (!ASSERT_OK_PTR(skel, "read_cgroupfs_xattr__open_and_load"))
                goto out;
 
-       skel->bss->target_pid = pid;
+       skel->bss->target_pid = gettid();
 
        if (!ASSERT_OK(read_cgroupfs_xattr__attach(skel), "read_cgroupfs_xattr__attach"))
                goto out;
 
-       sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP);
-       if (!ASSERT_OK_FD(sock_fd, "sock create"))
-               goto out;
-
-       connect_fd = connect(sock_fd, &sa4, sizeof(sa4));
-       if (!ASSERT_OK_FD(connect_fd, "connect 1"))
-               goto out;
-       close(connect_fd);
+       tmp_fd = open(TMP_FILE, O_RDONLY | O_CREAT);
+       ASSERT_OK_FD(tmp_fd, "open tmp file");
+       close(tmp_fd);
 
        ASSERT_TRUE(skel->bss->found_value_a, "found_value_a");
        ASSERT_TRUE(skel->bss->found_value_b, "found_value_b");
 
 out:
-       close(connect_fd);
-       close(sock_fd);
+       close(child_cgroup_fd);
+       close(parent_cgroup_fd);
        read_cgroupfs_xattr__destroy(skel);
-       move_pid_to_cgroup(CGROUP_FS_ROOT, pid);
-       reset_cgroups_and_lo();
+       unlink(TMP_FILE);
 }
 
 void test_cgroup_xattr(void)
index 855f85fc5522b60c901b94db2fd07b4d194a5180..405adbe5e8b030abb44f71645e84f31e030cfabd 100644 (file)
@@ -17,8 +17,8 @@ static const char expected_value_b[] = "bpf_selftest_value_b";
 bool found_value_a;
 bool found_value_b;
 
-SEC("lsm.s/socket_connect")
-int BPF_PROG(test_socket_connect)
+SEC("lsm.s/file_open")
+int BPF_PROG(test_file_open)
 {
        u64 cgrp_id = bpf_get_current_cgroup_id();
        struct cgroup_subsys_state *css, *tmp;