From: Eduard Zingerman <eddyz87@gmail.com>
To: Mykyta Yatsenko <mykyta.yatsenko5@gmail.com>,
bpf@vger.kernel.org, ast@kernel.org, andrii@kernel.org,
daniel@iogearbox.net, kafai@meta.com, kernel-team@meta.com
Cc: Mykyta Yatsenko <yatsenko@meta.com>
Subject: Re: [PATCH bpf-next v5 2/3] selftests/bpf: support array presets in veristat
Date: Wed, 25 Jun 2025 14:46:48 -0700 [thread overview]
Message-ID: <20a5f48ff07d02da2f51aaa815a0943078c87655.camel@gmail.com> (raw)
In-Reply-To: <20250625165904.87820-3-mykyta.yatsenko5@gmail.com>
On Wed, 2025-06-25 at 17:59 +0100, Mykyta Yatsenko wrote:
> From: Mykyta Yatsenko <yatsenko@meta.com>
>
> Implement support for presetting values for array elements in veristat.
> For example:
> ```
> sudo ./veristat set_global_vars.bpf.o -G "arr[3] = 1"
> ```
> Arrays of structures and structure of arrays work, but each individual
> scalar value has to be set separately: `foo[1].bar[2] = value`.
>
> Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
> ---
This looks great, I have a few minor nits but let's land this patch-set.
Maybe fix error reporting below as a follow-up.
New array offset computation logic is much simpler to grasp.
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
---
Nit: this signals an error:
$ ./veristat -G " arr[ fff ] = 1" set_global_vars.bpf.o
Processing 'set_global_vars.bpf.o'...
Can't resolve enum value fff
Failed to set global variables -3
Failed to process 'set_global_vars.bpf.o': -3
but this does not:
$ ./veristat -G " arr[ 11111111111111111111111111111 ] = 1" set_global_vars.bpf.o
Failed to parse value '11111111111111111111111111111'
Processing 'set_global_vars.bpf.o'...
File Program Verdict Duration (us) Insns States Program size Jited size
--------------------- ---------------- ------- ------------- ----- ------ ------------ ----------
set_global_vars.bpf.o test_set_globals success 27 64 0 82 0
--------------------- ---------------- ------- ------------- ----- ------ ------------ ----------
Done. Processed 1 files, 0 programs. Skipped 1 files, 0 programs.
> tools/testing/selftests/bpf/veristat.c | 239 +++++++++++++++++++------
> 1 file changed, 189 insertions(+), 50 deletions(-)
>
> diff --git a/tools/testing/selftests/bpf/veristat.c b/tools/testing/selftests/bpf/veristat.c
> index 483442c08ecf..9c67adcf0a33 100644
> --- a/tools/testing/selftests/bpf/veristat.c
> +++ b/tools/testing/selftests/bpf/veristat.c
[...]
> @@ -1670,10 +1706,16 @@ static int append_var_preset(struct var_preset **presets, int *cnt, const char *
> memset(cur, 0, sizeof(*cur));
> (*cnt)++;
>
> - if (sscanf(expr, "%s = %s %n", var, val, &n) != 2 || n != strlen(expr)) {
> + if (sscanf(expr, " %[][a-zA-Z0-9_. ] = %s %n", var, val, &n) != 2 || n != strlen(expr)) {
> fprintf(stderr, "Failed to parse expression '%s'\n", expr);
> return -EINVAL;
> }
> + /* Remove trailing spaces from var, as scanf may add those */
> + for (i = strlen(var) - 1; i > 0; --i) {
> + if (!isspace(var[i]))
> + break;
> + var[i] = '\0';
> + }
Nit: It appears, this sequence is needed only for nicer error reporting,
I'd just drop it.
>
> err = parse_rvalue(val, &cur->value);
> if (err)
[...]
> @@ -3164,11 +3296,18 @@ int main(int argc, char **argv)
> free(env.deny_filters);
> for (i = 0; i < env.npresets; ++i) {
> free(env.presets[i].full_name);
> - for (j = 0; j < env.presets[i].atom_count; ++j)
> - free(env.presets[i].atoms[j].name);
> + for (j = 0; j < env.presets[i].atom_count; ++j) {
> + switch (env.presets[i].atoms[j].type) {
> + case FIELD_NAME:
> + free(env.presets[i].atoms[j].name);
> + break;
> + case ARRAY_INDEX:
> + if (env.presets[i].atoms[j].index.type == ENUMERATOR)
> + free(env.presets[i].atoms[j].index.svalue);
> + break;
> + }
> + }
Nit: removing union in `struct field_access` would simplify this loop to:
for (j = 0; j < env.presets[i].atom_count; ++j) {
free(env.presets[i].atoms[j].name);
free(env.presets[i].atoms[j].index.svalue);
}
(assuming zero initialization).
> free(env.presets[i].atoms);
> - if (env.presets[i].value.type == ENUMERATOR)
> - free(env.presets[i].value.svalue);
> }
> free(env.presets);
> return -err;
next prev parent reply other threads:[~2025-06-25 21:46 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-25 16:59 [PATCH bpf-next v5 0/3] Support array presets in veristat Mykyta Yatsenko
2025-06-25 16:59 ` [PATCH bpf-next v5 1/3] selftests/bpf: separate var preset parsing " Mykyta Yatsenko
2025-06-25 20:51 ` Eduard Zingerman
2025-06-25 16:59 ` [PATCH bpf-next v5 2/3] selftests/bpf: support array presets " Mykyta Yatsenko
2025-06-25 21:46 ` Eduard Zingerman [this message]
2025-06-26 17:40 ` Andrii Nakryiko
2025-06-25 16:59 ` [PATCH bpf-next v5 3/3] selftests/bpf: test " Mykyta Yatsenko
2025-06-25 20:57 ` Eduard Zingerman
2025-06-26 18:00 ` [PATCH bpf-next v5 0/3] Support " patchwork-bot+netdevbpf
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=20a5f48ff07d02da2f51aaa815a0943078c87655.camel@gmail.com \
--to=eddyz87@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=kafai@meta.com \
--cc=kernel-team@meta.com \
--cc=mykyta.yatsenko5@gmail.com \
--cc=yatsenko@meta.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox