[Devel] [PATCH vz10 3/3] selftests/ve_devcg_bpf: add diagnostic messages to child test functions

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Tue May 19 13:44:44 MSK 2026


Reviewed-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>

On 5/18/26 18:17, Konstantin Khorenko wrote:
> Error returns from child test functions are opaque numeric codes visible
> only via WEXITSTATUS. Add fprintf(stderr, ...) before each error return
> so the specific failure step and errno are reported in test output.
> 
> https://virtuozzo.atlassian.net/browse/VSTOR-126504
> Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
> 
> Feature: ve: allow BPF in Containers
> ---
>  .../ve_devcg_bpf/ve_devcg_bpf_test.c          | 87 ++++++++++++++++---
>  1 file changed, 73 insertions(+), 14 deletions(-)
> 
> diff --git a/tools/testing/selftests/ve_devcg_bpf/ve_devcg_bpf_test.c b/tools/testing/selftests/ve_devcg_bpf/ve_devcg_bpf_test.c
> index 0a04298149290..a7e6a9217b191 100644
> --- a/tools/testing/selftests/ve_devcg_bpf/ve_devcg_bpf_test.c
> +++ b/tools/testing/selftests/ve_devcg_bpf/ve_devcg_bpf_test.c
> @@ -153,8 +153,10 @@ static int test_prog_load(void)
>  	int fd;
>  
>  	fd = load_devcg_prog();
> -	if (fd < 0)
> +	if (fd < 0) {
> +		fprintf(stderr, "prog_load: load failed: %m\n");
>  		return 1;
> +	}
>  
>  	close(fd);
>  	return 0;
> @@ -166,11 +168,17 @@ static int test_prog_load_denied(void)
>  
>  	fd = load_devcg_prog();
>  	if (fd >= 0) {
> +		fprintf(stderr, "prog_load_denied: load unexpectedly succeeded\n");
>  		close(fd);
>  		return 1;
>  	}
>  
> -	return (errno == EPERM) ? 0 : 2;
> +	if (errno != EPERM) {
> +		fprintf(stderr, "prog_load_denied: expected EPERM, got %m\n");
> +		return 2;
> +	}
> +
> +	return 0;
>  }
>  
>  static int test_prog_load_oversized_denied(void)
> @@ -191,11 +199,17 @@ static int test_prog_load_oversized_denied(void)
>  
>  	fd = syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
>  	if (fd >= 0) {
> +		fprintf(stderr, "prog_load_oversized: load unexpectedly succeeded\n");
>  		close(fd);
>  		return 1;
>  	}
>  
> -	return (errno == E2BIG) ? 0 : 2;
> +	if (errno != E2BIG) {
> +		fprintf(stderr, "prog_load_oversized: expected E2BIG, got %m\n");
> +		return 2;
> +	}
> +
> +	return 0;
>  }
>  
>  static int test_prog_query(int ve_cg_fd)
> @@ -203,11 +217,14 @@ static int test_prog_query(int ve_cg_fd)
>  	union bpf_attr attr;
>  	int cg_fd, ret;
>  
> -	if (mkdirat(ve_cg_fd, "subcg", 0755))
> +	if (mkdirat(ve_cg_fd, "subcg", 0755)) {
> +		fprintf(stderr, "prog_query: mkdirat failed: %m\n");
>  		return 1;
> +	}
>  
>  	cg_fd = openat(ve_cg_fd, "subcg", O_RDONLY | O_DIRECTORY);
>  	if (cg_fd < 0) {
> +		fprintf(stderr, "prog_query: openat failed: %m\n");
>  		unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
>  		return 2;
>  	}
> @@ -220,7 +237,12 @@ static int test_prog_query(int ve_cg_fd)
>  	close(cg_fd);
>  	unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
>  
> -	return (ret < 0) ? 3 : 0;
> +	if (ret < 0) {
> +		fprintf(stderr, "prog_query: query failed: %m\n");
> +		return 3;
> +	}
> +
> +	return 0;
>  }
>  
>  static int test_prog_query_denied(int ve_cg_fd)
> @@ -228,11 +250,14 @@ static int test_prog_query_denied(int ve_cg_fd)
>  	union bpf_attr attr;
>  	int cg_fd, ret, saved_errno;
>  
> -	if (mkdirat(ve_cg_fd, "subcg", 0755))
> +	if (mkdirat(ve_cg_fd, "subcg", 0755)) {
> +		fprintf(stderr, "prog_query_denied: mkdirat failed: %m\n");
>  		return 1;
> +	}
>  
>  	cg_fd = openat(ve_cg_fd, "subcg", O_RDONLY | O_DIRECTORY);
>  	if (cg_fd < 0) {
> +		fprintf(stderr, "prog_query_denied: openat failed: %m\n");
>  		unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
>  		return 2;
>  	}
> @@ -247,10 +272,18 @@ static int test_prog_query_denied(int ve_cg_fd)
>  	close(cg_fd);
>  	unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
>  
> -	if (ret == 0)
> +	if (ret == 0) {
> +		fprintf(stderr, "prog_query_denied: query unexpectedly succeeded\n");
>  		return 3;
> +	}
>  
> -	return (saved_errno == EPERM) ? 0 : 4;
> +	if (saved_errno != EPERM) {
> +		fprintf(stderr, "prog_query_denied: expected EPERM, got errno %d\n",
> +			saved_errno);
> +		return 4;
> +	}
> +
> +	return 0;
>  }
>  
>  static int test_prog_query_effective_denied(int ve_cg_fd)
> @@ -258,11 +291,14 @@ static int test_prog_query_effective_denied(int ve_cg_fd)
>  	union bpf_attr attr;
>  	int cg_fd, ret, saved_errno;
>  
> -	if (mkdirat(ve_cg_fd, "subcg", 0755))
> +	if (mkdirat(ve_cg_fd, "subcg", 0755)) {
> +		fprintf(stderr, "prog_query_effective: mkdirat failed: %m\n");
>  		return 1;
> +	}
>  
>  	cg_fd = openat(ve_cg_fd, "subcg", O_RDONLY | O_DIRECTORY);
>  	if (cg_fd < 0) {
> +		fprintf(stderr, "prog_query_effective: openat failed: %m\n");
>  		unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
>  		return 2;
>  	}
> @@ -278,10 +314,18 @@ static int test_prog_query_effective_denied(int ve_cg_fd)
>  	close(cg_fd);
>  	unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
>  
> -	if (ret == 0)
> +	if (ret == 0) {
> +		fprintf(stderr, "prog_query_effective: query unexpectedly succeeded\n");
>  		return 3;
> +	}
> +
> +	if (saved_errno != EPERM) {
> +		fprintf(stderr, "prog_query_effective: expected EPERM, got errno %d\n",
> +			saved_errno);
> +		return 4;
> +	}
>  
> -	return (saved_errno == EPERM) ? 0 : 4;
> +	return 0;
>  }
>  
>  static int test_prog_query_root_denied(int ve_cg_fd)
> @@ -294,10 +338,17 @@ static int test_prog_query_root_denied(int ve_cg_fd)
>  	attr.query.attach_type = BPF_CGROUP_DEVICE;
>  
>  	ret = syscall(__NR_bpf, BPF_PROG_QUERY, &attr, sizeof(attr));
> -	if (ret == 0)
> +	if (ret == 0) {
> +		fprintf(stderr, "prog_query_root: query unexpectedly succeeded\n");
>  		return 1;
> +	}
>  
> -	return (errno == EPERM) ? 0 : 2;
> +	if (errno != EPERM) {
> +		fprintf(stderr, "prog_query_root: expected EPERM, got %m\n");
> +		return 2;
> +	}
> +
> +	return 0;
>  }
>  
>  static int test_prog_attach_query(int ve_cg_fd)
> @@ -307,16 +358,20 @@ static int test_prog_attach_query(int ve_cg_fd)
>  	__u32 prog_ids[1];
>  
>  	prog_fd = load_devcg_prog();
> -	if (prog_fd < 0)
> +	if (prog_fd < 0) {
> +		fprintf(stderr, "prog_attach_query: load failed: %m\n");
>  		return 1;
> +	}
>  
>  	if (mkdirat(ve_cg_fd, "subcg", 0755)) {
> +		fprintf(stderr, "prog_attach_query: mkdirat failed: %m\n");
>  		close(prog_fd);
>  		return 2;
>  	}
>  
>  	cg_fd = openat(ve_cg_fd, "subcg", O_RDONLY | O_DIRECTORY);
>  	if (cg_fd < 0) {
> +		fprintf(stderr, "prog_attach_query: openat failed: %m\n");
>  		close(prog_fd);
>  		unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
>  		return 3;
> @@ -330,6 +385,7 @@ static int test_prog_attach_query(int ve_cg_fd)
>  
>  	ret = syscall(__NR_bpf, BPF_PROG_ATTACH, &attr, sizeof(attr));
>  	if (ret < 0) {
> +		fprintf(stderr, "prog_attach_query: attach failed: %m\n");
>  		close(cg_fd);
>  		close(prog_fd);
>  		unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
> @@ -345,6 +401,7 @@ static int test_prog_attach_query(int ve_cg_fd)
>  
>  	ret = syscall(__NR_bpf, BPF_PROG_QUERY, &attr, sizeof(attr));
>  	if (ret < 0) {
> +		fprintf(stderr, "prog_attach_query: query failed: %m\n");
>  		close(cg_fd);
>  		close(prog_fd);
>  		unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
> @@ -352,6 +409,8 @@ static int test_prog_attach_query(int ve_cg_fd)
>  	}
>  
>  	if (attr.query.prog_cnt != 1) {
> +		fprintf(stderr, "prog_attach_query: expected 1 prog, got %u\n",
> +			attr.query.prog_cnt);
>  		close(cg_fd);
>  		close(prog_fd);
>  		unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);

-- 
Best regards, Pavel Tikhomirov
Senior Software Developer, Virtuozzo.



More information about the Devel mailing list