Skip to content

Commit

Permalink
selftests/bpf: Refactor out some functions in ns_current_pid_tgid test
Browse files Browse the repository at this point in the history
[ Upstream commit 4d4bd29 ]

Refactor some functions in both user space code and bpf program
as these functions are used by later cgroup/sk_msg tests.
Another change is to mark tp program optional loading as later
patches will use optional loading as well since they have quite
different attachment and testing logic.

There is no functionality change.

Signed-off-by: Yonghong Song <[email protected]>
Signed-off-by: Andrii Nakryiko <[email protected]>
Link: https://lore.kernel.org/bpf/[email protected]
Stable-dep-of: 21f0b0a ("selftests/bpf: Fix include of <sys/fcntl.h>")
Signed-off-by: Sasha Levin <[email protected]>
  • Loading branch information
Yonghong Song authored and gregkh committed Oct 4, 2024
1 parent d6e16c3 commit 17536f3
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 22 deletions.
53 changes: 34 additions & 19 deletions tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,30 +16,46 @@
#define STACK_SIZE (1024 * 1024)
static char child_stack[STACK_SIZE];

static int test_current_pid_tgid(void *args)
static int get_pid_tgid(pid_t *pid, pid_t *tgid,
struct test_ns_current_pid_tgid__bss *bss)
{
struct test_ns_current_pid_tgid__bss *bss;
struct test_ns_current_pid_tgid *skel;
int ret = -1, err;
pid_t tgid, pid;
struct stat st;
int err;

skel = test_ns_current_pid_tgid__open_and_load();
if (!ASSERT_OK_PTR(skel, "test_ns_current_pid_tgid__open_and_load"))
goto out;

pid = syscall(SYS_gettid);
tgid = getpid();
*pid = syscall(SYS_gettid);
*tgid = getpid();

err = stat("/proc/self/ns/pid", &st);
if (!ASSERT_OK(err, "stat /proc/self/ns/pid"))
goto cleanup;
return err;

bss = skel->bss;
bss->dev = st.st_dev;
bss->ino = st.st_ino;
bss->user_pid = 0;
bss->user_tgid = 0;
return 0;
}

static int test_current_pid_tgid_tp(void *args)
{
struct test_ns_current_pid_tgid__bss *bss;
struct test_ns_current_pid_tgid *skel;
int ret = -1, err;
pid_t tgid, pid;

skel = test_ns_current_pid_tgid__open();
if (!ASSERT_OK_PTR(skel, "test_ns_current_pid_tgid__open"))
return ret;

bpf_program__set_autoload(skel->progs.tp_handler, true);

err = test_ns_current_pid_tgid__load(skel);
if (!ASSERT_OK(err, "test_ns_current_pid_tgid__load"))
goto cleanup;

bss = skel->bss;
if (get_pid_tgid(&pid, &tgid, bss))
goto cleanup;

err = test_ns_current_pid_tgid__attach(skel);
if (!ASSERT_OK(err, "test_ns_current_pid_tgid__attach"))
Expand All @@ -55,20 +71,19 @@ static int test_current_pid_tgid(void *args)

cleanup:
test_ns_current_pid_tgid__destroy(skel);
out:
return ret;
}

static void test_ns_current_pid_tgid_new_ns(void)
static void test_ns_current_pid_tgid_new_ns(int (*fn)(void *), void *arg)
{
int wstatus;
pid_t cpid;

/* Create a process in a new namespace, this process
* will be the init process of this new namespace hence will be pid 1.
*/
cpid = clone(test_current_pid_tgid, child_stack + STACK_SIZE,
CLONE_NEWPID | SIGCHLD, NULL);
cpid = clone(fn, child_stack + STACK_SIZE,
CLONE_NEWPID | SIGCHLD, arg);

if (!ASSERT_NEQ(cpid, -1, "clone"))
return;
Expand All @@ -84,7 +99,7 @@ static void test_ns_current_pid_tgid_new_ns(void)
void serial_test_ns_current_pid_tgid(void)
{
if (test__start_subtest("root_ns_tp"))
test_current_pid_tgid(NULL);
test_current_pid_tgid_tp(NULL);
if (test__start_subtest("new_ns_tp"))
test_ns_current_pid_tgid_new_ns();
test_ns_current_pid_tgid_new_ns(test_current_pid_tgid_tp, NULL);
}
10 changes: 7 additions & 3 deletions tools/testing/selftests/bpf/progs/test_ns_current_pid_tgid.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,21 @@ __u64 user_tgid = 0;
__u64 dev = 0;
__u64 ino = 0;

SEC("tracepoint/syscalls/sys_enter_nanosleep")
int handler(const void *ctx)
static void get_pid_tgid(void)
{
struct bpf_pidns_info nsdata;

if (bpf_get_ns_current_pid_tgid(dev, ino, &nsdata, sizeof(struct bpf_pidns_info)))
return 0;
return;

user_pid = nsdata.pid;
user_tgid = nsdata.tgid;
}

SEC("?tracepoint/syscalls/sys_enter_nanosleep")
int tp_handler(const void *ctx)
{
get_pid_tgid();
return 0;
}

Expand Down

0 comments on commit 17536f3

Please sign in to comment.