On Tue Jun 30, 2026 at 10:54 AM EDT, Sechang Lim wrote:
> tc, xdp, socket_filter and flow_dissector programs can no longer update
> or delete a sockmap. Adjust the tests:
>
>  - verifier_sockmap_mutate: the tc, xdp, socket_filter and
>    flow_dissector cases now expect __failure with "cannot update sockmap
>    in this context".
>  - sockmap_basic: drop "sockmap update" / "sockhash update", which load
>    a SEC("tc") program that copies a sock between maps.
>  - fexit_bpf2bpf: drop "func_sockmap_update", whose freplace program
>    updates a sockmap in the tc cls_redirect context.
>
> Remove the now-unused test_sockmap_update.c and freplace_cls_redirect.c.
>
> Signed-off-by: Sechang Lim <[email protected]>

Reviewed-by: Emil Tsalapatis <[email protected]>

> ---
>  .../selftests/bpf/prog_tests/fexit_bpf2bpf.c  | 13 -----
>  .../selftests/bpf/prog_tests/sockmap_basic.c  | 52 -------------------
>  .../bpf/progs/freplace_cls_redirect.c         | 34 ------------
>  .../selftests/bpf/progs/test_sockmap_update.c | 48 -----------------
>  .../bpf/progs/verifier_sockmap_mutate.c       | 12 ++---
>  5 files changed, 6 insertions(+), 153 deletions(-)
>  delete mode 100644 tools/testing/selftests/bpf/progs/freplace_cls_redirect.c
>  delete mode 100644 tools/testing/selftests/bpf/progs/test_sockmap_update.c
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c 
> b/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
> index 92c20803ea76..d3a954158c33 100644
> --- a/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
> +++ b/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
> @@ -336,17 +336,6 @@ static void test_fmod_ret_freplace(void)
>  }
>  
>  
> -static void test_func_sockmap_update(void)
> -{
> -     const char *prog_name[] = {
> -             "freplace/cls_redirect",
> -     };
> -     test_fexit_bpf2bpf_common("./freplace_cls_redirect.bpf.o",
> -                               "./test_cls_redirect.bpf.o",
> -                               ARRAY_SIZE(prog_name),
> -                               prog_name, false, NULL);
> -}
> -
>  static void test_func_replace_void(void)
>  {
>       const char *prog_name[] = {
> @@ -599,8 +588,6 @@ void serial_test_fexit_bpf2bpf(void)
>               test_func_replace();
>       if (test__start_subtest("func_replace_verify"))
>               test_func_replace_verify();
> -     if (test__start_subtest("func_sockmap_update"))
> -             test_func_sockmap_update();
>       if (test__start_subtest("func_replace_return_code"))
>               test_func_replace_return_code();
>       if (test__start_subtest("func_map_prog_compatibility"))
> diff --git a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c 
> b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c
> index cb3229711f93..33f788e2786d 100644
> --- a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c
> +++ b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c
> @@ -7,7 +7,6 @@
>  
>  #include "test_progs.h"
>  #include "test_skmsg_load_helpers.skel.h"
> -#include "test_sockmap_update.skel.h"
>  #include "test_sockmap_invalid_update.skel.h"
>  #include "test_sockmap_skb_verdict_attach.skel.h"
>  #include "test_sockmap_progs_query.skel.h"
> @@ -235,53 +234,6 @@ static void test_skmsg_helpers_with_link(enum 
> bpf_map_type map_type)
>       test_skmsg_load_helpers__destroy(skel);
>  }
>  
> -static void test_sockmap_update(enum bpf_map_type map_type)
> -{
> -     int err, prog, src;
> -     struct test_sockmap_update *skel;
> -     struct bpf_map *dst_map;
> -     const __u32 zero = 0;
> -     char dummy[14] = {0};
> -     LIBBPF_OPTS(bpf_test_run_opts, topts,
> -             .data_in = dummy,
> -             .data_size_in = sizeof(dummy),
> -             .repeat = 1,
> -     );
> -     __s64 sk;
> -
> -     sk = connected_socket_v4();
> -     if (!ASSERT_NEQ(sk, -1, "connected_socket_v4"))
> -             return;
> -
> -     skel = test_sockmap_update__open_and_load();
> -     if (!ASSERT_OK_PTR(skel, "open_and_load"))
> -             goto close_sk;
> -
> -     prog = bpf_program__fd(skel->progs.copy_sock_map);
> -     src = bpf_map__fd(skel->maps.src);
> -     if (map_type == BPF_MAP_TYPE_SOCKMAP)
> -             dst_map = skel->maps.dst_sock_map;
> -     else
> -             dst_map = skel->maps.dst_sock_hash;
> -
> -     err = bpf_map_update_elem(src, &zero, &sk, BPF_NOEXIST);
> -     if (!ASSERT_OK(err, "update_elem(src)"))
> -             goto out;
> -
> -     err = bpf_prog_test_run_opts(prog, &topts);
> -     if (!ASSERT_OK(err, "test_run"))
> -             goto out;
> -     if (!ASSERT_NEQ(topts.retval, 0, "test_run retval"))
> -             goto out;
> -
> -     compare_cookies(skel->maps.src, dst_map);
> -
> -out:
> -     test_sockmap_update__destroy(skel);
> -close_sk:
> -     close(sk);
> -}
> -
>  static void test_sockmap_invalid_update(void)
>  {
>       struct test_sockmap_invalid_update *skel;
> @@ -1385,10 +1337,6 @@ void test_sockmap_basic(void)
>               test_skmsg_helpers(BPF_MAP_TYPE_SOCKMAP);
>       if (test__start_subtest("sockhash sk_msg load helpers"))
>               test_skmsg_helpers(BPF_MAP_TYPE_SOCKHASH);
> -     if (test__start_subtest("sockmap update"))
> -             test_sockmap_update(BPF_MAP_TYPE_SOCKMAP);
> -     if (test__start_subtest("sockhash update"))
> -             test_sockmap_update(BPF_MAP_TYPE_SOCKHASH);
>       if (test__start_subtest("sockmap update in unsafe context"))
>               test_sockmap_invalid_update();
>       if (test__start_subtest("sockmap copy"))
> diff --git a/tools/testing/selftests/bpf/progs/freplace_cls_redirect.c 
> b/tools/testing/selftests/bpf/progs/freplace_cls_redirect.c
> deleted file mode 100644
> index 7e94412d47a5..000000000000
> --- a/tools/testing/selftests/bpf/progs/freplace_cls_redirect.c
> +++ /dev/null
> @@ -1,34 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -// Copyright (c) 2020 Facebook
> -
> -#include <linux/stddef.h>
> -#include <linux/bpf.h>
> -#include <linux/pkt_cls.h>
> -#include <bpf/bpf_endian.h>
> -#include <bpf/bpf_helpers.h>
> -
> -struct {
> -     __uint(type, BPF_MAP_TYPE_SOCKMAP);
> -     __type(key, int);
> -     __type(value, int);
> -     __uint(max_entries, 2);
> -} sock_map SEC(".maps");
> -
> -SEC("freplace/cls_redirect")
> -int freplace_cls_redirect_test(struct __sk_buff *skb)
> -{
> -     int ret = 0;
> -     const int zero = 0;
> -     struct bpf_sock *sk;
> -
> -     sk = bpf_map_lookup_elem(&sock_map, &zero);
> -     if (!sk)
> -             return TC_ACT_SHOT;
> -
> -     ret = bpf_map_update_elem(&sock_map, &zero, sk, 0);
> -     bpf_sk_release(sk);
> -
> -     return ret == 0 ? TC_ACT_OK : TC_ACT_SHOT;
> -}
> -
> -char _license[] SEC("license") = "GPL";
> diff --git a/tools/testing/selftests/bpf/progs/test_sockmap_update.c 
> b/tools/testing/selftests/bpf/progs/test_sockmap_update.c
> deleted file mode 100644
> index 6d64ea536e3d..000000000000
> --- a/tools/testing/selftests/bpf/progs/test_sockmap_update.c
> +++ /dev/null
> @@ -1,48 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -// Copyright (c) 2020 Cloudflare
> -#include "vmlinux.h"
> -#include <bpf/bpf_helpers.h>
> -
> -struct {
> -     __uint(type, BPF_MAP_TYPE_SOCKMAP);
> -     __uint(max_entries, 1);
> -     __type(key, __u32);
> -     __type(value, __u64);
> -} src SEC(".maps");
> -
> -struct {
> -     __uint(type, BPF_MAP_TYPE_SOCKMAP);
> -     __uint(max_entries, 1);
> -     __type(key, __u32);
> -     __type(value, __u64);
> -} dst_sock_map SEC(".maps");
> -
> -struct {
> -     __uint(type, BPF_MAP_TYPE_SOCKHASH);
> -     __uint(max_entries, 1);
> -     __type(key, __u32);
> -     __type(value, __u64);
> -} dst_sock_hash SEC(".maps");
> -
> -SEC("tc")
> -int copy_sock_map(void *ctx)
> -{
> -     struct bpf_sock *sk;
> -     bool failed = false;
> -     __u32 key = 0;
> -
> -     sk = bpf_map_lookup_elem(&src, &key);
> -     if (!sk)
> -             return SK_DROP;
> -
> -     if (bpf_map_update_elem(&dst_sock_map, &key, sk, 0))
> -             failed = true;
> -
> -     if (bpf_map_update_elem(&dst_sock_hash, &key, sk, 0))
> -             failed = true;
> -
> -     bpf_sk_release(sk);
> -     return failed ? SK_DROP : SK_PASS;
> -}
> -
> -char _license[] SEC("license") = "GPL";
> diff --git a/tools/testing/selftests/bpf/progs/verifier_sockmap_mutate.c 
> b/tools/testing/selftests/bpf/progs/verifier_sockmap_mutate.c
> index fe4b123187b8..20332a731d4e 100644
> --- a/tools/testing/selftests/bpf/progs/verifier_sockmap_mutate.c
> +++ b/tools/testing/selftests/bpf/progs/verifier_sockmap_mutate.c
> @@ -74,7 +74,7 @@ static __always_inline void 
> test_sockmap_lookup_and_mutate(void)
>  }
>  
>  SEC("action")
> -__success
> +__failure __msg("cannot update sockmap in this context")
>  int test_sched_act(struct __sk_buff *skb)
>  {
>       test_sockmap_mutate(skb->sk);
> @@ -82,7 +82,7 @@ int test_sched_act(struct __sk_buff *skb)
>  }
>  
>  SEC("classifier")
> -__success
> +__failure __msg("cannot update sockmap in this context")
>  int test_sched_cls(struct __sk_buff *skb)
>  {
>       test_sockmap_mutate(skb->sk);
> @@ -90,7 +90,7 @@ int test_sched_cls(struct __sk_buff *skb)
>  }
>  
>  SEC("flow_dissector")
> -__success
> +__failure __msg("cannot update sockmap in this context")
>  int test_flow_dissector_delete(struct __sk_buff *skb __always_unused)
>  {
>       test_sockmap_delete();
> @@ -98,7 +98,7 @@ int test_flow_dissector_delete(struct __sk_buff *skb 
> __always_unused)
>  }
>  
>  SEC("flow_dissector")
> -__failure __msg("program of this type cannot use helper bpf_sk_release")
> +__failure __msg("cannot update sockmap in this context")
>  int test_flow_dissector_update(struct __sk_buff *skb __always_unused)
>  {
>       test_sockmap_lookup_and_update(); /* no access to skb->sk */
> @@ -146,7 +146,7 @@ int test_sk_reuseport(struct sk_reuseport_md *ctx)
>  }
>  
>  SEC("socket")
> -__success
> +__failure __msg("cannot update sockmap in this context")
>  int test_socket_filter(struct __sk_buff *skb)
>  {
>       test_sockmap_mutate(skb->sk);
> @@ -179,7 +179,7 @@ int test_sockops_update_dedicated(struct bpf_sock_ops 
> *ctx)
>  }
>  
>  SEC("xdp")
> -__success
> +__failure __msg("cannot update sockmap in this context")
>  int test_xdp(struct xdp_md *ctx __always_unused)
>  {
>       test_sockmap_lookup_and_mutate();


Reply via email to