From: Joe Burton <jevburton@xxxxxxxxxx> The macros BPF_TRACE_MAP_{K,KV} provide a convenient way to invoke tracing programs. Maps will register themselves with a late_initcall() then use these macros to invoke tracing programs. Signed-off-by: Joe Burton <jevburton@xxxxxxxxxx> --- include/linux/bpf.h | 13 +++++++++++++ kernel/bpf/map_trace.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 6f7aeeedca07..73f4524c1c29 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1532,6 +1532,16 @@ struct bpf_map_trace_progs { struct mutex mutex; /* protects writes to progs, length */ }; +struct bpf_map_trace_ctx__update_elem { + __bpf_md_ptr(void *, key); + __bpf_md_ptr(void *, value); + u64 flags; +}; + +struct bpf_map_trace_ctx__delete_elem { + __bpf_md_ptr(void *, key); +}; + struct bpf_map_trace_reg { const char *target; enum bpf_map_trace_type trace_type; @@ -1560,6 +1570,9 @@ int bpf_map_trace_reg_target(const struct bpf_map_trace_reg *reg_info); int bpf_map_trace_link_attach(const union bpf_attr *attr, bpfptr_t uattr, struct bpf_prog *prog); int bpf_iter_link_attach(const union bpf_attr *attr, bpfptr_t uattr, struct bpf_prog *prog); +void bpf_trace_map_update_elem(struct bpf_map *map, void *key, void *value, + u64 flags); +void bpf_trace_map_delete_elem(struct bpf_map *map, void *key); int bpf_iter_new_fd(struct bpf_link *link); bool bpf_link_is_iter(struct bpf_link *link); struct bpf_prog *bpf_iter_get_info(struct bpf_iter_meta *meta, bool in_stop); diff --git a/kernel/bpf/map_trace.c b/kernel/bpf/map_trace.c index ed0cbc941522..77a55f8cd119 100644 --- a/kernel/bpf/map_trace.c +++ b/kernel/bpf/map_trace.c @@ -295,3 +295,43 @@ int bpf_map_trace_link_attach(const union bpf_attr *attr, bpfptr_t uattr, return err; } +static void bpf_map_trace_run_progs(struct bpf_map *map, + enum bpf_map_trace_type trace_type, + void *ctx) +{ + struct bpf_map_trace_prog *prog; + + if (!map->trace_progs) + return; + + rcu_read_lock(); + migrate_disable(); + list_for_each_entry_rcu(prog, + &map->trace_progs->progs[trace_type].list, + list) { + bpf_prog_run(prog->prog, ctx); /* return code is ignored */ + } + migrate_enable(); + rcu_read_unlock(); +} + +void bpf_trace_map_update_elem(struct bpf_map *map, + void *key, void *value, u64 flags) +{ + struct bpf_map_trace_ctx__update_elem ctx; + + ctx.key = key; + ctx.value = value; + ctx.flags = flags; + bpf_map_trace_run_progs(map, BPF_MAP_TRACE_UPDATE_ELEM, &ctx); +} + +void bpf_trace_map_delete_elem(struct bpf_map *map, + void *key) +{ + struct bpf_map_trace_ctx__delete_elem ctx; + + ctx.key = key; + bpf_map_trace_run_progs(map, BPF_MAP_TRACE_DELETE_ELEM, &ctx); +} + -- 2.33.0.685.g46640cef36-goog