* [PATCH bpf-next] selftests/bpf: improve error messages in veristat
@ 2025-06-27 14:43 Mykyta Yatsenko
2025-06-27 19:12 ` Eduard Zingerman
2025-06-28 2:00 ` patchwork-bot+netdevbpf
0 siblings, 2 replies; 5+ messages in thread
From: Mykyta Yatsenko @ 2025-06-27 14:43 UTC (permalink / raw)
To: bpf, ast, andrii, daniel, kafai, kernel-team, eddyz87; +Cc: Mykyta Yatsenko
From: Mykyta Yatsenko <yatsenko@meta.com>
Return error if preset parsing fails. Avoid proceeding with veristat run
if preset does not parse.
Before:
```
./veristat set_global_vars.bpf.o -G "arr[999999999999999999999] = 1"
Failed to parse value '999999999999999999999'
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.
```
After:
```
./veristat set_global_vars.bpf.o -G "arr[999999999999999999999] = 1"
Failed to parse value '999999999999999999999'
Failed to parse global variable presets: arr[999999999999999999999] = 1
```
Improve error messages:
* If preset struct member can't be found.
* Array index out of bounds
Extract rtrim function.
Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
---
tools/testing/selftests/bpf/veristat.c | 36 ++++++++++++++++++--------
1 file changed, 25 insertions(+), 11 deletions(-)
diff --git a/tools/testing/selftests/bpf/veristat.c b/tools/testing/selftests/bpf/veristat.c
index 1e9f61f9fd0a..09cfbd486f92 100644
--- a/tools/testing/selftests/bpf/veristat.c
+++ b/tools/testing/selftests/bpf/veristat.c
@@ -890,6 +890,18 @@ static bool is_desc_sym(char c)
return c == 'v' || c == 'V' || c == '.' || c == '!' || c == '_';
}
+static char *rtrim(char *str)
+{
+ int i;
+
+ for (i = strlen(str) - 1; i > 0; --i) {
+ if (!isspace(str[i]))
+ break;
+ str[i] = '\0';
+ }
+ return str;
+}
+
static int parse_stat(const char *stat_name, struct stat_specs *specs)
{
int id;
@@ -1666,7 +1678,7 @@ static int append_preset_atom(struct var_preset *preset, char *value, bool is_in
static int parse_var_atoms(const char *full_var, struct var_preset *preset)
{
char expr[256], var[256], *name, *saveptr;
- int n, len, off;
+ int n, len, off, err;
snprintf(expr, sizeof(expr), "%s", full_var);
preset->atom_count = 0;
@@ -1677,7 +1689,9 @@ static int parse_var_atoms(const char *full_var, struct var_preset *preset)
fprintf(stderr, "Can't parse %s\n", name);
return -EINVAL;
}
- append_preset_atom(preset, var, false);
+ err = append_preset_atom(preset, var, false);
+ if (err)
+ return err;
/* parse optional array indexes */
while (off < len) {
@@ -1685,7 +1699,9 @@ static int parse_var_atoms(const char *full_var, struct var_preset *preset)
fprintf(stderr, "Can't parse %s as index\n", name + off);
return -EINVAL;
}
- append_preset_atom(preset, var, true);
+ err = append_preset_atom(preset, var, true);
+ if (err)
+ return err;
off += n;
}
}
@@ -1697,7 +1713,7 @@ static int append_var_preset(struct var_preset **presets, int *cnt, const char *
void *tmp;
struct var_preset *cur;
char var[256], val[256];
- int n, err, i;
+ int n, err;
tmp = realloc(*presets, (*cnt + 1) * sizeof(**presets));
if (!tmp)
@@ -1712,11 +1728,7 @@ static int append_var_preset(struct var_preset **presets, int *cnt, const char *
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';
- }
+ rtrim(var);
err = parse_rvalue(val, &cur->value);
if (err)
@@ -1869,7 +1881,7 @@ static int adjust_var_secinfo_array(struct btf *btf, int tid, struct field_acces
if (err)
return err;
if (idx < 0 || idx >= barr->nelems) {
- fprintf(stderr, "Array index %lld is out of bounds [0, %u]: %s\n",
+ fprintf(stderr, "Array index %lld is out of bounds [0, %u): %s\n",
idx, barr->nelems, array_name);
return -EINVAL;
}
@@ -1928,7 +1940,7 @@ static int adjust_var_secinfo_member(const struct btf *btf,
}
}
- return -EINVAL;
+ return -ESRCH;
}
static int adjust_var_secinfo(struct btf *btf, const struct btf_type *t,
@@ -1955,6 +1967,8 @@ static int adjust_var_secinfo(struct btf *btf, const struct btf_type *t,
break;
case FIELD_NAME:
err = adjust_var_secinfo_member(btf, base_type, 0, atom->name, sinfo);
+ if (err == -ESRCH)
+ fprintf(stderr, "Can't find '%s'\n", atom->name);
prev_name = atom->name;
break;
default:
--
2.50.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH bpf-next] selftests/bpf: improve error messages in veristat
2025-06-27 14:43 [PATCH bpf-next] selftests/bpf: improve error messages in veristat Mykyta Yatsenko
@ 2025-06-27 19:12 ` Eduard Zingerman
2025-06-27 20:01 ` Mykyta Yatsenko
2025-06-28 2:00 ` patchwork-bot+netdevbpf
1 sibling, 1 reply; 5+ messages in thread
From: Eduard Zingerman @ 2025-06-27 19:12 UTC (permalink / raw)
To: Mykyta Yatsenko, bpf, ast, andrii, daniel, kafai, kernel-team
Cc: Mykyta Yatsenko
On Fri, 2025-06-27 at 15:43 +0100, Mykyta Yatsenko wrote:
> From: Mykyta Yatsenko <yatsenko@meta.com>
>
> Return error if preset parsing fails. Avoid proceeding with veristat run
> if preset does not parse.
> Before:
> ```
> ./veristat set_global_vars.bpf.o -G "arr[999999999999999999999] = 1"
> Failed to parse value '999999999999999999999'
> 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.
> ```
> After:
> ```
> ./veristat set_global_vars.bpf.o -G "arr[999999999999999999999] = 1"
> Failed to parse value '999999999999999999999'
> Failed to parse global variable presets: arr[999999999999999999999] = 1
> ```
>
> Improve error messages:
> * If preset struct member can't be found.
> * Array index out of bounds
>
> Extract rtrim function.
>
> Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
> ---
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
> @@ -1955,6 +1967,8 @@ static int adjust_var_secinfo(struct btf *btf, const struct btf_type *t,
> break;
> case FIELD_NAME:
> err = adjust_var_secinfo_member(btf, base_type, 0, atom->name, sinfo);
> + if (err == -ESRCH)
> + fprintf(stderr, "Can't find '%s'\n", atom->name);
Nit: adjust_var_secinfo_member() already reports a few errors,
maybe report this error there as well?
> prev_name = atom->name;
> break;
> default:
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH bpf-next] selftests/bpf: improve error messages in veristat
2025-06-27 19:12 ` Eduard Zingerman
@ 2025-06-27 20:01 ` Mykyta Yatsenko
2025-06-27 20:07 ` Eduard Zingerman
0 siblings, 1 reply; 5+ messages in thread
From: Mykyta Yatsenko @ 2025-06-27 20:01 UTC (permalink / raw)
To: Eduard Zingerman, bpf, ast, andrii, daniel, kafai, kernel-team
Cc: Mykyta Yatsenko
On 6/27/25 20:12, Eduard Zingerman wrote:
> On Fri, 2025-06-27 at 15:43 +0100, Mykyta Yatsenko wrote:
>> From: Mykyta Yatsenko <yatsenko@meta.com>
>>
>> Return error if preset parsing fails. Avoid proceeding with veristat run
>> if preset does not parse.
>> Before:
>> ```
>> ./veristat set_global_vars.bpf.o -G "arr[999999999999999999999] = 1"
>> Failed to parse value '999999999999999999999'
>> 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.
>> ```
>> After:
>> ```
>> ./veristat set_global_vars.bpf.o -G "arr[999999999999999999999] = 1"
>> Failed to parse value '999999999999999999999'
>> Failed to parse global variable presets: arr[999999999999999999999] = 1
>> ```
>>
>> Improve error messages:
>> * If preset struct member can't be found.
>> * Array index out of bounds
>>
>> Extract rtrim function.
>>
>> Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
>> ---
> Acked-by: Eduard Zingerman <eddyz87@gmail.com>
>
>> @@ -1955,6 +1967,8 @@ static int adjust_var_secinfo(struct btf *btf, const struct btf_type *t,
>> break;
>> case FIELD_NAME:
>> err = adjust_var_secinfo_member(btf, base_type, 0, atom->name, sinfo);
>> + if (err == -ESRCH)
>> + fprintf(stderr, "Can't find '%s'\n", atom->name);
> Nit: adjust_var_secinfo_member() already reports a few errors,
> maybe report this error there as well?
That was my first attempt, but adjust_var_secinfo_member is called
recursively for anonymous embedded structures, so this particular error
will be noisy, as it'll get triggered for every embedded structure.
Placing error msg here makes sure it's printed just once and only in
cases when member is not present anywhere.
>
>> prev_name = atom->name;
>> break;
>> default:
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH bpf-next] selftests/bpf: improve error messages in veristat
2025-06-27 20:01 ` Mykyta Yatsenko
@ 2025-06-27 20:07 ` Eduard Zingerman
0 siblings, 0 replies; 5+ messages in thread
From: Eduard Zingerman @ 2025-06-27 20:07 UTC (permalink / raw)
To: Mykyta Yatsenko, bpf, ast, andrii, daniel, kafai, kernel-team
Cc: Mykyta Yatsenko
On Fri, 2025-06-27 at 21:01 +0100, Mykyta Yatsenko wrote:
[...]
> > > @@ -1955,6 +1967,8 @@ static int adjust_var_secinfo(struct btf *btf, const struct btf_type *t,
> > > break;
> > > case FIELD_NAME:
> > > err = adjust_var_secinfo_member(btf, base_type, 0, atom->name, sinfo);
> > > + if (err == -ESRCH)
> > > + fprintf(stderr, "Can't find '%s'\n", atom->name);
> > Nit: adjust_var_secinfo_member() already reports a few errors,
> > maybe report this error there as well?
> That was my first attempt, but adjust_var_secinfo_member is called
> recursively for anonymous embedded structures, so this particular error
> will be noisy, as it'll get triggered for every embedded structure.
> Placing error msg here makes sure it's printed just once and only in
> cases when member is not present anywhere.
Makes sense, thank you for explaining.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH bpf-next] selftests/bpf: improve error messages in veristat
2025-06-27 14:43 [PATCH bpf-next] selftests/bpf: improve error messages in veristat Mykyta Yatsenko
2025-06-27 19:12 ` Eduard Zingerman
@ 2025-06-28 2:00 ` patchwork-bot+netdevbpf
1 sibling, 0 replies; 5+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-06-28 2:00 UTC (permalink / raw)
To: Mykyta Yatsenko
Cc: bpf, ast, andrii, daniel, kafai, kernel-team, eddyz87, yatsenko
Hello:
This patch was applied to bpf/bpf-next.git (master)
by Alexei Starovoitov <ast@kernel.org>:
On Fri, 27 Jun 2025 15:43:42 +0100 you wrote:
> From: Mykyta Yatsenko <yatsenko@meta.com>
>
> Return error if preset parsing fails. Avoid proceeding with veristat run
> if preset does not parse.
> Before:
> ```
> ./veristat set_global_vars.bpf.o -G "arr[999999999999999999999] = 1"
> Failed to parse value '999999999999999999999'
> Processing 'set_global_vars.bpf.o'...
> File Program Verdict Duration (us) Insns States Program size Jited size
>
> [...]
Here is the summary with links:
- [bpf-next] selftests/bpf: improve error messages in veristat
https://git.kernel.org/bpf/bpf-next/c/ffaff1804e2c
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-06-28 1:59 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-27 14:43 [PATCH bpf-next] selftests/bpf: improve error messages in veristat Mykyta Yatsenko
2025-06-27 19:12 ` Eduard Zingerman
2025-06-27 20:01 ` Mykyta Yatsenko
2025-06-27 20:07 ` Eduard Zingerman
2025-06-28 2:00 ` patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox