Re: [PATCH bpf-next] selftests/bpf: Add benchmark for local_storage RCU Tasks Trace usage

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 6/24/22 1:22 PM, Martin KaFai Lau wrote:   
> On Thu, Jun 23, 2022 at 04:46:09PM -0700, Dave Marchevsky wrote:
>> +static void report_progress(int iter, struct bench_res *res, long delta_ns)
>> +{
>> +	if (ctx.skel->bss->unexpected) {
>> +		fprintf(stderr, "Error: Unexpected order of bpf prog calls (postgp after pregp).");
>> +		fprintf(stderr, "Data can't be trusted, exiting\n");
>> +		exit(1);
>> +	}
>> +
>> +	if (args.quiet)
>> +		return;
>> +
>> +	printf("Iter %d\t avg tasks_trace grace period latency\t%lf ns\n",
>> +	       iter, res->gp_ns / (double)res->gp_ct);
>> +	printf("Iter %d\t avg ticks per tasks_trace grace period\t%lf\n",
>> +	       iter, res->stime / (double)res->gp_ct);
>> +}
>> +
> 
> [ ... ]
> 
>> diff --git a/tools/testing/selftests/bpf/benchs/run_bench_local_storage_rcu_tasks_trace.sh b/tools/testing/selftests/bpf/benchs/run_bench_local_storage_rcu_tasks_trace.sh
>> new file mode 100755
>> index 000000000000..5dac1f02892c
>> --- /dev/null
>> +++ b/tools/testing/selftests/bpf/benchs/run_bench_local_storage_rcu_tasks_trace.sh
>> @@ -0,0 +1,11 @@
>> +#!/bin/bash
>> +# SPDX-License-Identifier: GPL-2.0
>> +
>> +kthread_pid=`pgrep rcu_tasks_trace_kthread`
>> +
>> +if [ -z $kthread_pid ]; then
>> +	echo "error: Couldn't find rcu_tasks_trace_kthread"
>> +	exit 1
>> +fi
>> +
>> +./bench --nr_procs 15000 --kthread_pid $kthread_pid -d 600 --quiet 1 local-storage-tasks-trace
>> diff --git a/tools/testing/selftests/bpf/progs/local_storage_rcu_tasks_trace_bench.c b/tools/testing/selftests/bpf/progs/local_storage_rcu_tasks_trace_bench.c
>> new file mode 100644
>> index 000000000000..9b11342b19a0
>> --- /dev/null
>> +++ b/tools/testing/selftests/bpf/progs/local_storage_rcu_tasks_trace_bench.c
>> @@ -0,0 +1,65 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */
>> +
>> +#include "vmlinux.h"
>> +#include <bpf/bpf_helpers.h>
>> +#include "bpf_misc.h"
>> +
>> +struct {
>> +	__uint(type, BPF_MAP_TYPE_TASK_STORAGE);
>> +	__uint(map_flags, BPF_F_NO_PREALLOC);
>> +	__type(key, int);
>> +	__type(value, int);
>> +} task_storage SEC(".maps");
>> +
>> +long hits;
>> +long gp_hits;
>> +long gp_times;
>> +long current_gp_start;
>> +long unexpected;
>> +
>> +SEC("fentry/" SYS_PREFIX "sys_getpgid")
>> +int get_local(void *ctx)
>> +{
>> +	struct task_struct *task;
>> +	int idx;
>> +	int *s;
>> +
>> +	idx = 0;
>> +	task = bpf_get_current_task_btf();
>> +	s = bpf_task_storage_get(&task_storage, task, &idx,
>> +				 BPF_LOCAL_STORAGE_GET_F_CREATE);
>> +	if (!s)
>> +		return 0;
>> +
>> +	*s = 3;
>> +	bpf_task_storage_delete(&task_storage, task);
>> +	__sync_add_and_fetch(&hits, 1);
>> +	return 0;
>> +}
>> +
>> +SEC("kprobe/rcu_tasks_trace_pregp_step")
> nit.  Similar to the fentry sys_getpgid above.
> may as well use fentry for everything.
> 

Will do.

>> +int pregp_step(struct pt_regs *ctx)
>> +{
>> +	current_gp_start = bpf_ktime_get_ns();
>> +	return 0;
>> +}
>> +
>> +SEC("kprobe/rcu_tasks_trace_postgp")
>> +int postgp(struct pt_regs *ctx)
>> +{
>> +	if (!current_gp_start) {
>> +		/* Will only happen if prog tracing rcu_tasks_trace_pregp_step doesn't
>> +		 * execute before this prog
>> +		 */
>> +		__sync_add_and_fetch(&unexpected, 1);
> I consistently hit this:
> ./bench --nr_procs 1500 --kthread_pid ... -d 60 --quiet 1 local-storage-tasks-trace
> Setting up benchmark 'local-storage-tasks-trace'...
> Spun up 1500 procs (our pid 28351)
> Benchmark 'local-storage-tasks-trace' started.
> Error: Unexpected order of bpf prog calls (postgp after pregp).Data can't be trusted, exiting
> 
> May be there is a chance for the very first postgp being called
> before the pregp_step?
> 
I will change the logic to only consider postgp w/o pregp "unexpected" after the
postgp probe has been triggered once.

> Thanks for working on this!



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux