From: Stanislav Fomichev <sdf@fomichev.me>
To: Krzesimir Nowak <krzesimir@kinvolk.io>
Cc: linux-kernel@vger.kernel.org, "Alban Crequy" <alban@kinvolk.io>,
"Iago López Galeiras" <iago@kinvolk.io>,
"Alexei Starovoitov" <ast@kernel.org>,
"Daniel Borkmann" <daniel@iogearbox.net>,
"Martin KaFai Lau" <kafai@fb.com>,
"Song Liu" <songliubraving@fb.com>, "Yonghong Song" <yhs@fb.com>,
"David S. Miller" <davem@davemloft.net>,
"Jakub Kicinski" <jakub.kicinski@netronome.com>,
"Jesper Dangaard Brouer" <hawk@kernel.org>,
"John Fastabend" <john.fastabend@gmail.com>,
"Stanislav Fomichev" <sdf@google.com>,
netdev@vger.kernel.org, bpf@vger.kernel.org,
xdp-newbies@vger.kernel.org
Subject: Re: [bpf-next v3 10/12] bpf: Implement bpf_prog_test_run for perf event programs
Date: Thu, 11 Jul 2019 13:30:59 -0700 [thread overview]
Message-ID: <20190711203059.GB16709@mini-arch> (raw)
In-Reply-To: <20190708163121.18477-11-krzesimir@kinvolk.io>
On 07/08, Krzesimir Nowak wrote:
> As an input, test run for perf event program takes struct
> bpf_perf_event_data as ctx_in and struct bpf_perf_event_value as
> data_in. For an output, it basically ignores ctx_out and data_out.
>
> The implementation sets an instance of struct bpf_perf_event_data_kern
> in such a way that the BPF program reading data from context will
> receive what we passed to the bpf prog test run in ctx_in. Also BPF
> program can call bpf_perf_prog_read_value to receive what was passed
> in data_in.
>
> Changes since v2:
> - drop the changes in perf event verifier test - they are not needed
> anymore after reworked ctx size handling
>
> Signed-off-by: Krzesimir Nowak <krzesimir@kinvolk.io>
> ---
> kernel/trace/bpf_trace.c | 60 ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 60 insertions(+)
>
> diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
> index ca1255d14576..b870fc2314d0 100644
> --- a/kernel/trace/bpf_trace.c
> +++ b/kernel/trace/bpf_trace.c
> @@ -19,6 +19,8 @@
> #include "trace_probe.h"
> #include "trace.h"
>
> +#include <trace/events/bpf_test_run.h>
> +
> #define bpf_event_rcu_dereference(p) \
> rcu_dereference_protected(p, lockdep_is_held(&bpf_event_mutex))
>
> @@ -1160,7 +1162,65 @@ const struct bpf_verifier_ops perf_event_verifier_ops = {
> .convert_ctx_access = pe_prog_convert_ctx_access,
> };
>
> +static int pe_prog_test_run(struct bpf_prog *prog,
> + const union bpf_attr *kattr,
> + union bpf_attr __user *uattr)
> +{
> + struct bpf_perf_event_data_kern real_ctx = {0, };
> + struct perf_sample_data sample_data = {0, };
> + struct bpf_perf_event_data *fake_ctx;
> + struct bpf_perf_event_value *value;
> + struct perf_event event = {0, };
> + u32 retval = 0, duration = 0;
> + int err;
> +
> + if (kattr->test.data_size_out || kattr->test.data_out)
> + return -EINVAL;
> + if (kattr->test.ctx_size_out || kattr->test.ctx_out)
> + return -EINVAL;
> +
> + fake_ctx = bpf_receive_ctx(kattr, sizeof(struct bpf_perf_event_data));
> + if (IS_ERR(fake_ctx))
> + return PTR_ERR(fake_ctx);
> +
> + value = bpf_receive_data(kattr, sizeof(struct bpf_perf_event_value));
> + if (IS_ERR(value)) {
> + kfree(fake_ctx);
> + return PTR_ERR(value);
> + }
nit: maybe use bpf_test_ prefix for receive_ctx/data:
* bpf_test_receive_ctx
* bpf_test_receive_data
? To signify that they are used for tests only.
> +
> + real_ctx.regs = &fake_ctx->regs;
> + real_ctx.data = &sample_data;
> + real_ctx.event = &event;
> + perf_sample_data_init(&sample_data, fake_ctx->addr,
> + fake_ctx->sample_period);
> + event.cpu = smp_processor_id();
> + event.oncpu = -1;
> + event.state = PERF_EVENT_STATE_OFF;
> + local64_set(&event.count, value->counter);
> + event.total_time_enabled = value->enabled;
> + event.total_time_running = value->running;
> + /* make self as a leader - it is used only for checking the
> + * state field
> + */
> + event.group_leader = &event;
> + err = bpf_test_run(prog, &real_ctx, kattr->test.repeat,
> + BPF_TEST_RUN_PLAIN, &retval, &duration);
> + if (err) {
> + kfree(value);
> + kfree(fake_ctx);
> + return err;
> + }
> +
> + err = bpf_test_finish(uattr, retval, duration);
> + trace_bpf_test_finish(&err);
Can probably do:
err = bpf_test_run(...)
if (!err) {
err = bpf_test_finish(uattr, retval, duration);
trace_bpf_test_finish(&err);
}
kfree(..);
kfree(..);
return err;
So you don't have to copy-paste the error handling.
> + kfree(value);
> + kfree(fake_ctx);
> + return err;
> +}
> +
> const struct bpf_prog_ops perf_event_prog_ops = {
> + .test_run = pe_prog_test_run,
> };
>
> static DEFINE_MUTEX(bpf_event_mutex);
> --
> 2.20.1
>
next prev parent reply other threads:[~2019-07-11 20:31 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-08 16:31 [bpf-next v3 00/12] Test the 32bit narrow reads Krzesimir Nowak
2019-07-08 16:31 ` [bpf-next v3 01/12] selftests/bpf: Print a message when tester could not run a program Krzesimir Nowak
2019-07-10 23:44 ` Andrii Nakryiko
2019-07-11 11:36 ` Krzesimir Nowak
2019-07-12 0:10 ` Andrii Nakryiko
2019-07-08 16:31 ` [bpf-next v3 02/12] selftests/bpf: Avoid a clobbering of errno Krzesimir Nowak
2019-07-10 23:51 ` Andrii Nakryiko
2019-07-11 12:04 ` Krzesimir Nowak
2019-07-12 0:59 ` Andrii Nakryiko
2019-07-12 17:31 ` Krzesimir Nowak
2019-07-08 16:31 ` [bpf-next v3 03/12] selftests/bpf: Avoid another case of errno clobbering Krzesimir Nowak
2019-07-10 23:57 ` Andrii Nakryiko
2019-07-11 12:05 ` Krzesimir Nowak
2019-07-08 16:31 ` [bpf-next v3 04/12] selftests/bpf: Use bpf_prog_test_run_xattr Krzesimir Nowak
2019-07-11 0:03 ` Andrii Nakryiko
2019-07-11 12:07 ` Krzesimir Nowak
2019-07-08 16:31 ` [bpf-next v3 05/12] selftests/bpf: Allow passing more information to BPF prog test run Krzesimir Nowak
2019-07-11 1:17 ` Andrii Nakryiko
2019-07-11 12:17 ` Krzesimir Nowak
2019-07-08 16:31 ` [bpf-next v3 06/12] selftests/bpf: Make sure that preexisting tests for perf event work Krzesimir Nowak
2019-07-08 16:31 ` [bpf-next v3 07/12] tools headers: Adopt compiletime_assert from kernel sources Krzesimir Nowak
2019-07-12 0:19 ` Andrii Nakryiko
2019-07-08 16:31 ` [bpf-next v3 08/12] tools headers: Sync struct bpf_perf_event_data Krzesimir Nowak
2019-07-12 0:21 ` Andrii Nakryiko
2019-07-08 16:31 ` [bpf-next v3 09/12] bpf: Split out some helper functions Krzesimir Nowak
2019-07-08 16:40 ` Krzesimir Nowak
2019-07-11 20:25 ` Stanislav Fomichev
2019-07-08 16:31 ` [bpf-next v3 10/12] bpf: Implement bpf_prog_test_run for perf event programs Krzesimir Nowak
2019-07-11 20:30 ` Stanislav Fomichev [this message]
2019-07-08 16:31 ` [bpf-next v3 11/12] selftests/bpf: Add tests for bpf_prog_test_run for perf events progs Krzesimir Nowak
2019-07-12 0:37 ` Andrii Nakryiko
2019-07-12 17:37 ` Krzesimir Nowak
2019-07-12 17:49 ` Andrii Nakryiko
2019-07-08 16:31 ` [bpf-next v3 12/12] selftests/bpf: Test correctness of narrow 32bit read on 64bit field Krzesimir Nowak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190711203059.GB16709@mini-arch \
--to=sdf@fomichev.me \
--cc=alban@kinvolk.io \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=hawk@kernel.org \
--cc=iago@kinvolk.io \
--cc=jakub.kicinski@netronome.com \
--cc=john.fastabend@gmail.com \
--cc=kafai@fb.com \
--cc=krzesimir@kinvolk.io \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=sdf@google.com \
--cc=songliubraving@fb.com \
--cc=xdp-newbies@vger.kernel.org \
--cc=yhs@fb.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.