Subject: Re: [PATCH bpf-next] selftests/bpf_iter: don't fail test due to missing __builtin_btf_type_id

From: Alan Maguire <[email-masked]>
Date: Tue, 29 Sep 2020 13:35:26 +0100 (IST)

On Tue, 29 Sep 2020, Toke Høiland-Jørgensen wrote:

> The new test for task iteration in bpf_iter checks (in do_btf_read()) if it
> should be skipped due to missing __builtin_btf_type_id. However, this
> 'skip' verdict is not propagated to the caller, so the parent test will
> still fail. Fix this by also skipping the rest of the parent test if the
> skip condition was reached.
> 
> Fixes: b72091bd4ee4 ("selftests/bpf: Add test for bpf_seq_printf_btf helper")
> Signed-off-by: Toke Høiland-Jørgensen <[email-masked]>

Reviewed-by: Alan Maguire <[email-masked]>

Thanks for fixing this Toke!

> ---
>  tools/testing/selftests/bpf/prog_tests/bpf_iter.c | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c
> index af15630a24dd..448885b95eed 100644
> --- a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c
> +++ b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c
> @@ -172,17 +172,18 @@ static void test_task_file(void)
>  
>  static char taskbuf[TASKBUFSZ];
>  
> -static void do_btf_read(struct bpf_iter_task_btf *skel)
> +static int do_btf_read(struct bpf_iter_task_btf *skel)
>  {
>  	struct bpf_program *prog = skel->progs.dump_task_struct;
>  	struct bpf_iter_task_btf__bss *bss = skel->bss;
>  	int iter_fd = -1, len = 0, bufleft = TASKBUFSZ;
>  	struct bpf_link *link;
>  	char *buf = taskbuf;
> +	int ret = 0;
>  
>  	link = bpf_program__attach_iter(prog, NULL);
>  	if (CHECK(IS_ERR(link), "attach_iter", "attach_iter failed\n"))
> -		return;
> +		return ret;
>  
>  	iter_fd = bpf_iter_create(bpf_link__fd(link));
>  	if (CHECK(iter_fd < 0, "create_iter", "create_iter failed\n"))
> @@ -198,6 +199,7 @@ static void do_btf_read(struct bpf_iter_task_btf *skel)
>  
>  	if (bss->skip) {
>  		printf("%s:SKIP:no __builtin_btf_type_id\n", __func__);
> +		ret = 1;
>  		test__skip();
>  		goto free_link;
>  	}
> @@ -212,12 +214,14 @@ static void do_btf_read(struct bpf_iter_task_btf *skel)
>  	if (iter_fd > 0)
>  		close(iter_fd);
>  	bpf_link__destroy(link);
> +	return ret;
>  }
>  
>  static void test_task_btf(void)
>  {
>  	struct bpf_iter_task_btf__bss *bss;
>  	struct bpf_iter_task_btf *skel;
> +	int ret;
>  
>  	skel = bpf_iter_task_btf__open_and_load();
>  	if (CHECK(!skel, "bpf_iter_task_btf__open_and_load",
> @@ -226,7 +230,9 @@ static void test_task_btf(void)
>  
>  	bss = skel->bss;
>  
> -	do_btf_read(skel);
> +	ret = do_btf_read(skel);
> +	if (ret)
> +		goto cleanup;
>  
>  	if (CHECK(bss->tasks == 0, "check if iterated over tasks",
>  		  "no task iteration, did BPF program run?\n"))
> -- 
> 2.28.0
> 
>