[PATCH bpf-next v7 09/15] selftests/bpf: test_xsk: Don't exit immediately when xsk_attach fails

Bastien Curutchet (eBPF Foundation) posted 15 patches 1 month, 2 weeks ago
[PATCH bpf-next v7 09/15] selftests/bpf: test_xsk: Don't exit immediately when xsk_attach fails
Posted by Bastien Curutchet (eBPF Foundation) 1 month, 2 weeks ago
xsk_reattach_xdp calls exit_with_error() on failures. This exits the
program immediately. It prevents the following tests from being run and
isn't compliant with the CI.

Add a return value to the functions handling XDP attachments to handle
errors more smoothly.

Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Signed-off-by: Bastien Curutchet (eBPF Foundation) <bastien.curutchet@bootlin.com>
---
 tools/testing/selftests/bpf/test_xsk.c | 28 +++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/tools/testing/selftests/bpf/test_xsk.c b/tools/testing/selftests/bpf/test_xsk.c
index 7db1d974e31511e93b05bf70be991cee4cd444c6..0adb6c0b948f6216b24d0562bcda26097dbb9dbc 100644
--- a/tools/testing/selftests/bpf/test_xsk.c
+++ b/tools/testing/selftests/bpf/test_xsk.c
@@ -1643,7 +1643,7 @@ static bool xdp_prog_changed_tx(struct test_spec *test)
 	return ifobj->xdp_prog != test->xdp_prog_tx || ifobj->mode != test->mode;
 }
 
-static void xsk_reattach_xdp(struct ifobject *ifobj, struct bpf_program *xdp_prog,
+static int xsk_reattach_xdp(struct ifobject *ifobj, struct bpf_program *xdp_prog,
 			     struct bpf_map *xskmap, enum test_mode mode)
 {
 	int err;
@@ -1652,31 +1652,40 @@ static void xsk_reattach_xdp(struct ifobject *ifobj, struct bpf_program *xdp_pro
 	err = xsk_attach_xdp_program(xdp_prog, ifobj->ifindex, mode_to_xdp_flags(mode));
 	if (err) {
 		ksft_print_msg("Error attaching XDP program\n");
-		exit_with_error(-err);
+		return err;
 	}
 
 	if (ifobj->mode != mode && (mode == TEST_MODE_DRV || mode == TEST_MODE_ZC))
 		if (!xsk_is_in_mode(ifobj->ifindex, XDP_FLAGS_DRV_MODE)) {
 			ksft_print_msg("ERROR: XDP prog not in DRV mode\n");
-			exit_with_error(EINVAL);
+			return -EINVAL;
 		}
 
 	ifobj->xdp_prog = xdp_prog;
 	ifobj->xskmap = xskmap;
 	ifobj->mode = mode;
+
+	return 0;
 }
 
-static void xsk_attach_xdp_progs(struct test_spec *test, struct ifobject *ifobj_rx,
+static int xsk_attach_xdp_progs(struct test_spec *test, struct ifobject *ifobj_rx,
 				 struct ifobject *ifobj_tx)
 {
-	if (xdp_prog_changed_rx(test))
-		xsk_reattach_xdp(ifobj_rx, test->xdp_prog_rx, test->xskmap_rx, test->mode);
+	int err = 0;
+
+	if (xdp_prog_changed_rx(test)) {
+		err = xsk_reattach_xdp(ifobj_rx, test->xdp_prog_rx, test->xskmap_rx, test->mode);
+		if (err)
+			return err;
+	}
 
 	if (!ifobj_tx || ifobj_tx->shared_umem)
-		return;
+		return 0;
 
 	if (xdp_prog_changed_tx(test))
-		xsk_reattach_xdp(ifobj_tx, test->xdp_prog_tx, test->xskmap_tx, test->mode);
+		err = xsk_reattach_xdp(ifobj_tx, test->xdp_prog_tx, test->xskmap_tx, test->mode);
+
+	return err;
 }
 
 static void clean_sockets(struct test_spec *test, struct ifobject *ifobj)
@@ -1789,7 +1798,8 @@ static int testapp_validate_traffic(struct test_spec *test)
 		}
 	}
 
-	xsk_attach_xdp_progs(test, ifobj_rx, ifobj_tx);
+	if (xsk_attach_xdp_progs(test, ifobj_rx, ifobj_tx))
+		return TEST_FAILURE;
 	return __testapp_validate_traffic(test, ifobj_rx, ifobj_tx);
 }
 

