tools/testing/selftests/bpf/prog_tests/usdt.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/bpf/prog_tests/usdt.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/bpf/prog_tests/usdt.c- Extension
.c- Size
- 19298 bytes
- Lines
- 619
- 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
test_progs.h../sdt.htest_usdt.skel.htest_urandom_usdt.skel.h
Detected Declarations
function trigger_funcfunction trigger_sib_specfunction subtest_basic_usdtfunction subtest_optimized_attachfunction f100function trigger_100_usdtsfunction f300function trigger_300_usdtsfunction f400function trigger_400_usdtsfunction subtest_multispec_usdtfunction urand_triggerfunction subtest_urandom_usdtfunction test_usdt
Annotated Snippet
static void __always_inline trigger_func(int x) {
long y = 42;
if (test_usdt0_semaphore)
STAP_PROBE(test, usdt0);
if (test_usdt3_semaphore)
STAP_PROBE3(test, usdt3, x, y, &bla);
if (test_usdt12_semaphore) {
STAP_PROBE12(test, usdt12,
x, x + 1, y, x + y, 5,
y / 7, bla, &bla, -9, nums[x],
nums[idx], t1.y);
}
}
#if defined(__x86_64__) || defined(__i386__)
/*
* SIB (Scale-Index-Base) addressing format: "size@(base_reg, index_reg, scale)"
* - 'size' is the size in bytes of the array element, and its sign indicates
* whether the type is signed (negative) or unsigned (positive).
* - 'base_reg' is the register holding the base address, normally rdx or edx
* - 'index_reg' is the register holding the index, normally rax or eax
* - 'scale' is the scaling factor (typically 1, 2, 4, or 8), which matches the
* size of the element type.
*
* For example, for an array of 'short' (signed 2-byte elements), the SIB spec would be:
* - size: -2 (negative because 'short' is signed)
* - scale: 2 (since sizeof(short) == 2)
*
* The resulting SIB format: "-2@(%%rdx,%%rax,2)" for x86_64, "-2@(%%edx,%%eax,2)" for i386
*/
static volatile short array[] = {-1, -2, -3, -4};
#if defined(__x86_64__)
#define USDT_SIB_ARG_SPEC -2@(%%rdx,%%rax,2)
#else
#define USDT_SIB_ARG_SPEC -2@(%%edx,%%eax,2)
#endif
unsigned short test_usdt_sib_semaphore SEC(".probes");
static void trigger_sib_spec(void)
{
/*
* Force SIB addressing with inline assembly.
*
* You must compile with -std=gnu99 or -std=c99 to use the
* STAP_PROBE_ASM macro.
*
* The STAP_PROBE_ASM macro generates a quoted string that gets
* inserted between the surrounding assembly instructions. In this
* case, USDT_SIB_ARG_SPEC is embedded directly into the instruction
* stream, creating a probe point between the asm statement boundaries.
* It works fine with gcc/clang.
*
* Register constraints:
* - "d"(array): Binds the 'array' variable to %rdx or %edx register
* - "a"(0): Binds the constant 0 to %rax or %eax register
* These ensure that when USDT_SIB_ARG_SPEC references %%rdx(%edx) and
* %%rax(%eax), they contain the expected values for SIB addressing.
*
* The "memory" clobber prevents the compiler from reordering memory
* accesses around the probe point, ensuring that the probe behavior
* is predictable and consistent.
*/
asm volatile(
STAP_PROBE_ASM(test, usdt_sib, USDT_SIB_ARG_SPEC)
:
: "d"(array), "a"(0)
: "memory"
);
}
#endif
static void subtest_basic_usdt(bool optimized)
{
LIBBPF_OPTS(bpf_usdt_opts, opts);
struct test_usdt *skel;
struct test_usdt__bss *bss;
int err, i, called;
const __u64 expected_cookie = 0xcafedeadbeeffeed;
#define TRIGGER(x) ({ \
trigger_func(x); \
if (optimized) \
trigger_func(x); \
optimized ? 2 : 1; \
})
skel = test_usdt__open_and_load();
Annotation
- Immediate include surface: `test_progs.h`, `../sdt.h`, `test_usdt.skel.h`, `test_urandom_usdt.skel.h`.
- Detected declarations: `function trigger_func`, `function trigger_sib_spec`, `function subtest_basic_usdt`, `function subtest_optimized_attach`, `function f100`, `function trigger_100_usdts`, `function f300`, `function trigger_300_usdts`, `function f400`, `function trigger_400_usdts`.
- 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.