From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mta0.migadu.com (out-118.mta0.migadu.com [91.218.175.118]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB9974B0C9E for ; Mon, 12 Oct 2026 15:44:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.118 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791819848; cv=none; b=daqVhS/2qUXRrrykXKj70jXnQfJsEn3cnxptiRt5Ad93Lcr5qRb8cKPd05Cn6OyhbIWb3crrZtXEerLkFP0EFCLROzsf3AL0GlIs3gphsXf72nfpbEswV/Oe5bLOA4ZvQNk2H2DJPqbmEPCMkjTCRACOiHrQelRlCgtqPi/ToOY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791819848; c=relaxed/simple; bh=cOhbqXHkl6SlTcAtVOKjdSMpbOhfUBeEfkkk54rz7Po=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bmVCSp4yZhnH75xz3GfKCxJwhYhle6IEfoMtyY+b5/fs+dnVVPLxV2ohXFPT3rM0P4anmFjGCRmr8PR5tK38f60BRupBa+PjoCD6WMW2DWh3RUHr96Gowq7iTmKq0tEz5kgUzOSjGQdpMKAwIqH/XVruJR9Hv/e8SS8F+Evz+U0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=UljPOyX1; arc=none smtp.client-ip=91.218.175.118 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="UljPOyX1" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=cOhbqXHkl6SlTcAtVOKjdSMpbOhfUBeEfkkk54rz7Po=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1791819842; v=1; x=1792424642; b=UljPOyX1mqP545nfFEYA+4TaMwNoRrKLjGmBQhXzu+t+NsmZBYxyKPu2VJMyz0SRhSmuQk8q nfzTXNejOvnNg272Aw13w+blcMt/gVKL06lXrQqHI4vd+OokmQT7t3/LeNV7i0q7SixLM8Lhc6c BCEodN+SUydE/4IBGvPZyjGQ= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id b46abf1550ee1e69; Mon, 12 Oct 2026 15:44:02 +0000 X-Mizu-Trace-ID: b46abf1550ee1e69 X-Migadu-Flow: FLOW_OUT From: Leon Hwang To: bpf@vger.kernel.org Cc: Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrii Nakryiko , Eduard Zingerman , Kumar Kartikeya Dwivedi , Martin KaFai Lau , Song Liu , Yonghong Song , Jiri Olsa , Emil Tsalapatis , Ihor Solodrai , Quentin Monnet , Shuah Khan , Leon Hwang , Mykyta Yatsenko , Avinash Duduskar , Anton Protopopov , Amery Hung , Jordan Rife , Rong Tao , Eyal Birger , Pu Lehui , Jingguo Tan , Lin Ma , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH bpf-next v2 12/21] libbpf: Add tracing_multi link support for bpf progs Date: Mon, 12 Oct 2026 23:40:14 +0800 Message-ID: <20261012154024.29423-13-leon.hwang@linux.dev> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261012154024.29423-1-leon.hwang@linux.dev> References: <20261012154024.29423-1-leon.hwang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit By design, a tracing_multi link does not support both kernel functions and bpf progs at the same time. In libbpf, the bpf_tracing_multi_opts options provides two new fields for tracing bpf progs: * 'fds': the fd array of the target bpf progs. One fd must be provided multiple times for multiple targets. * 'funcs': the function name array of the target bpf progs. The 'cnt' field indicates the size of both 'fds' and 'funcs' arrays. The 'funcs' will be translated to 'ids' by 'libbpf_find_prog_btf_id()'. At last, 'fds'+'ids' will be passed to kernel. Signed-off-by: Leon Hwang --- tools/lib/bpf/bpf.c | 1 + tools/lib/bpf/bpf.h | 2 ++ tools/lib/bpf/libbpf.c | 41 +++++++++++++++++++++++++++++++++++++---- tools/lib/bpf/libbpf.h | 4 +++- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index b49822d212ae..4a78ccba9df2 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -852,6 +852,7 @@ int bpf_link_create(int prog_fd, int target_fd, attr.link_create.tracing_multi.ids = ptr_to_u64(OPTS_GET(opts, tracing_multi.ids, 0)); attr.link_create.tracing_multi.cookies = ptr_to_u64(OPTS_GET(opts, tracing_multi.cookies, 0)); attr.link_create.tracing_multi.cnt = OPTS_GET(opts, tracing_multi.cnt, 0); + attr.link_create.tracing_multi.fds = ptr_to_u64(OPTS_GET(opts, tracing_multi.fds, 0)); if (!OPTS_ZEROED(opts, tracing_multi)) return libbpf_err(-EINVAL); break; diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h index 826d9cc9ab65..cc37cf622dd8 100644 --- a/tools/lib/bpf/bpf.h +++ b/tools/lib/bpf/bpf.h @@ -474,6 +474,8 @@ struct bpf_link_create_opts { const __u32 *ids; const __u64 *cookies; __u32 cnt; + __u32 :32; + const int *fds; } tracing_multi; }; size_t :0; diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index cb09ded90773..edc5e8e813f3 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -13671,10 +13671,12 @@ bpf_program__attach_tracing_multi(const struct bpf_program *prog, const char *pa { LIBBPF_OPTS(bpf_link_create_opts, lopts); int prog_fd, link_fd, err, cnt; + struct bpf_link *link = NULL; __u32 *free_ids = NULL; - struct bpf_link *link; const __u64 *cookies; + const char **funcs; const __u32 *ids; + const int *fds; if (!OPTS_VALID(opts, bpf_tracing_multi_opts)) return libbpf_err_ptr(-EINVAL); @@ -13689,12 +13691,22 @@ bpf_program__attach_tracing_multi(const struct bpf_program *prog, const char *pa cnt = OPTS_GET(opts, cnt, 0); ids = OPTS_GET(opts, ids, NULL); cookies = OPTS_GET(opts, cookies, NULL); + fds = OPTS_GET(opts, fds, NULL); + funcs = OPTS_GET(opts, funcs, NULL); - if (!!ids != !!cnt) + if (ids && fds) + return libbpf_err_ptr(-EINVAL); + if (!!fds != !!funcs) + return libbpf_err_ptr(-EINVAL); + if (fds && !cnt) return libbpf_err_ptr(-EINVAL); - if (pattern && (ids || cookies)) + if (ids && !cnt) return libbpf_err_ptr(-EINVAL); - if (!pattern && !ids) + if (!fds && !ids && cnt) + return libbpf_err_ptr(-EINVAL); + if (pattern && (fds || ids || cookies)) + return libbpf_err_ptr(-EINVAL); + if (!pattern && !ids && !fds) return libbpf_err_ptr(-EINVAL); if (pattern) { @@ -13704,11 +13716,32 @@ bpf_program__attach_tracing_multi(const struct bpf_program *prog, const char *pa if (cnt == 0) return libbpf_err_ptr(-EINVAL); ids = (const __u32 *) free_ids; + } else if (fds) { + size_t cap = 0; + int i; + + err = libbpf_ensure_mem((void **) &free_ids, &cap, sizeof(*free_ids), cnt); + if (err) + return libbpf_err_ptr(err); + + for (i = 0; i < cnt; i++) { + if (!funcs[i]) { + err = -EINVAL; + goto error; + } + err = libbpf_find_prog_btf_id(funcs[i], fds[i], prog->obj->token_fd); + if (err < 0) + goto error; + + free_ids[i] = err; + } + ids = (const __u32 *) free_ids; } lopts.tracing_multi.ids = ids; lopts.tracing_multi.cookies = cookies; lopts.tracing_multi.cnt = cnt; + lopts.tracing_multi.fds = fds; link = calloc(1, sizeof(*link)); if (!link) { diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 03f794f4adb0..612f3e17ebc2 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -746,10 +746,12 @@ struct bpf_tracing_multi_opts { const __u32 *ids; const __u64 *cookies; size_t cnt; + const int *fds; + const char **funcs; size_t :0; }; -#define bpf_tracing_multi_opts__last_field cnt +#define bpf_tracing_multi_opts__last_field funcs LIBBPF_API struct bpf_link * bpf_program__attach_tracing_multi(const struct bpf_program *prog, const char *pattern, -- 2.55.0