-- 
2.51.0
Re: [PATCH bpf-next v7 09/15] selftests/bpf: test_xsk: Don't exit immediately when xsk_attach fails
Posted by bot+bpf-ci@kernel.org 1 month, 2 weeks ago
```
commit f4ff202b333a83faed1f820153ca90a030e95808
Author: Bastien Curutchet (eBPF Foundation) <bastien.curutchet@bootlin.com>

selftests/bpf: test_xsk: Don't exit immediately when xsk_attach fails

This commit changes xsk_reattach_xdp() and xsk_attach_xdp_progs() from
void to int return types to propagate errors instead of calling
exit_with_error(), allowing tests to continue after attachment failures.

> diff --git a/tools/testing/selftests/bpf/test_xsk.c b/tools/testing/selftests/bpf/test_xsk.c
> index 7db1d974e..0adb6c0b9 100644
> --- a/tools/testing/selftests/bpf/test_xsk.c
> +++ b/tools/testing/selftests/bpf/test_xsk.c
> @@ -1643,7 +1643,7 @@ static bool xdp_prog_changed_tx(struct test_spec *test)
>  	return ifobj->xdp_prog != test->xdp_prog_tx || ifobj->mode != test->mode;
>  }
>
> -static void xsk_reattach_xdp(struct ifobject *ifobj, struct bpf_program *xdp_prog,
> +static int xsk_reattach_xdp(struct ifobject *ifobj, struct bpf_program *xdp_prog,
>  			     struct bpf_map *xskmap, enum test_mode mode)
>  {
>  	int err;
> @@ -1652,31 +1652,40 @@ static void xsk_reattach_xdp(struct ifobject *ifobj, struct bpf_program *xdp_pro
>  	err = xsk_attach_xdp_program(xdp_prog, ifobj->ifindex, mode_to_xdp_flags(mode));
>  	if (err) {
>  		ksft_print_msg("Error attaching XDP program\n");
> -		exit_with_error(-err);
> +		return err;
>  	}
>
>  	if (ifobj->mode != mode && (mode == TEST_MODE_DRV || mode == TEST_MODE_ZC))
>  		if (!xsk_is_in_mode(ifobj->ifindex, XDP_FLAGS_DRV_MODE)) {
>  			ksft_print_msg("ERROR: XDP prog not in DRV mode\n");
> -			exit_with_error(EINVAL);
> +			return -EINVAL;
>  		}
>
>  	ifobj->xdp_prog = xdp_prog;
>  	ifobj->xskmap = xskmap;
>  	ifobj->mode = mode;
> +
> +	return 0;

Can xsk_reattach_xdp() leave the XDP program attached when the mode check
fails?

The flow is:
1. xsk_detach_xdp_program() removes old XDP program
2. xsk_attach_xdp_program() attaches new program (succeeds)
3. xsk_is_in_mode() check fails
4. ifobj state updated to reflect new attachment
5. Returns -EINVAL

At this point the new XDP program is attached to the interface but the
function returned an error. Should the newly attached program be detached
on this error path, or should the ifobj state updates be moved after all
checks pass?

>  }
>
> -static void xsk_attach_xdp_progs(struct test_spec *test, struct ifobject *ifobj_rx,
> +static int xsk_attach_xdp_progs(struct test_spec *test, struct ifobject *ifobj_rx,
>  				 struct ifobject *ifobj_tx)
>  {

[ ... ]

> @@ -1789,7 +1798,8 @@ static int testapp_validate_traffic(struct test_spec *test)
>  		}
>  	}
>
> -	xsk_attach_xdp_progs(test, ifobj_rx, ifobj_tx);
> +	if (xsk_attach_xdp_progs(test, ifobj_rx, ifobj_tx))
> +		return TEST_FAILURE;
>  	return __testapp_validate_traffic(test, ifobj_rx, ifobj_tx);
>  }


```

---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md

In-Reply-To-Subject: `selftests/bpf: test_xsk: Don't exit immediately when xsk_attach fails`
CI run summary: https://github.com/kernel-patches/bpf/actions/runs/18966766839