Re: [PATCH bpf-next v2 11/21] bpf: Add tracing_multi link support for bpf progs
flat view
From: Jiri Olsa <hidden>
Date: 2026-10-14 21:45:11
Also in:
bpf, linux-kselftest, lkml
On Mon, Oct 12, 2026 at 11:40:13PM +0800, Leon Hwang wrote: SNIP
quoted hunk ↗ jump to hunk
@@ -3787,64 +3796,129 @@ static const struct bpf_link_ops bpf_tracing_multi_link_lops = { #endif }; -static int ids_cmp_r(const void *pa, const void *pb, const void *priv __maybe_unused) +struct tracing_multi_sort_data { + u64 *keys; + struct bpf_prog **progs; + u32 *ids; + u64 *cookies; +}; + +static int keys_cmp_r(const void *pa, const void *pb, const void *priv __maybe_unused) { - u32 a = *(u32 *) pa; - u32 b = *(u32 *) pb;
I think you could just s/32/64/ and keep the rest in here and have simpler diff
quoted hunk ↗ jump to hunk
+ const u64 *key_a = pa, *key_b = pb; - return (a > b) - (a < b); + return (*key_a > *key_b) - (*key_a < *key_b); } -static void ids_swap_r(void *a, void *b, int size __maybe_unused, - const void *priv __maybe_unused) +static void keys_swap_r(void *a, void *b, int size __maybe_unused, + const void *priv __maybe_unused) { + const struct tracing_multi_sort_data *data = priv; + struct bpf_prog **prog_a, **prog_b; u64 *cookie_a, *cookie_b, *cookies; - u32 *id_a = a, *id_b = b, *ids; - void **data = (void **) priv; + u64 *key_a = a, *key_b = b, *keys; + u32 *id_a, *id_b, *ids; + + keys = data->keys; + ids = data->ids; + cookies = data->cookies; + id_a = ids + (key_a - keys); + id_b = ids + (key_b - keys); - ids = data[0]; - cookies = data[1]; + if (data->progs) {
nit, let's unify with the rest of the code and have progs variable for data->progs ? SNIP
quoted hunk ↗ jump to hunk
- err = check_dup_ids(ids, cookies, cnt); + keys = kvmalloc_objs(*keys, cnt); + if (!keys) { + err = -ENOMEM; + goto error; + } + + for (int i = 0; i < cnt; i++) + keys[i] = bpf_trampoline_compute_key(progs ? progs[i] : NULL, btf, ids[i]); + + err = check_dup_keys(keys, progs, ids, cookies, cnt); if (err) goto error;@@ -3908,19 +4022,32 @@ int bpf_tracing_multi_attach(struct bpf_prog *prog, const union bpf_attr *attr) link->nodes_cnt = cnt; link->cookies = cookies; link->fexits = fexits; + link->tgt_progs = progs; + link->pokes = pokes; - err = bpf_trampoline_multi_attach(prog, ids, link); + if (progs) + err = bpf_trampoline_multi_prog_attach(prog, ids, keys, link);
you need keys computed ahead for dups check, so let's the above bpf_trampoline_compute_key calls be the single place we compute keys and pass keys to bpf_trampoline_multi_attach below as well?
+ else + err = bpf_trampoline_multi_attach(prog, ids, link);
nit, let's add empty line in here?
quoted hunk ↗ jump to hunk
kvfree(ids); + kvfree(keys); + kvfree(fds); if (err) { + bpf_put_progs(progs, cnt); bpf_link_cleanup(&link_primer); return err; } return bpf_link_settle(&link_primer);
thanks, jirka