tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c- Extension
.c- Size
- 40244 bytes
- Lines
- 1473
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
unistd.hpthread.hfcntl.htest_progs.huprobe_multi.skel.huprobe_multi_bench.skel.huprobe_multi_usdt.skel.huprobe_multi_consumers.skel.huprobe_multi_pid_filter.skel.huprobe_multi_session.skel.huprobe_multi_session_single.skel.huprobe_multi_session_cookie.skel.huprobe_multi_session_recursive.skel.huprobe_multi_verifier.skel.hbpf/libbpf_internal.htesting_helpers.h../sdt.h
Detected Declarations
struct childfunction uprobe_multi_func_1function uprobe_multi_func_2function uprobe_multi_func_3function usdt_triggerfunction uprobe_session_recursivefunction release_childfunction kick_childfunction child_funcfunction spawn_child_flagfunction spawn_childfunction spawn_threadfunction uprobe_multi_test_runfunction test_skel_apifunction __test_attach_apifunction test_attach_apifunction test_attach_api_patternfunction test_attach_api_symsfunction test_attach_api_failsfunction uprobe_multi_error_funcfunction attach_uprobe_fail_trapfunction attach_uprobe_fail_trapfunction attach_uprobe_fail_refctrfunction test_attach_uprobe_failsfunction __test_link_apifunction test_link_apifunction test_link_api_path_fdfunction get_programfunction get_linkfunction uprobe_attachfunction uprobe_detachfunction test_bitfunction uprobe_consumer_testfunction consumer_testfunction test_consumersfunction run_pid_filterfunction test_pid_filter_processfunction test_session_skel_apifunction test_session_single_skel_apifunction test_session_cookie_skel_apifunction test_session_recursive_skel_apifunction uprobe_session_recursivefunction test_bench_attach_uprobefunction test_bench_attach_usdtfunction test_uprobe_multi_test
Annotated Snippet
struct child {
int go[2];
int c2p[2]; /* child -> parent channel */
int pid;
int tid;
pthread_t thread;
char stack[65536];
};
static void release_child(struct child *child)
{
int child_status;
if (!child)
return;
close(child->go[1]);
close(child->go[0]);
if (child->thread) {
pthread_join(child->thread, NULL);
child->thread = 0;
}
close(child->c2p[0]);
close(child->c2p[1]);
if (child->pid > 0)
waitpid(child->pid, &child_status, 0);
}
static void kick_child(struct child *child)
{
char c = 1;
if (child) {
write(child->go[1], &c, 1);
release_child(child);
}
fflush(NULL);
}
static int child_func(void *arg)
{
struct child *child = arg;
int err, c;
close(child->go[1]);
/* wait for parent's kick */
err = read(child->go[0], &c, 1);
if (err != 1)
exit(err);
uprobe_multi_func_1();
uprobe_multi_func_2();
uprobe_multi_func_3();
usdt_trigger();
exit(errno);
}
static int spawn_child_flag(struct child *child, bool clone_vm)
{
/* pipe to notify child to execute the trigger functions */
if (pipe(child->go))
return -1;
if (clone_vm) {
child->pid = child->tid = clone(child_func, child->stack + sizeof(child->stack)/2,
CLONE_VM|SIGCHLD, child);
} else {
child->pid = child->tid = fork();
}
if (child->pid < 0) {
release_child(child);
errno = EINVAL;
return -1;
}
/* fork-ed child */
if (!clone_vm && child->pid == 0)
child_func(child);
return 0;
}
static int spawn_child(struct child *child)
{
return spawn_child_flag(child, false);
}
static void *child_thread(void *ctx)
{
Annotation
- Immediate include surface: `unistd.h`, `pthread.h`, `fcntl.h`, `test_progs.h`, `uprobe_multi.skel.h`, `uprobe_multi_bench.skel.h`, `uprobe_multi_usdt.skel.h`, `uprobe_multi_consumers.skel.h`.
- Detected declarations: `struct child`, `function uprobe_multi_func_1`, `function uprobe_multi_func_2`, `function uprobe_multi_func_3`, `function usdt_trigger`, `function uprobe_session_recursive`, `function release_child`, `function kick_child`, `function child_func`, `function spawn_child_flag`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.