Commit 0b0bb453 authored by Jiri Olsa's avatar Jiri Olsa Committed by Andrii Nakryiko

selftests/bpf: Add child argument to spawn_child function

Adding child argument to spawn_child function to allow
to create multiple children in following change.
Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20240905115124.1503998-3-jolsa@kernel.org
parent 900f362e
...@@ -68,29 +68,27 @@ static void kick_child(struct child *child) ...@@ -68,29 +68,27 @@ static void kick_child(struct child *child)
fflush(NULL); fflush(NULL);
} }
static struct child *spawn_child(void) static int spawn_child(struct child *child)
{ {
static struct child child; int err, c;
int err;
int c;
/* pipe to notify child to execute the trigger functions */ /* pipe to notify child to execute the trigger functions */
if (pipe(child.go)) if (pipe(child->go))
return NULL; return -1;
child.pid = child.tid = fork(); child->pid = child->tid = fork();
if (child.pid < 0) { if (child->pid < 0) {
release_child(&child); release_child(child);
errno = EINVAL; errno = EINVAL;
return NULL; return -1;
} }
/* child */ /* child */
if (child.pid == 0) { if (child->pid == 0) {
close(child.go[1]); close(child->go[1]);
/* wait for parent's kick */ /* wait for parent's kick */
err = read(child.go[0], &c, 1); err = read(child->go[0], &c, 1);
if (err != 1) if (err != 1)
exit(err); exit(err);
...@@ -102,7 +100,7 @@ static struct child *spawn_child(void) ...@@ -102,7 +100,7 @@ static struct child *spawn_child(void)
exit(errno); exit(errno);
} }
return &child; return 0;
} }
static void *child_thread(void *ctx) static void *child_thread(void *ctx)
...@@ -131,39 +129,38 @@ static void *child_thread(void *ctx) ...@@ -131,39 +129,38 @@ static void *child_thread(void *ctx)
pthread_exit(&err); pthread_exit(&err);
} }
static struct child *spawn_thread(void) static int spawn_thread(struct child *child)
{ {
static struct child child;
int c, err; int c, err;
/* pipe to notify child to execute the trigger functions */ /* pipe to notify child to execute the trigger functions */
if (pipe(child.go)) if (pipe(child->go))
return NULL; return -1;
/* pipe to notify parent that child thread is ready */ /* pipe to notify parent that child thread is ready */
if (pipe(child.c2p)) { if (pipe(child->c2p)) {
close(child.go[0]); close(child->go[0]);
close(child.go[1]); close(child->go[1]);
return NULL; return -1;
} }
child.pid = getpid(); child->pid = getpid();
err = pthread_create(&child.thread, NULL, child_thread, &child); err = pthread_create(&child->thread, NULL, child_thread, child);
if (err) { if (err) {
err = -errno; err = -errno;
close(child.go[0]); close(child->go[0]);
close(child.go[1]); close(child->go[1]);
close(child.c2p[0]); close(child->c2p[0]);
close(child.c2p[1]); close(child->c2p[1]);
errno = -err; errno = -err;
return NULL; return -1;
} }
err = read(child.c2p[0], &c, 1); err = read(child->c2p[0], &c, 1);
if (!ASSERT_EQ(err, 1, "child_thread_ready")) if (!ASSERT_EQ(err, 1, "child_thread_ready"))
return NULL; return -1;
return &child; return 0;
} }
static void uprobe_multi_test_run(struct uprobe_multi *skel, struct child *child) static void uprobe_multi_test_run(struct uprobe_multi *skel, struct child *child)
...@@ -304,24 +301,22 @@ __test_attach_api(const char *binary, const char *pattern, struct bpf_uprobe_mul ...@@ -304,24 +301,22 @@ __test_attach_api(const char *binary, const char *pattern, struct bpf_uprobe_mul
static void static void
test_attach_api(const char *binary, const char *pattern, struct bpf_uprobe_multi_opts *opts) test_attach_api(const char *binary, const char *pattern, struct bpf_uprobe_multi_opts *opts)
{ {
struct child *child; static struct child child;
/* no pid filter */ /* no pid filter */
__test_attach_api(binary, pattern, opts, NULL); __test_attach_api(binary, pattern, opts, NULL);
/* pid filter */ /* pid filter */
child = spawn_child(); if (!ASSERT_OK(spawn_child(&child), "spawn_child"))
if (!ASSERT_OK_PTR(child, "spawn_child"))
return; return;
__test_attach_api(binary, pattern, opts, child); __test_attach_api(binary, pattern, opts, &child);
/* pid filter (thread) */ /* pid filter (thread) */
child = spawn_thread(); if (!ASSERT_OK(spawn_thread(&child), "spawn_thread"))
if (!ASSERT_OK_PTR(child, "spawn_thread"))
return; return;
__test_attach_api(binary, pattern, opts, child); __test_attach_api(binary, pattern, opts, &child);
} }
static void test_attach_api_pattern(void) static void test_attach_api_pattern(void)
...@@ -712,24 +707,22 @@ static void __test_link_api(struct child *child) ...@@ -712,24 +707,22 @@ static void __test_link_api(struct child *child)
static void test_link_api(void) static void test_link_api(void)
{ {
struct child *child; static struct child child;
/* no pid filter */ /* no pid filter */
__test_link_api(NULL); __test_link_api(NULL);
/* pid filter */ /* pid filter */
child = spawn_child(); if (!ASSERT_OK(spawn_child(&child), "spawn_child"))
if (!ASSERT_OK_PTR(child, "spawn_child"))
return; return;
__test_link_api(child); __test_link_api(&child);
/* pid filter (thread) */ /* pid filter (thread) */
child = spawn_thread(); if (!ASSERT_OK(spawn_thread(&child), "spawn_thread"))
if (!ASSERT_OK_PTR(child, "spawn_thread"))
return; return;
__test_link_api(child); __test_link_api(&child);
} }
static struct bpf_program * static struct bpf_program *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment