selftests/bpf: remove syscall-driven benchs, keep syscall-count only
Remove "legacy" benchmarks triggered by syscalls in favor of newly added in-kernel/batched benchmarks. Drop -batched suffix now as well. Next patch will restore "feature parity" by adding back tp/raw_tp/fmodret benchmarks based on in-kernel kfunc approach. Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/r/20240326162151.3981687-4-andrii@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
committed by
Alexei Starovoitov
parent
7df4e597ea
commit
208c439120
@@ -496,28 +496,16 @@ extern const struct bench bench_rename_fexit;
|
||||
|
||||
/* pure counting benchmarks to establish theoretical lmits */
|
||||
extern const struct bench bench_trig_usermode_count;
|
||||
extern const struct bench bench_trig_base;
|
||||
extern const struct bench bench_trig_syscall_count;
|
||||
extern const struct bench bench_trig_kernel_count;
|
||||
|
||||
/* kernel-side syscall-triggered benchmarks */
|
||||
extern const struct bench bench_trig_tp;
|
||||
extern const struct bench bench_trig_rawtp;
|
||||
/* batched, staying mostly in-kernel benchmarks */
|
||||
extern const struct bench bench_trig_kprobe;
|
||||
extern const struct bench bench_trig_kretprobe;
|
||||
extern const struct bench bench_trig_kprobe_multi;
|
||||
extern const struct bench bench_trig_kretprobe_multi;
|
||||
extern const struct bench bench_trig_fentry;
|
||||
extern const struct bench bench_trig_fexit;
|
||||
extern const struct bench bench_trig_fentry_sleep;
|
||||
extern const struct bench bench_trig_fmodret;
|
||||
|
||||
/* batched, staying mostly in-kernel benchmarks */
|
||||
extern const struct bench bench_trig_kernel_count;
|
||||
extern const struct bench bench_trig_kprobe_batch;
|
||||
extern const struct bench bench_trig_kretprobe_batch;
|
||||
extern const struct bench bench_trig_kprobe_multi_batch;
|
||||
extern const struct bench bench_trig_kretprobe_multi_batch;
|
||||
extern const struct bench bench_trig_fentry_batch;
|
||||
extern const struct bench bench_trig_fexit_batch;
|
||||
|
||||
/* uprobe/uretprobe benchmarks */
|
||||
extern const struct bench bench_trig_uprobe_nop;
|
||||
@@ -560,24 +548,14 @@ static const struct bench *benchs[] = {
|
||||
/* pure counting benchmarks for establishing theoretical limits */
|
||||
&bench_trig_usermode_count,
|
||||
&bench_trig_kernel_count,
|
||||
/* syscall-driven triggering benchmarks */
|
||||
&bench_trig_tp,
|
||||
&bench_trig_rawtp,
|
||||
&bench_trig_syscall_count,
|
||||
/* batched, staying mostly in-kernel triggers */
|
||||
&bench_trig_kprobe,
|
||||
&bench_trig_kretprobe,
|
||||
&bench_trig_kprobe_multi,
|
||||
&bench_trig_kretprobe_multi,
|
||||
&bench_trig_fentry,
|
||||
&bench_trig_fexit,
|
||||
&bench_trig_fentry_sleep,
|
||||
&bench_trig_fmodret,
|
||||
/* batched, staying mostly in-kernel triggers */
|
||||
&bench_trig_kprobe_batch,
|
||||
&bench_trig_kretprobe_batch,
|
||||
&bench_trig_kprobe_multi_batch,
|
||||
&bench_trig_kretprobe_multi_batch,
|
||||
&bench_trig_fentry_batch,
|
||||
&bench_trig_fexit_batch,
|
||||
/* uprobes */
|
||||
&bench_trig_uprobe_nop,
|
||||
&bench_trig_uretprobe_nop,
|
||||
|
||||
@@ -99,24 +99,17 @@ static void trigger_validate(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void *trigger_base_producer(void *input)
|
||||
{
|
||||
while (true) {
|
||||
(void)syscall(__NR_getpgid);
|
||||
inc_counter(base_hits);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void trigger_base_measure(struct bench_res *res)
|
||||
{
|
||||
res->hits = sum_and_reset_counters(base_hits);
|
||||
}
|
||||
|
||||
static void *trigger_producer(void *input)
|
||||
{
|
||||
while (true)
|
||||
(void)syscall(__NR_getpgid);
|
||||
if (ctx.usermode_counters) {
|
||||
while (true) {
|
||||
(void)syscall(__NR_getpgid);
|
||||
inc_counter(base_hits);
|
||||
}
|
||||
} else {
|
||||
while (true)
|
||||
(void)syscall(__NR_getpgid);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -170,16 +163,17 @@ static void attach_bpf(struct bpf_program *prog)
|
||||
}
|
||||
}
|
||||
|
||||
static void trigger_tp_setup(void)
|
||||
static void trigger_syscall_count_setup(void)
|
||||
{
|
||||
setup_ctx();
|
||||
attach_bpf(ctx.skel->progs.bench_trigger_tp);
|
||||
ctx.usermode_counters = true;
|
||||
}
|
||||
|
||||
static void trigger_rawtp_setup(void)
|
||||
/* Batched, staying mostly in-kernel triggering setups */
|
||||
static void trigger_kernel_count_setup(void)
|
||||
{
|
||||
setup_ctx();
|
||||
attach_bpf(ctx.skel->progs.bench_trigger_raw_tp);
|
||||
/* override driver program */
|
||||
ctx.driver_prog_fd = bpf_program__fd(ctx.skel->progs.trigger_count);
|
||||
}
|
||||
|
||||
static void trigger_kprobe_setup(void)
|
||||
@@ -218,62 +212,6 @@ static void trigger_fexit_setup(void)
|
||||
attach_bpf(ctx.skel->progs.bench_trigger_fexit);
|
||||
}
|
||||
|
||||
static void trigger_fentry_sleep_setup(void)
|
||||
{
|
||||
setup_ctx();
|
||||
attach_bpf(ctx.skel->progs.bench_trigger_fentry_sleep);
|
||||
}
|
||||
|
||||
static void trigger_fmodret_setup(void)
|
||||
{
|
||||
setup_ctx();
|
||||
attach_bpf(ctx.skel->progs.bench_trigger_fmodret);
|
||||
}
|
||||
|
||||
/* Batched, staying mostly in-kernel triggering setups */
|
||||
static void trigger_kernel_count_setup(void)
|
||||
{
|
||||
setup_ctx();
|
||||
/* override driver program */
|
||||
ctx.driver_prog_fd = bpf_program__fd(ctx.skel->progs.trigger_count);
|
||||
}
|
||||
|
||||
static void trigger_kprobe_batch_setup(void)
|
||||
{
|
||||
setup_ctx();
|
||||
attach_bpf(ctx.skel->progs.bench_trigger_kprobe_batch);
|
||||
}
|
||||
|
||||
static void trigger_kretprobe_batch_setup(void)
|
||||
{
|
||||
setup_ctx();
|
||||
attach_bpf(ctx.skel->progs.bench_trigger_kretprobe_batch);
|
||||
}
|
||||
|
||||
static void trigger_kprobe_multi_batch_setup(void)
|
||||
{
|
||||
setup_ctx();
|
||||
attach_bpf(ctx.skel->progs.bench_trigger_kprobe_multi_batch);
|
||||
}
|
||||
|
||||
static void trigger_kretprobe_multi_batch_setup(void)
|
||||
{
|
||||
setup_ctx();
|
||||
attach_bpf(ctx.skel->progs.bench_trigger_kretprobe_multi_batch);
|
||||
}
|
||||
|
||||
static void trigger_fentry_batch_setup(void)
|
||||
{
|
||||
setup_ctx();
|
||||
attach_bpf(ctx.skel->progs.bench_trigger_fentry_batch);
|
||||
}
|
||||
|
||||
static void trigger_fexit_batch_setup(void)
|
||||
{
|
||||
setup_ctx();
|
||||
attach_bpf(ctx.skel->progs.bench_trigger_fexit_batch);
|
||||
}
|
||||
|
||||
/* make sure call is not inlined and not avoided by compiler, so __weak and
|
||||
* inline asm volatile in the body of the function
|
||||
*
|
||||
@@ -398,109 +336,10 @@ static void uretprobe_ret_setup(void)
|
||||
usetup(true, &uprobe_target_ret);
|
||||
}
|
||||
|
||||
const struct bench bench_trig_base = {
|
||||
.name = "trig-base",
|
||||
const struct bench bench_trig_syscall_count = {
|
||||
.name = "trig-syscall-count",
|
||||
.validate = trigger_validate,
|
||||
.producer_thread = trigger_base_producer,
|
||||
.measure = trigger_base_measure,
|
||||
.report_progress = hits_drops_report_progress,
|
||||
.report_final = hits_drops_report_final,
|
||||
};
|
||||
|
||||
const struct bench bench_trig_tp = {
|
||||
.name = "trig-tp",
|
||||
.validate = trigger_validate,
|
||||
.setup = trigger_tp_setup,
|
||||
.producer_thread = trigger_producer,
|
||||
.measure = trigger_measure,
|
||||
.report_progress = hits_drops_report_progress,
|
||||
.report_final = hits_drops_report_final,
|
||||
};
|
||||
|
||||
const struct bench bench_trig_rawtp = {
|
||||
.name = "trig-rawtp",
|
||||
.validate = trigger_validate,
|
||||
.setup = trigger_rawtp_setup,
|
||||
.producer_thread = trigger_producer,
|
||||
.measure = trigger_measure,
|
||||
.report_progress = hits_drops_report_progress,
|
||||
.report_final = hits_drops_report_final,
|
||||
};
|
||||
|
||||
const struct bench bench_trig_kprobe = {
|
||||
.name = "trig-kprobe",
|
||||
.validate = trigger_validate,
|
||||
.setup = trigger_kprobe_setup,
|
||||
.producer_thread = trigger_producer,
|
||||
.measure = trigger_measure,
|
||||
.report_progress = hits_drops_report_progress,
|
||||
.report_final = hits_drops_report_final,
|
||||
};
|
||||
|
||||
const struct bench bench_trig_kretprobe = {
|
||||
.name = "trig-kretprobe",
|
||||
.validate = trigger_validate,
|
||||
.setup = trigger_kretprobe_setup,
|
||||
.producer_thread = trigger_producer,
|
||||
.measure = trigger_measure,
|
||||
.report_progress = hits_drops_report_progress,
|
||||
.report_final = hits_drops_report_final,
|
||||
};
|
||||
|
||||
const struct bench bench_trig_kprobe_multi = {
|
||||
.name = "trig-kprobe-multi",
|
||||
.validate = trigger_validate,
|
||||
.setup = trigger_kprobe_multi_setup,
|
||||
.producer_thread = trigger_producer,
|
||||
.measure = trigger_measure,
|
||||
.report_progress = hits_drops_report_progress,
|
||||
.report_final = hits_drops_report_final,
|
||||
};
|
||||
|
||||
const struct bench bench_trig_kretprobe_multi = {
|
||||
.name = "trig-kretprobe-multi",
|
||||
.validate = trigger_validate,
|
||||
.setup = trigger_kretprobe_multi_setup,
|
||||
.producer_thread = trigger_producer,
|
||||
.measure = trigger_measure,
|
||||
.report_progress = hits_drops_report_progress,
|
||||
.report_final = hits_drops_report_final,
|
||||
};
|
||||
|
||||
const struct bench bench_trig_fentry = {
|
||||
.name = "trig-fentry",
|
||||
.validate = trigger_validate,
|
||||
.setup = trigger_fentry_setup,
|
||||
.producer_thread = trigger_producer,
|
||||
.measure = trigger_measure,
|
||||
.report_progress = hits_drops_report_progress,
|
||||
.report_final = hits_drops_report_final,
|
||||
};
|
||||
|
||||
const struct bench bench_trig_fexit = {
|
||||
.name = "trig-fexit",
|
||||
.validate = trigger_validate,
|
||||
.setup = trigger_fexit_setup,
|
||||
.producer_thread = trigger_producer,
|
||||
.measure = trigger_measure,
|
||||
.report_progress = hits_drops_report_progress,
|
||||
.report_final = hits_drops_report_final,
|
||||
};
|
||||
|
||||
const struct bench bench_trig_fentry_sleep = {
|
||||
.name = "trig-fentry-sleep",
|
||||
.validate = trigger_validate,
|
||||
.setup = trigger_fentry_sleep_setup,
|
||||
.producer_thread = trigger_producer,
|
||||
.measure = trigger_measure,
|
||||
.report_progress = hits_drops_report_progress,
|
||||
.report_final = hits_drops_report_final,
|
||||
};
|
||||
|
||||
const struct bench bench_trig_fmodret = {
|
||||
.name = "trig-fmodret",
|
||||
.validate = trigger_validate,
|
||||
.setup = trigger_fmodret_setup,
|
||||
.setup = trigger_syscall_count_setup,
|
||||
.producer_thread = trigger_producer,
|
||||
.measure = trigger_measure,
|
||||
.report_progress = hits_drops_report_progress,
|
||||
@@ -508,7 +347,7 @@ const struct bench bench_trig_fmodret = {
|
||||
};
|
||||
|
||||
/* batched (staying mostly in kernel) kprobe/fentry benchmarks */
|
||||
#define BENCH_TRIG_BATCH(KIND, NAME) \
|
||||
#define BENCH_TRIG_KERNEL(KIND, NAME) \
|
||||
const struct bench bench_trig_##KIND = { \
|
||||
.name = "trig-" NAME, \
|
||||
.setup = trigger_##KIND##_setup, \
|
||||
@@ -519,13 +358,13 @@ const struct bench bench_trig_##KIND = { \
|
||||
.argp = &bench_trigger_batch_argp, \
|
||||
}
|
||||
|
||||
BENCH_TRIG_BATCH(kernel_count, "kernel-count");
|
||||
BENCH_TRIG_BATCH(kprobe_batch, "kprobe-batch");
|
||||
BENCH_TRIG_BATCH(kretprobe_batch, "kretprobe-batch");
|
||||
BENCH_TRIG_BATCH(kprobe_multi_batch, "kprobe-multi-batch");
|
||||
BENCH_TRIG_BATCH(kretprobe_multi_batch, "kretprobe-multi-batch");
|
||||
BENCH_TRIG_BATCH(fentry_batch, "fentry-batch");
|
||||
BENCH_TRIG_BATCH(fexit_batch, "fexit-batch");
|
||||
BENCH_TRIG_KERNEL(kernel_count, "kernel-count");
|
||||
BENCH_TRIG_KERNEL(kprobe, "kprobe");
|
||||
BENCH_TRIG_KERNEL(kretprobe, "kretprobe");
|
||||
BENCH_TRIG_KERNEL(kprobe_multi, "kprobe-multi");
|
||||
BENCH_TRIG_KERNEL(kretprobe_multi, "kretprobe-multi");
|
||||
BENCH_TRIG_KERNEL(fentry, "fentry");
|
||||
BENCH_TRIG_KERNEL(fexit, "fexit");
|
||||
|
||||
/* uprobe benchmarks */
|
||||
#define BENCH_TRIG_USERMODE(KIND, PRODUCER, NAME) \
|
||||
|
||||
@@ -4,12 +4,9 @@ set -eufo pipefail
|
||||
|
||||
def_tests=( \
|
||||
usermode-count kernel-count syscall-count \
|
||||
fentry-batch fexit-batch \
|
||||
kprobe-batch kprobe-multi-batch \
|
||||
kretprobe-batch kretprobe-multi-batch \
|
||||
fentry fexit fmodret \
|
||||
rawtp tp \
|
||||
kprobe kprobe-multi kretprobe kretprobe-multi \
|
||||
fentry fexit \
|
||||
kprobe kprobe-multi \
|
||||
kretprobe kretprobe-multi \
|
||||
)
|
||||
|
||||
tests=("$@")
|
||||
@@ -21,5 +18,5 @@ p=${PROD_CNT:-1}
|
||||
|
||||
for t in "${tests[@]}"; do
|
||||
summary=$(sudo ./bench -w2 -d5 -a -p$p trig-$t | tail -n1 | cut -d'(' -f1 | cut -d' ' -f3-)
|
||||
printf "%-21s: %s\n" $t "$summary"
|
||||
printf "%-15s: %s\n" $t "$summary"
|
||||
done
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
set -eufo pipefail
|
||||
|
||||
for i in usermode-count base {uprobe,uretprobe}-{nop,push,ret}
|
||||
for i in usermode-count syscall-count {uprobe,uretprobe}-{nop,push,ret}
|
||||
do
|
||||
summary=$(sudo ./bench -w2 -d5 -a trig-$i | tail -n1 | cut -d'(' -f1 | cut -d' ' -f3-)
|
||||
printf "%-15s: %s\n" $i "$summary"
|
||||
|
||||
@@ -25,77 +25,6 @@ static __always_inline void inc_counter(void)
|
||||
__sync_add_and_fetch(&hits[cpu & CPU_MASK].value, 1);
|
||||
}
|
||||
|
||||
SEC("tp/syscalls/sys_enter_getpgid")
|
||||
int bench_trigger_tp(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("raw_tp/sys_enter")
|
||||
int BPF_PROG(bench_trigger_raw_tp, struct pt_regs *regs, long id)
|
||||
{
|
||||
if (id == __NR_getpgid)
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("kprobe/" SYS_PREFIX "sys_getpgid")
|
||||
int bench_trigger_kprobe(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("kretprobe/" SYS_PREFIX "sys_getpgid")
|
||||
int bench_trigger_kretprobe(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("kprobe.multi/" SYS_PREFIX "sys_getpgid")
|
||||
int bench_trigger_kprobe_multi(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("kretprobe.multi/" SYS_PREFIX "sys_getpgid")
|
||||
int bench_trigger_kretprobe_multi(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("fentry/" SYS_PREFIX "sys_getpgid")
|
||||
int bench_trigger_fentry(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("fexit/" SYS_PREFIX "sys_getpgid")
|
||||
int bench_trigger_fexit(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("fentry.s/" SYS_PREFIX "sys_getpgid")
|
||||
int bench_trigger_fentry_sleep(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("fmod_ret/" SYS_PREFIX "sys_getpgid")
|
||||
int bench_trigger_fmodret(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return -22;
|
||||
}
|
||||
|
||||
SEC("uprobe")
|
||||
int bench_trigger_uprobe(void *ctx)
|
||||
{
|
||||
@@ -128,42 +57,42 @@ int trigger_driver(void *ctx)
|
||||
}
|
||||
|
||||
SEC("kprobe/bpf_get_numa_node_id")
|
||||
int bench_trigger_kprobe_batch(void *ctx)
|
||||
int bench_trigger_kprobe(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("kretprobe/bpf_get_numa_node_id")
|
||||
int bench_trigger_kretprobe_batch(void *ctx)
|
||||
int bench_trigger_kretprobe(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("kprobe.multi/bpf_get_numa_node_id")
|
||||
int bench_trigger_kprobe_multi_batch(void *ctx)
|
||||
int bench_trigger_kprobe_multi(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("kretprobe.multi/bpf_get_numa_node_id")
|
||||
int bench_trigger_kretprobe_multi_batch(void *ctx)
|
||||
int bench_trigger_kretprobe_multi(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("fentry/bpf_get_numa_node_id")
|
||||
int bench_trigger_fentry_batch(void *ctx)
|
||||
int bench_trigger_fentry(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("fexit/bpf_get_numa_node_id")
|
||||
int bench_trigger_fexit_batch(void *ctx)
|
||||
int bench_trigger_fexit(void *ctx)
|
||||
{
|
||||
inc_counter();
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user