From: Joe Burton <jevburton@xxxxxxxxxx> This is the fourth version of a patch series implementing map tracing. Map tracing enables executing BPF programs upon BPF map updates. This might be useful to perform upgrades of stateful programs; e.g., tracing programs can propagate changes to maps that occur during an upgrade operation. This version uses trampoline hooks to provide the capability. fentry/fexit/fmod_ret programs can attach to two new functions: int bpf_map_trace_update_elem(struct bpf_map* map, void* key, void* val, u32 flags); int bpf_map_trace_delete_elem(struct bpf_map* map, void* key); These hooks work as intended for the following map types: BPF_MAP_TYPE_ARRAY BPF_MAP_TYPE_PERCPU_ARRAY BPF_MAP_TYPE_HASH BPF_MAP_TYPE_PERCPU_HASH BPF_MAP_TYPE_LRU_HASH BPF_MAP_TYPE_LRU_PERCPU_HASH The only guarantee about the semantics of these hooks is that they execute after the operation takes place. We cannot call them with locks held because the hooked program might try to acquire the same locks. Changes from v3 -> v4: * Hooks execute *after* the associated operation, not before. * Replaced `#pragma once' with traditional `#ifdef' guards. * Explicitly constrained selftests to x86, since trampolines are only implemented there. * Use /dev/null instead of /tmp/map_trace_test_file in selftests. Changes from v2 -> v3: * Reimplemented using trampoline hooks, simplifying greatly. Changes from v1 -> v2: * None. Resent series to a broader audience. Joe Burton (3): bpf: Add map tracing functions and call sites bpf: Add selftests bpf: Add real world example for map tracing kernel/bpf/Makefile | 2 +- kernel/bpf/arraymap.c | 4 +- kernel/bpf/hashtab.c | 20 +- kernel/bpf/map_trace.c | 17 + kernel/bpf/map_trace.h | 19 + .../selftests/bpf/prog_tests/map_trace.c | 427 ++++++++++++++++++ .../selftests/bpf/progs/bpf_map_trace.c | 95 ++++ .../bpf/progs/bpf_map_trace_common.h | 12 + .../progs/bpf_map_trace_real_world_common.h | 125 +++++ .../bpf_map_trace_real_world_migration.c | 102 +++++ .../bpf/progs/bpf_map_trace_real_world_new.c | 4 + .../bpf/progs/bpf_map_trace_real_world_old.c | 5 + 12 files changed, 829 insertions(+), 3 deletions(-) create mode 100644 kernel/bpf/map_trace.c create mode 100644 kernel/bpf/map_trace.h create mode 100644 tools/testing/selftests/bpf/prog_tests/map_trace.c create mode 100644 tools/testing/selftests/bpf/progs/bpf_map_trace.c create mode 100644 tools/testing/selftests/bpf/progs/bpf_map_trace_common.h create mode 100644 tools/testing/selftests/bpf/progs/bpf_map_trace_real_world_common.h create mode 100644 tools/testing/selftests/bpf/progs/bpf_map_trace_real_world_migration.c create mode 100644 tools/testing/selftests/bpf/progs/bpf_map_trace_real_world_new.c create mode 100644 tools/testing/selftests/bpf/progs/bpf_map_trace_real_world_old.c -- 2.34.1.448.ga2b2bfdf31-goog