From nobody Sat Feb 7 07:09:37 2026 Received: from mail-pl1-f193.google.com (mail-pl1-f193.google.com [209.85.214.193]) (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 02AA5346FBA for ; Wed, 17 Dec 2025 09:55:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965306; cv=none; b=bhAsBv4BogHbhKPXFHV2zqqdbYQ4pzhkZFQGyzCl+ZV5Ur9tNhjROuD2KXVGI0NInwZKmfVAG0WEqaXMLBbNp405bgasyTiL5zafDFmuxYEfM2UIcRfGN5RdNMmyIYmmYPCdCHI4DTiGY14LgznhWfeAZ8wlzo5F+5jdvwbWs4U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965306; c=relaxed/simple; bh=NZAPqHbVOTcwHPE6sn3Y0XChweULWb9wb/XUWjx76n4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=J1KjiXNPuUawKqVcwB+qAEgbckoOxRNceyWnuYmhe08FwCnHCJTHOUgxBUJlPaqu5MqsuTCZR1PCVfjvUzNlrWZQKXNarxH/6cdxbVUAAmB4bdmDQIA3EWIgPQQY9sNoUkmLKY4SiUJPlDP93XNkYa8Uc568d/KD1h0ETkXgxKI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HMPfopSh; arc=none smtp.client-ip=209.85.214.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HMPfopSh" Received: by mail-pl1-f193.google.com with SMTP id d9443c01a7336-2a0d5c365ceso43625815ad.3 for ; Wed, 17 Dec 2025 01:55:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765965302; x=1766570102; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=TRTW3VF14hn+wwZuXpE8a7nEdyNYwGHHBVH+dg7799E=; b=HMPfopShjwNw1HHh1pyFgzjgkSbMiWTHFw2rO1DH1dzzq1PJ+Mzo2C8FHWC+xMOGP2 1RCiF4ccWrUyhbX4NxspYbH0LcQsey3cnj4ck+7BCPe+gNzIW3OFmIqAn6f8YlW0Ocu+ qZQNVh8XfuOk5+HhXW/6wXQyaXOsmYQ4y1Xxk3h4LgsoNVathaKG1oErm3oRWhatS3ZA jjz10AorecHPws6OBcLo1aZDrGZhYDkNl+dyPN+AB/Zl568ieWzlRYiulZyRzSKhJgXM EnpmLlXd3fZud55fC/lxqW8zD7Lrw9yZQnwHZH8oXezj73SLW/Nd+DlVsMI9xfRRWLY5 ivWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765965302; x=1766570102; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=TRTW3VF14hn+wwZuXpE8a7nEdyNYwGHHBVH+dg7799E=; b=RrULnKxlAzbwOh+hF+9eyMOCd3NLB71UdMlQPVTYCyGuyrVJmWHqWywwCq0d/l7fWa aQrFzJtFPRtPe3DSTA8OK7VWSq/Li+3D5ebLxWZWchMEiYaAZghH/ScgOC1DHbD3ySx4 FGEQ/SnwEHvONg+cQXnShudIhNh75cYxFzxHByBOyppqYekR3WDF9Ec809RtHIg0USBt bHBkn0HSlD9L5TXU+K932Z/arvc+6ELkQqZY/4OY3CTvyzWfjBibzvU28XXB/m+5ZUuU X8Kixv+Xw/rETTpmOT1aCzStVxt+elN//2ILapj01BhdCIGapzpqLQTAxm+iJ8ZglGqV rAzQ== X-Forwarded-Encrypted: i=1; AJvYcCUQfYioMiJAPKN0RtPLxPwgsNL2DYn3U1wnuQaCSNMN+EUirV7ttBTdDvfwEZZHF7fV1ByE9ORSveess6s=@vger.kernel.org X-Gm-Message-State: AOJu0YzG5kDdfANEVn3QxxDfitKHbavhuRe6ZlbxToznE1O3x/0HDq+3 WTCwQmyeg4235d3LJCogafNc5sVFMRRiraUEzr77bamn2/+BVFRs9sFL X-Gm-Gg: AY/fxX53WCcPgdNNaBSYUV8TOHAkv46fcxdoRoLskuw6Ez6j7gTV+0mhIVZd7d7TOl5 NuAgcgImzW1dDPqw25+oBr7VeRO6lu0fHRjImoQCWi1105RuTY5mUMGYVfA3sp0vGQuDi6leKvG fHrTRqNAat4E46PdCXkGxLbw+GMlhNpAf6MpF4WJMx/ZMRjeTSkHqun7wJ9n7r7FU7jiPSKWDjJ C0uieiA3ZszwRVVCTZ8kV/cLhLz6CcUw6WzkyribP9SiR1iuVh9bCfP684DrFxc5kvR5NHtGH86 6P8E/N9YfHymRhnSkQ5rKO9l4Ee7p8FWzg7m0t9+XM6VA3QPxHq4klshrVTUrkHQhMwmg6KD4CS fyyDvBxepNygyDdLcbB+DhIXCefKebC+p2igT5y7n3MSoHupSIZv568eGx+fj6yz2H42dPrv5Wh E1rDEU5+I= X-Google-Smtp-Source: AGHT+IEihOl4ItOzDP1E+DFQ+QN728xz6D3Ivh3seGrvpT7WobWr7xXB58/Hs5Edn/L7SVPsCc92tg== X-Received: by 2002:a17:903:2c9:b0:298:55c8:eb8d with SMTP id d9443c01a7336-29f23c7ba82mr191519725ad.35.1765965302096; Wed, 17 Dec 2025 01:55:02 -0800 (PST) Received: from 7940hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a07fa0b1aasm140715945ad.3.2025.12.17.01.54.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Dec 2025 01:55:01 -0800 (PST) From: Menglong Dong X-Google-Original-From: Menglong Dong To: ast@kernel.org, andrii@kernel.org Cc: davem@davemloft.net, dsahern@kernel.org, daniel@iogearbox.net, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH bpf-next v4 1/9] bpf: add tracing session support Date: Wed, 17 Dec 2025 17:54:37 +0800 Message-ID: <20251217095445.218428-2-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251217095445.218428-1-dongml2@chinatelecom.cn> References: <20251217095445.218428-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The tracing session is something that similar to kprobe session. It allow to attach a single BPF program to both the entry and the exit of the target functions. Introduce the struct bpf_fsession_link, which allows to add the link to both the fentry and fexit progs_hlist of the trampoline. Signed-off-by: Menglong Dong Co-developed-by: Leon Hwang Signed-off-by: Leon Hwang --- v4: - instead of adding a new hlist to progs_hlist in trampoline, add the bpf program to both the fentry hlist and the fexit hlist. --- include/linux/bpf.h | 20 +++++++++++ include/uapi/linux/bpf.h | 1 + kernel/bpf/btf.c | 2 ++ kernel/bpf/syscall.c | 18 +++++++++- kernel/bpf/trampoline.c | 36 +++++++++++++++---- kernel/bpf/verifier.c | 12 +++++-- net/bpf/test_run.c | 1 + net/core/bpf_sk_storage.c | 1 + tools/include/uapi/linux/bpf.h | 1 + .../bpf/prog_tests/tracing_failure.c | 2 +- 10 files changed, 83 insertions(+), 11 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 28d8d6b7bb1e..3b2273b110b8 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1291,6 +1291,7 @@ enum bpf_tramp_prog_type { BPF_TRAMP_MODIFY_RETURN, BPF_TRAMP_MAX, BPF_TRAMP_REPLACE, /* more than MAX */ + BPF_TRAMP_SESSION, }; =20 struct bpf_tramp_image { @@ -1854,6 +1855,11 @@ struct bpf_tracing_link { struct bpf_prog *tgt_prog; }; =20 +struct bpf_fsession_link { + struct bpf_tracing_link link; + struct bpf_tramp_link fexit; +}; + struct bpf_raw_tp_link { struct bpf_link link; struct bpf_raw_event_map *btp; @@ -2114,6 +2120,20 @@ static inline void bpf_struct_ops_desc_release(struc= t bpf_struct_ops_desc *st_op =20 #endif =20 +static inline int bpf_fsession_cnt(struct bpf_tramp_links *links) +{ + struct bpf_tramp_links fentries =3D links[BPF_TRAMP_FENTRY]; + int cnt =3D 0; + + for (int i =3D 0; i < links[BPF_TRAMP_FENTRY].nr_links; i++) { + if (fentries.links[i]->link.prog->expected_attach_type =3D=3D + BPF_TRACE_SESSION) + cnt++; + } + + return cnt; +} + int bpf_prog_ctx_arg_info_init(struct bpf_prog *prog, const struct bpf_ctx_arg_aux *info, u32 cnt); =20 diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 84ced3ed2d21..696a7d37db0e 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -1145,6 +1145,7 @@ enum bpf_attach_type { BPF_NETKIT_PEER, BPF_TRACE_KPROBE_SESSION, BPF_TRACE_UPROBE_SESSION, + BPF_TRACE_SESSION, __MAX_BPF_ATTACH_TYPE }; =20 diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c index 0de8fc8a0e0b..2c1c3e0caff8 100644 --- a/kernel/bpf/btf.c +++ b/kernel/bpf/btf.c @@ -6107,6 +6107,7 @@ static int btf_validate_prog_ctx_type(struct bpf_veri= fier_log *log, const struct case BPF_TRACE_FENTRY: case BPF_TRACE_FEXIT: case BPF_MODIFY_RETURN: + case BPF_TRACE_SESSION: /* allow u64* as ctx */ if (btf_is_int(t) && t->size =3D=3D 8) return 0; @@ -6704,6 +6705,7 @@ bool btf_ctx_access(int off, int size, enum bpf_acces= s_type type, fallthrough; case BPF_LSM_CGROUP: case BPF_TRACE_FEXIT: + case BPF_TRACE_SESSION: /* When LSM programs are attached to void LSM hooks * they use FEXIT trampolines and when attached to * int LSM hooks, they use MODIFY_RETURN trampolines. diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 3080cc48bfc3..91c77f63261a 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -3579,6 +3579,7 @@ static int bpf_tracing_prog_attach(struct bpf_prog *p= rog, case BPF_PROG_TYPE_TRACING: if (prog->expected_attach_type !=3D BPF_TRACE_FENTRY && prog->expected_attach_type !=3D BPF_TRACE_FEXIT && + prog->expected_attach_type !=3D BPF_TRACE_SESSION && prog->expected_attach_type !=3D BPF_MODIFY_RETURN) { err =3D -EINVAL; goto out_put_prog; @@ -3628,7 +3629,21 @@ static int bpf_tracing_prog_attach(struct bpf_prog *= prog, key =3D bpf_trampoline_compute_key(tgt_prog, NULL, btf_id); } =20 - link =3D kzalloc(sizeof(*link), GFP_USER); + if (prog->expected_attach_type =3D=3D BPF_TRACE_SESSION) { + struct bpf_fsession_link *fslink; + + fslink =3D kzalloc(sizeof(*fslink), GFP_USER); + if (fslink) { + bpf_link_init(&fslink->fexit.link, BPF_LINK_TYPE_TRACING, + &bpf_tracing_link_lops, prog, attach_type); + fslink->fexit.cookie =3D bpf_cookie; + link =3D &fslink->link; + } else { + link =3D NULL; + } + } else { + link =3D kzalloc(sizeof(*link), GFP_USER); + } if (!link) { err =3D -ENOMEM; goto out_put_prog; @@ -4352,6 +4367,7 @@ attach_type_to_prog_type(enum bpf_attach_type attach_= type) case BPF_TRACE_RAW_TP: case BPF_TRACE_FENTRY: case BPF_TRACE_FEXIT: + case BPF_TRACE_SESSION: case BPF_MODIFY_RETURN: return BPF_PROG_TYPE_TRACING; case BPF_LSM_MAC: diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c index 976d89011b15..3b9fc99e1e89 100644 --- a/kernel/bpf/trampoline.c +++ b/kernel/bpf/trampoline.c @@ -111,7 +111,7 @@ bool bpf_prog_has_trampoline(const struct bpf_prog *pro= g) =20 return (ptype =3D=3D BPF_PROG_TYPE_TRACING && (eatype =3D=3D BPF_TRACE_FENTRY || eatype =3D=3D BPF_TRACE_FEXIT || - eatype =3D=3D BPF_MODIFY_RETURN)) || + eatype =3D=3D BPF_MODIFY_RETURN || eatype =3D=3D BPF_TRACE_SESSION)) || (ptype =3D=3D BPF_PROG_TYPE_LSM && eatype =3D=3D BPF_LSM_MAC); } =20 @@ -559,6 +559,8 @@ static enum bpf_tramp_prog_type bpf_attach_type_to_tram= p(struct bpf_prog *prog) return BPF_TRAMP_MODIFY_RETURN; case BPF_TRACE_FEXIT: return BPF_TRAMP_FEXIT; + case BPF_TRACE_SESSION: + return BPF_TRAMP_SESSION; case BPF_LSM_MAC: if (!prog->aux->attach_func_proto->type) /* The function returns void, we cannot modify its @@ -594,12 +596,13 @@ static int __bpf_trampoline_link_prog(struct bpf_tram= p_link *link, struct bpf_trampoline *tr, struct bpf_prog *tgt_prog) { - enum bpf_tramp_prog_type kind; - struct bpf_tramp_link *link_exiting; + enum bpf_tramp_prog_type kind, okind; + struct bpf_tramp_link *link_existing; + struct bpf_fsession_link *fslink; int err =3D 0; int cnt =3D 0, i; =20 - kind =3D bpf_attach_type_to_tramp(link->link.prog); + okind =3D kind =3D bpf_attach_type_to_tramp(link->link.prog); if (tr->extension_prog) /* cannot attach fentry/fexit if extension prog is attached. * cannot overwrite extension prog either. @@ -621,13 +624,18 @@ static int __bpf_trampoline_link_prog(struct bpf_tram= p_link *link, BPF_MOD_JUMP, NULL, link->link.prog->bpf_func); } + if (kind =3D=3D BPF_TRAMP_SESSION) { + /* deal with fsession as fentry by default */ + kind =3D BPF_TRAMP_FENTRY; + cnt++; + } if (cnt >=3D BPF_MAX_TRAMP_LINKS) return -E2BIG; if (!hlist_unhashed(&link->tramp_hlist)) /* prog already linked */ return -EBUSY; - hlist_for_each_entry(link_exiting, &tr->progs_hlist[kind], tramp_hlist) { - if (link_exiting->link.prog !=3D link->link.prog) + hlist_for_each_entry(link_existing, &tr->progs_hlist[kind], tramp_hlist) { + if (link_existing->link.prog !=3D link->link.prog) continue; /* prog already linked */ return -EBUSY; @@ -635,8 +643,18 @@ static int __bpf_trampoline_link_prog(struct bpf_tramp= _link *link, =20 hlist_add_head(&link->tramp_hlist, &tr->progs_hlist[kind]); tr->progs_cnt[kind]++; + if (okind =3D=3D BPF_TRAMP_SESSION) { + fslink =3D container_of(link, struct bpf_fsession_link, link.link); + hlist_add_head(&fslink->fexit.tramp_hlist, + &tr->progs_hlist[BPF_TRAMP_FEXIT]); + tr->progs_cnt[BPF_TRAMP_FEXIT]++; + } err =3D bpf_trampoline_update(tr, true /* lock_direct_mutex */); if (err) { + if (okind =3D=3D BPF_TRAMP_SESSION) { + hlist_del_init(&fslink->fexit.tramp_hlist); + tr->progs_cnt[BPF_TRAMP_FEXIT]--; + } hlist_del_init(&link->tramp_hlist); tr->progs_cnt[kind]--; } @@ -659,6 +677,7 @@ static int __bpf_trampoline_unlink_prog(struct bpf_tram= p_link *link, struct bpf_trampoline *tr, struct bpf_prog *tgt_prog) { + struct bpf_fsession_link *fslink; enum bpf_tramp_prog_type kind; int err; =20 @@ -672,6 +691,11 @@ static int __bpf_trampoline_unlink_prog(struct bpf_tra= mp_link *link, guard(mutex)(&tgt_prog->aux->ext_mutex); tgt_prog->aux->is_extended =3D false; return err; + } else if (kind =3D=3D BPF_TRAMP_SESSION) { + fslink =3D container_of(link, struct bpf_fsession_link, link.link); + hlist_del_init(&fslink->fexit.tramp_hlist); + tr->progs_cnt[BPF_TRAMP_FEXIT]--; + kind =3D BPF_TRAMP_FENTRY; } hlist_del_init(&link->tramp_hlist); tr->progs_cnt[kind]--; diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index a31c032b2dd6..d399bfd2413f 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -17402,6 +17402,7 @@ static int check_return_code(struct bpf_verifier_en= v *env, int regno, const char switch (env->prog->expected_attach_type) { case BPF_TRACE_FENTRY: case BPF_TRACE_FEXIT: + case BPF_TRACE_SESSION: range =3D retval_range(0, 0); break; case BPF_TRACE_RAW_TP: @@ -23298,6 +23299,7 @@ static int do_misc_fixups(struct bpf_verifier_env *= env) if (prog_type =3D=3D BPF_PROG_TYPE_TRACING && insn->imm =3D=3D BPF_FUNC_get_func_ret) { if (eatype =3D=3D BPF_TRACE_FEXIT || + eatype =3D=3D BPF_TRACE_SESSION || eatype =3D=3D BPF_MODIFY_RETURN) { /* Load nr_args from ctx - 8 */ insn_buf[0] =3D BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8); @@ -24242,7 +24244,8 @@ int bpf_check_attach_target(struct bpf_verifier_log= *log, if (tgt_prog->type =3D=3D BPF_PROG_TYPE_TRACING && prog_extension && (tgt_prog->expected_attach_type =3D=3D BPF_TRACE_FENTRY || - tgt_prog->expected_attach_type =3D=3D BPF_TRACE_FEXIT)) { + tgt_prog->expected_attach_type =3D=3D BPF_TRACE_FEXIT || + tgt_prog->expected_attach_type =3D=3D BPF_TRACE_SESSION)) { /* Program extensions can extend all program types * except fentry/fexit. The reason is the following. * The fentry/fexit programs are used for performance @@ -24257,7 +24260,7 @@ int bpf_check_attach_target(struct bpf_verifier_log= *log, * beyond reasonable stack size. Hence extending fentry * is not allowed. */ - bpf_log(log, "Cannot extend fentry/fexit\n"); + bpf_log(log, "Cannot extend fentry/fexit/session\n"); return -EINVAL; } } else { @@ -24341,6 +24344,7 @@ int bpf_check_attach_target(struct bpf_verifier_log= *log, case BPF_LSM_CGROUP: case BPF_TRACE_FENTRY: case BPF_TRACE_FEXIT: + case BPF_TRACE_SESSION: if (!btf_type_is_func(t)) { bpf_log(log, "attach_btf_id %u is not a function\n", btf_id); @@ -24507,6 +24511,7 @@ static bool can_be_sleepable(struct bpf_prog *prog) case BPF_TRACE_FEXIT: case BPF_MODIFY_RETURN: case BPF_TRACE_ITER: + case BPF_TRACE_SESSION: return true; default: return false; @@ -24588,9 +24593,10 @@ static int check_attach_btf_id(struct bpf_verifier= _env *env) tgt_info.tgt_name); return -EINVAL; } else if ((prog->expected_attach_type =3D=3D BPF_TRACE_FEXIT || + prog->expected_attach_type =3D=3D BPF_TRACE_SESSION || prog->expected_attach_type =3D=3D BPF_MODIFY_RETURN) && btf_id_set_contains(&noreturn_deny, btf_id)) { - verbose(env, "Attaching fexit/fmod_ret to __noreturn function '%s' is re= jected.\n", + verbose(env, "Attaching fexit/session/fmod_ret to __noreturn function '%= s' is rejected.\n", tgt_info.tgt_name); return -EINVAL; } diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index 655efac6f133..ddec08b696de 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -685,6 +685,7 @@ int bpf_prog_test_run_tracing(struct bpf_prog *prog, switch (prog->expected_attach_type) { case BPF_TRACE_FENTRY: case BPF_TRACE_FEXIT: + case BPF_TRACE_SESSION: if (bpf_fentry_test1(1) !=3D 2 || bpf_fentry_test2(2, 3) !=3D 5 || bpf_fentry_test3(4, 5, 6) !=3D 15 || diff --git a/net/core/bpf_sk_storage.c b/net/core/bpf_sk_storage.c index 850dd736ccd1..afe28b558716 100644 --- a/net/core/bpf_sk_storage.c +++ b/net/core/bpf_sk_storage.c @@ -365,6 +365,7 @@ static bool bpf_sk_storage_tracing_allowed(const struct= bpf_prog *prog) return true; case BPF_TRACE_FENTRY: case BPF_TRACE_FEXIT: + case BPF_TRACE_SESSION: return !!strncmp(prog->aux->attach_func_name, "bpf_sk_storage", strlen("bpf_sk_storage")); default: diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 6b92b0847ec2..f0dec9f8f416 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -1145,6 +1145,7 @@ enum bpf_attach_type { BPF_NETKIT_PEER, BPF_TRACE_KPROBE_SESSION, BPF_TRACE_UPROBE_SESSION, + BPF_TRACE_SESSION, __MAX_BPF_ATTACH_TYPE }; =20 diff --git a/tools/testing/selftests/bpf/prog_tests/tracing_failure.c b/too= ls/testing/selftests/bpf/prog_tests/tracing_failure.c index 10e231965589..58b02552507d 100644 --- a/tools/testing/selftests/bpf/prog_tests/tracing_failure.c +++ b/tools/testing/selftests/bpf/prog_tests/tracing_failure.c @@ -73,7 +73,7 @@ static void test_tracing_deny(void) static void test_fexit_noreturns(void) { test_tracing_fail_prog("fexit_noreturns", - "Attaching fexit/fmod_ret to __noreturn function 'do_exit' is re= jected."); + "Attaching fexit/session/fmod_ret to __noreturn function 'do_exi= t' is rejected."); } =20 void test_tracing_failure(void) --=20 2.52.0 From nobody Sat Feb 7 07:09:37 2026 Received: from mail-pl1-f194.google.com (mail-pl1-f194.google.com [209.85.214.194]) (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 1AD05346FB5 for ; Wed, 17 Dec 2025 09:55:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.194 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965311; cv=none; b=SVXz0J08LTh3btF3NtC9JGlBVo2KbJxhdU618qkeg1gqQAMG82I3Ky6uc0m7NioMha4HSB1F/1ild54BbCuIulpZJVthj5gNEN9nt1R7IJKw6grQv3wNqt6pr70SeQ/lpp8wh8u23vNvOYHG3V16M47qy6hDI6LvvQ6EHQMJrI0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965311; c=relaxed/simple; bh=jNDDbcagd7GAuu2ax19vRmL3haiq1I8BaTv4/D338Qg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Cv1pq15zAIJp86uQ43SwHqUT5rq9qJn+i2vthK0kGhOfDVP1D+Ge8/ABSITnjmYtVOyT9D+MCp0sHmMV5R9fTfVehRq7uayR1PzqYkonCf/o/1cygakY3pZbfRozO3A1I8G7k7XVkstj9aFBFKfHl6C3HfCcHhTg0Rd54MsH1VY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=MP9jn1xi; arc=none smtp.client-ip=209.85.214.194 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="MP9jn1xi" Received: by mail-pl1-f194.google.com with SMTP id d9443c01a7336-2a0d67f1877so40254105ad.2 for ; Wed, 17 Dec 2025 01:55:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765965308; x=1766570108; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=uqU7Z+qRZovJUMSBsI+FDu17KbC0yuT8froZI9mKrQc=; b=MP9jn1xi0iE4uyh0iTVjLkcKV3V1Y94KL82so/SPnbVLs+QYkZ+o0q6VJkyP5cfJ54 sOYDHtnzv4fe26+hIcFE2ErUJd67fbm90Tv4TBBfD+2oIue9lmQ3HngRtzoaPPXE3kzl h4CV8ngd/UqgvfWbHMggps9H+XC3wz8bnLMng+1E1SFgXEZlfiw+BU4HuDwwKWMqFqP4 j2eDadkQyu7vZVjPnhUMPLMFAMcVTowHPoD2e+LIokG/NlYfc6wCvY0D0VCUON0eKNrV aSvE0zlqiQNJUWHiiUFcfHWk0vI6t0XKWXRse6RJdXZJTD/lnTE/78fbFmacGTgrdj93 f8Qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765965308; x=1766570108; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=uqU7Z+qRZovJUMSBsI+FDu17KbC0yuT8froZI9mKrQc=; b=Cwev4zhOTwdRwFtEE5+MR4SUA9w6HEIzNNhSiNUjhRPfbiHzQdiwhfgVSWJwW+TS8l bCQaztHZbqOGBnEvAEJ3qF7WKXo1E4d0MORL4F3pZK1fkYWLaZnbSriz17CZcjJWn4jB CaTpiqgFVM7QDtPecSlz0ndaDineAkE3Gu0ItNBnq8V/foQr6/pLPrpW0Q/OIU5gHRrL 7y401yYTvf06PwI77KKuLrrhRvov7EmEweVrI4QAf4aNj9GpWJI7SR2EwY6u3zlWv6vn yM5BIXGlCXWN6dmCVIe9XAnNgXXGZNIirWm+iZjOAJPQVNdxel2hNJecVeCVlg/xBGCs a+mA== X-Forwarded-Encrypted: i=1; AJvYcCU6ShHB8Xfrm73IwoR2tbzFY/M3/vJEYnjfHKFBXSoiBJCgve6bnZSb67yUF7U0d2o18gEkDWv6uTieaZI=@vger.kernel.org X-Gm-Message-State: AOJu0YyK2VXaDPLAVs7LfK7eqHOAz/mQj1yuykLvM73tZZB1dLM8YZ4+ w2WQe27i1Pu1NEgRsow8ETlGbqUdGgOpMidmRIeFmpfswsdCqm0UdM6T X-Gm-Gg: AY/fxX4ymifwMa4oCpspxIgLdCr4gvFNmc55E1mo+HpJ7Ldwuokd8MmGCflLUaARSxx 3+WaID42TPZ+my1+DJjDG6hcmM6EFBKkYK3XcVDm0apzhVEySR3fsEj/7xdTM2lg56uBesRZR2l OPcog1FxAMRQqUdDPU2WKirrrVKI5njSR7P/m/167/IUy60cKNTX/IiGNr+qIwUN59SG1ZyGwug 0SkQwbUqJRfp6p42rP0KbCGAX/JbojSGvaDSeTkCWet426EwgkJ5NnPt3uqG7XD38eTNgzusaba Q9cI524U+Hi5I7FGsIO/UeTdFGIJku4/JECYlDsin5GqeOkYdRcLr2h/FgEPhDyXOh2pnGFWNYq e1aMz7DBYX4dNBJ33KAkQeW35XShHgNVwUXiZhpgeqzwm720uVI9Vf9Ngx1JCmLSp450UKtdnsi uZe4jVJLg= X-Google-Smtp-Source: AGHT+IFILQ9PCGB1k7TzRUfGk8NAtRn8WD9pgKOijI5EAUlfitwWLOp+2LpFyNyqCtqlHGTd0BF75w== X-Received: by 2002:a17:902:f54b:b0:2a0:8963:c147 with SMTP id d9443c01a7336-2a08963c3fbmr154939745ad.45.1765965308289; Wed, 17 Dec 2025 01:55:08 -0800 (PST) Received: from 7940hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a07fa0b1aasm140715945ad.3.2025.12.17.01.55.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Dec 2025 01:55:07 -0800 (PST) From: Menglong Dong X-Google-Original-From: Menglong Dong To: ast@kernel.org, andrii@kernel.org Cc: davem@davemloft.net, dsahern@kernel.org, daniel@iogearbox.net, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH bpf-next v4 2/9] bpf: use last 8-bits for the nr_args in trampoline Date: Wed, 17 Dec 2025 17:54:38 +0800 Message-ID: <20251217095445.218428-3-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251217095445.218428-1-dongml2@chinatelecom.cn> References: <20251217095445.218428-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For now, ctx[-1] is used to store the nr_args in the trampoline. However, 1-byte is enough to store such information. Therefor, we use only the last byts of ctx[-1] to store the nr_args, and reverve the rest for other usages. Signed-off-by: Menglong Dong --- kernel/bpf/verifier.c | 35 +++++++++++++++++++---------------- kernel/trace/bpf_trace.c | 4 ++-- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index d399bfd2413f..96753833c090 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -23275,15 +23275,16 @@ static int do_misc_fixups(struct bpf_verifier_env= *env) insn->imm =3D=3D BPF_FUNC_get_func_arg) { /* Load nr_args from ctx - 8 */ insn_buf[0] =3D BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8); - insn_buf[1] =3D BPF_JMP32_REG(BPF_JGE, BPF_REG_2, BPF_REG_0, 6); - insn_buf[2] =3D BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 3); - insn_buf[3] =3D BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_1); - insn_buf[4] =3D BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 0); - insn_buf[5] =3D BPF_STX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0); - insn_buf[6] =3D BPF_MOV64_IMM(BPF_REG_0, 0); - insn_buf[7] =3D BPF_JMP_A(1); - insn_buf[8] =3D BPF_MOV64_IMM(BPF_REG_0, -EINVAL); - cnt =3D 9; + insn_buf[1] =3D BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xFF); + insn_buf[2] =3D BPF_JMP32_REG(BPF_JGE, BPF_REG_2, BPF_REG_0, 6); + insn_buf[3] =3D BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 3); + insn_buf[4] =3D BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_1); + insn_buf[5] =3D BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 0); + insn_buf[6] =3D BPF_STX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0); + insn_buf[7] =3D BPF_MOV64_IMM(BPF_REG_0, 0); + insn_buf[8] =3D BPF_JMP_A(1); + insn_buf[9] =3D BPF_MOV64_IMM(BPF_REG_0, -EINVAL); + cnt =3D 10; =20 new_prog =3D bpf_patch_insn_data(env, i + delta, insn_buf, cnt); if (!new_prog) @@ -23303,12 +23304,13 @@ static int do_misc_fixups(struct bpf_verifier_env= *env) eatype =3D=3D BPF_MODIFY_RETURN) { /* Load nr_args from ctx - 8 */ insn_buf[0] =3D BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8); - insn_buf[1] =3D BPF_ALU64_IMM(BPF_LSH, BPF_REG_0, 3); - insn_buf[2] =3D BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1); - insn_buf[3] =3D BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0); - insn_buf[4] =3D BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, 0); - insn_buf[5] =3D BPF_MOV64_IMM(BPF_REG_0, 0); - cnt =3D 6; + insn_buf[1] =3D BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xFF); + insn_buf[2] =3D BPF_ALU64_IMM(BPF_LSH, BPF_REG_0, 3); + insn_buf[3] =3D BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1); + insn_buf[4] =3D BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0); + insn_buf[5] =3D BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, 0); + insn_buf[6] =3D BPF_MOV64_IMM(BPF_REG_0, 0); + cnt =3D 7; } else { insn_buf[0] =3D BPF_MOV64_IMM(BPF_REG_0, -EOPNOTSUPP); cnt =3D 1; @@ -23329,8 +23331,9 @@ static int do_misc_fixups(struct bpf_verifier_env *= env) insn->imm =3D=3D BPF_FUNC_get_func_arg_cnt) { /* Load nr_args from ctx - 8 */ insn_buf[0] =3D BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8); + insn_buf[1] =3D BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xFF); =20 - new_prog =3D bpf_patch_insn_data(env, i + delta, insn_buf, 1); + new_prog =3D bpf_patch_insn_data(env, i + delta, insn_buf, 2); if (!new_prog) return -ENOMEM; =20 diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index d57727abaade..10c9992d2745 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -1194,7 +1194,7 @@ const struct bpf_func_proto bpf_get_branch_snapshot_p= roto =3D { BPF_CALL_3(get_func_arg, void *, ctx, u32, n, u64 *, value) { /* This helper call is inlined by verifier. */ - u64 nr_args =3D ((u64 *)ctx)[-1]; + u64 nr_args =3D ((u64 *)ctx)[-1] & 0xFF; =20 if ((u64) n >=3D nr_args) return -EINVAL; @@ -1214,7 +1214,7 @@ static const struct bpf_func_proto bpf_get_func_arg_p= roto =3D { BPF_CALL_2(get_func_ret, void *, ctx, u64 *, value) { /* This helper call is inlined by verifier. */ - u64 nr_args =3D ((u64 *)ctx)[-1]; + u64 nr_args =3D ((u64 *)ctx)[-1] & 0xFF; =20 *value =3D ((u64 *)ctx)[nr_args]; return 0; --=20 2.52.0 From nobody Sat Feb 7 07:09:37 2026 Received: from mail-pl1-f194.google.com (mail-pl1-f194.google.com [209.85.214.194]) (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 03D9E346FCF for ; Wed, 17 Dec 2025 09:55:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.194 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965317; cv=none; b=PacoxdDUCUIRvst6khnFFJiYT1F6TLDMKtH9kYaFLGBd5uFgHKc1mfbXnZA5qoWPkYB0mOLM2r8Sc+3I+lFiMlXJ+DgZkCYBDwP4j2jUnDJAlrlTZGdM6PBvSmNnhn9mDG7Sa+GmgjmzF6s2ARAQfTX//F9/tTAEWcKjdC5dEYI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965317; c=relaxed/simple; bh=tymsptnwVqCK+EBcdpyIreeoqu6nppQzBwVci64fanM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q3mbYp/fXRSs2LgOFvWTyR9Dju9zOLBD22GMFfdi9uaZdTMf8Igv8iX84RVmMYG6W6zeV5OVnevlnc7ZeyivE9sgC3dzS6/vCos9haf6fP1BOsOJKseEJviJhE/tXjg/ExVZS5AT690GgBLG6pmW2Vv4GHCzuFJDVodJWWL13K8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=WPrvMR0I; arc=none smtp.client-ip=209.85.214.194 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WPrvMR0I" Received: by mail-pl1-f194.google.com with SMTP id d9443c01a7336-2a0fe77d141so35536915ad.1 for ; Wed, 17 Dec 2025 01:55:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765965314; x=1766570114; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=t1qS6JRi8qK9u0+Jx90T9d6NveMH/Z/F2BRN/sKRPm4=; b=WPrvMR0I68AEa51oy93aa2+sPcido7jFbtaW2cqw4E/iI8fO994r61dRKuNQb6ACJY Os0SsHO+NtT1/w6RQggCcTpICkIyGXpwCx5LLjruEk/phWyi0J0goNIq+38Fs6XYnIkB SaWg6JMMGi5/fQCu3JwleGVU5FY4AhZAmdS6WsEYk2hbnIM17U4nBMKZGaaRGOof2aJw 3zQKFaZvSo/1LFXGe9vit5i/RheUV31zU4663TVfP9CyivXyCvaGJ+hUYXVIDJ/m8ct9 nWe7xpdFmARaMKzCtPwNj7Bdsp07hEDIkPtwAroUGVai6Ag1poNTHykp9EQ85eV4YTG0 gH0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765965314; x=1766570114; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=t1qS6JRi8qK9u0+Jx90T9d6NveMH/Z/F2BRN/sKRPm4=; b=R3fKVeULEFrztvY6Zhj+KYbQAzal7sllW9iNbi/KPwXQtIUeFkwkGig05+YTOrJyWF wkXVQW7CGi8w7OK7/EeAukcu+6+kGVwo3HHoueCa95pSVT117NAjcX3fUA1xmYpM2wc6 EsZWv5CVJ6lBW7vtcNRJZlbVY/4gnmTVCNQlqy8E98WP6tTcm0PNV9Bur5/GLtlHpMxW Z+Qmc8PMMX8IdXKJcXWWX6AZmA5LDeYE23jTLt5gMq5nLlMUM7yKYrtbX0+Xu8R+EgPA iaBWVHpKseGq1xHUbwg20mgGwwB8izKFhi3XFB6zAUhSnVwcGlzsaXuxM1R1g+gDRSQz avag== X-Forwarded-Encrypted: i=1; AJvYcCUYdb4Mse8JLYJTYsoYIcMnF/gabnLEhLibcvEnDxFT2Zz4bA0HH01rwwPVUpR3/+hg7a7sVipMfUEpGEE=@vger.kernel.org X-Gm-Message-State: AOJu0Yw8HJZJy8ehsFqgG9htpGRMAf2LW+jJmxt3wiM/DSyxF4J+XeDa Bp4cKr2edIk/Dg84G4W1ibpn2IAWMYG3uxBh94Vlu1C9/WAKWji5MJ66 X-Gm-Gg: AY/fxX4aiUhahXaqitPICEfdJ09EJVrOq0d2KYA92O3K7biPZ61q84ZuMmAeout1gIN USjjp/tXNjBghwGFMnCORuKhtzExmDtC2zyBe2a0+H1m6hNsssM3CE0uw0xwmaioSovqFYCreOa mC1XIpQSiNcPPwDXE62k/346C2CvKy2R0AoICh3+G8hT3gUsJPhJxkNbzMIQXbcWUtsCV1eKc/M /KpfH8qobEg5/OiTRt9m3MR+4IU+cgLoXOiD6HlNLgka8mJfQUVNarXC5iGjf4d/zwXf7vw7Z3J HaRtjfO+Ks2uycrFujs7F8RgDCBBGnfoaw+Uzpp02wdKZ1n7gvj6TgEK7jiCN+5TzaroD7FLjHB WUtazbxWPPPVX8CBSIGOY3EhSU7whYUKRgWbqbb7eSOXJdTmYPEjunrO5wZ3nhSkPs0cSNOmdeV WAn9t0Ml8= X-Google-Smtp-Source: AGHT+IEQq8TrbeOE2cQX+Q7hC7HE5fCgUKQ6Wa4zFxEAUFXrwzzRHEwSxyNL7jLjUfh2XRbWv8c0bw== X-Received: by 2002:a17:902:e750:b0:2a0:f488:253 with SMTP id d9443c01a7336-2a0f4880376mr115598385ad.52.1765965314206; Wed, 17 Dec 2025 01:55:14 -0800 (PST) Received: from 7940hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a07fa0b1aasm140715945ad.3.2025.12.17.01.55.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Dec 2025 01:55:13 -0800 (PST) From: Menglong Dong X-Google-Original-From: Menglong Dong To: ast@kernel.org, andrii@kernel.org Cc: davem@davemloft.net, dsahern@kernel.org, daniel@iogearbox.net, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH bpf-next v4 3/9] bpf: add the kfunc bpf_fsession_is_return Date: Wed, 17 Dec 2025 17:54:39 +0800 Message-ID: <20251217095445.218428-4-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251217095445.218428-1-dongml2@chinatelecom.cn> References: <20251217095445.218428-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If TRACE_SESSION exists, we will use the bit (1 << BPF_TRAMP_M_IS_RETURN) in ctx[-1] to store the "is_return" flag. Introduce the kfunc bpf_fsession_is_return(), which is used to tell if it is fexit currently. Meanwhile, inline it in the verifier. Signed-off-by: Menglong Dong Co-developed-by: Leon Hwang Signed-off-by: Leon Hwang --- v4: - split out the bpf_fsession_cookie() to another patch v3: - merge the bpf_tracing_is_exit and bpf_fsession_cookie into a single patch v2: - store the session flags after return value, instead of before nr_args - inline the bpf_tracing_is_exit, as Jiri suggested --- include/linux/bpf.h | 3 +++ kernel/bpf/verifier.c | 11 +++++++++- kernel/trace/bpf_trace.c | 43 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 3b2273b110b8..d165ace5cc9b 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1213,6 +1213,9 @@ enum { #endif }; =20 +#define BPF_TRAMP_M_NR_ARGS 0 +#define BPF_TRAMP_M_IS_RETURN 8 + struct bpf_tramp_links { struct bpf_tramp_link *links[BPF_MAX_TRAMP_LINKS]; int nr_links; diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 96753833c090..b0dcd715150f 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -12380,6 +12380,7 @@ enum special_kfunc_type { KF___bpf_trap, KF_bpf_task_work_schedule_signal_impl, KF_bpf_task_work_schedule_resume_impl, + KF_bpf_fsession_is_return, }; =20 BTF_ID_LIST(special_kfunc_list) @@ -12454,6 +12455,7 @@ BTF_ID(func, bpf_dynptr_file_discard) BTF_ID(func, __bpf_trap) BTF_ID(func, bpf_task_work_schedule_signal_impl) BTF_ID(func, bpf_task_work_schedule_resume_impl) +BTF_ID(func, bpf_fsession_is_return) =20 static bool is_task_work_add_kfunc(u32 func_id) { @@ -12508,7 +12510,8 @@ get_kfunc_ptr_arg_type(struct bpf_verifier_env *env, struct bpf_reg_state *reg =3D ®s[regno]; bool arg_mem_size =3D false; =20 - if (meta->func_id =3D=3D special_kfunc_list[KF_bpf_cast_to_kern_ctx]) + if (meta->func_id =3D=3D special_kfunc_list[KF_bpf_cast_to_kern_ctx] || + meta->func_id =3D=3D special_kfunc_list[KF_bpf_fsession_is_return]) return KF_ARG_PTR_TO_CTX; =20 /* In this function, we verify the kfunc's BTF as per the argument type, @@ -22556,6 +22559,12 @@ static int fixup_kfunc_call(struct bpf_verifier_en= v *env, struct bpf_insn *insn, desc->func_id =3D=3D special_kfunc_list[KF_bpf_rdonly_cast]) { insn_buf[0] =3D BPF_MOV64_REG(BPF_REG_0, BPF_REG_1); *cnt =3D 1; + } else if (desc->func_id =3D=3D special_kfunc_list[KF_bpf_fsession_is_ret= urn]) { + /* Load nr_args from ctx - 8 */ + insn_buf[0] =3D BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8); + insn_buf[1] =3D BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, BPF_TRAMP_M_IS_RETURN); + insn_buf[2] =3D BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1); + *cnt =3D 3; } =20 if (env->insn_aux_data[insn_idx].arg_prog) { diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 10c9992d2745..0857d77eb34c 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -3356,12 +3356,49 @@ static const struct btf_kfunc_id_set bpf_kprobe_mul= ti_kfunc_set =3D { .filter =3D bpf_kprobe_multi_filter, }; =20 -static int __init bpf_kprobe_multi_kfuncs_init(void) +__bpf_kfunc_start_defs(); + +__bpf_kfunc bool bpf_fsession_is_return(void *ctx) +{ + /* This helper call is inlined by verifier. */ + return !!(((u64 *)ctx)[-1] & (1 << BPF_TRAMP_M_IS_RETURN)); +} + +__bpf_kfunc_end_defs(); + +BTF_KFUNCS_START(tracing_kfunc_set_ids) +BTF_ID_FLAGS(func, bpf_fsession_is_return, KF_FASTCALL) +BTF_KFUNCS_END(tracing_kfunc_set_ids) + +static int bpf_tracing_filter(const struct bpf_prog *prog, u32 kfunc_id) { - return register_btf_kfunc_id_set(BPF_PROG_TYPE_KPROBE, &bpf_kprobe_multi_= kfunc_set); + if (!btf_id_set8_contains(&tracing_kfunc_set_ids, kfunc_id)) + return 0; + + if (prog->type !=3D BPF_PROG_TYPE_TRACING || + prog->expected_attach_type !=3D BPF_TRACE_SESSION) + return -EINVAL; + + return 0; +} + +static const struct btf_kfunc_id_set bpf_tracing_kfunc_set =3D { + .owner =3D THIS_MODULE, + .set =3D &tracing_kfunc_set_ids, + .filter =3D bpf_tracing_filter, +}; + +static int __init bpf_trace_kfuncs_init(void) +{ + int err =3D 0; + + err =3D err ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_KPROBE, &bpf_kprob= e_multi_kfunc_set); + err =3D err ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_TRACING, &bpf_trac= ing_kfunc_set); + + return err; } =20 -late_initcall(bpf_kprobe_multi_kfuncs_init); +late_initcall(bpf_trace_kfuncs_init); =20 typedef int (*copy_fn_t)(void *dst, const void *src, u32 size, struct task= _struct *tsk); =20 --=20 2.52.0 From nobody Sat Feb 7 07:09:37 2026 Received: from mail-pl1-f196.google.com (mail-pl1-f196.google.com [209.85.214.196]) (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 6B002346FA4 for ; Wed, 17 Dec 2025 09:55:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.196 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965323; cv=none; b=OOhwux5ywOJqrrGduSjt0waw8QVS5BIRQ6HKzd9VxWrX1D8ih6iUcwnSn1jEbGD2S18OcKc7kTEXW+Eo2vRu4p+gN7Y6PXnRJlzitg+SX47yfJxQNIq0M8aFmh69ouiQAH74n8lZIzCKE6nir91SfhY8egM6SNoEzhm5/OowNfw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965323; c=relaxed/simple; bh=r9OWKtTrZBvuK6cRz3Q7VLtGJ8ShWwZF5jF6bu5OQkg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HQw4fSQEgLT4zTLZfQdEsVtIm0p91VPOOwgVt3vL6yY/RQKsJJpqFQ7NIQB2FOlrXfR8edIgBSADQIt6bng9Yz8Jo9VR+Au1/SsZUjGUyRzLdeL1OYqdCv/VFL+hy1BE681Hfmrt6YPceNkrfgyzw6GyjjlIqnVWOnacuKBx+hI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=A1aWS9pd; arc=none smtp.client-ip=209.85.214.196 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="A1aWS9pd" Received: by mail-pl1-f196.google.com with SMTP id d9443c01a7336-2a0eaf55d58so2631655ad.1 for ; Wed, 17 Dec 2025 01:55:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765965321; x=1766570121; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SIUG0j0izpbuOIOjcj5qOjyjzCm2KAAyeIbCRoOd5tw=; b=A1aWS9pdQ/vK6LICRJXzaaVzr1ljldSqYScvdn7JJOAdQXQ0I9DdpCcKwS+qQuCsX/ 6XLyP6KFssmSdiJ7s0D14n92lRNaUB3WGy5cvCueqy700eUcpbU8uIZg14KakB5g4Sij 98hbw/iwaToMxxiaYGXlxALIPmFn8Wzze/bQZiz+7HCLjEHMJcZplZjIKMBDWLjK0Njv CpLHfGTHVaKmBUORdvGtLQBVgWq5uVP0B172YHuQkY5BsTfzpSAECi+YTcn4BA13zxxb jQ3rT0dMCKKe6tyM6eWNLFwwZQS0IGvTAgyDLn7ttBRuvXZVWahgBz2afwr43XbFsI/c DyWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765965321; x=1766570121; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=SIUG0j0izpbuOIOjcj5qOjyjzCm2KAAyeIbCRoOd5tw=; b=vcI2XrUHDWYPrn710mSbjH6gA/BE5qrkIsHzHo+PCVAJKBiPzN3KfK/h3J4TTNGJRo hrHK3CM7o+oq/Em+VJPGohPPKKEkuqSXiMDev4IUdqPVngYnSc0YJsGh5mH0enTNqNG+ dV+xwCRy3PgBc6MWn5OVbkFNKtgfjChIOLQ/ZlvAaQ6hL8ngBrwQ5A+tx7Z7sCzNW+Hd KcC+CTTGDn7NBZ0eNjndUHYOHWM5M0FjNys1N+OyHwd9RTSMzbJqSExe8T0Qx4PXW2Kp RICuECGWnGpCTBuVr0qPjSixBcwoc+veJIGoVsW3gjEIOPox04wRk/51aZnM2AtQlqwR FKSQ== X-Forwarded-Encrypted: i=1; AJvYcCUgAvNxVP0PHmrFLHuLRPAUY4juewr0VkJ2SqNAl76Juae3/9IhsHfcpYSKSFVyDs4P7BTm4Wrs99BWQ9I=@vger.kernel.org X-Gm-Message-State: AOJu0YyrCIy/C7JEDB+q2tR8ZVgUVdug8QwtunP7at9lLbTd2cSf9R0f m5+cQAQeZ9eq1cglBbZdYJaAaMqPRjaRybJB9/Oc88Vxc3YeroUTMu0K X-Gm-Gg: AY/fxX7bTXPhbOh1PHJaj2RFGRORxnEx05kCoBtD+0LzOEJW0ubpNj0Zb+M8oy69YeU ye1UAGMei26PvGwNaw1xV3gnn/jDpGVDD71pei9ElJmBUMANFMY6tMRHIXbDEf81CZ4lVfJi6NE LsWyGFJDi/tV42dY5yhfP1ItDbAA2ut8zmlBRWSV782eFGJxrLcUlWdL6DKRB1MJmoJ1er35/FB wdZ+aiBMZUvnZFsBujrrFOEmOFhqq91Hv6xGTVQefJOwTBQU6AwEP/dvj4Wl+WfpazB+iRijFAb FshM2QCmbFW5+pmpi2JxedK4jCS3y4iR7QzFu+hDZf5n58n0uIKP/11M9AOjaF7C4tNt3IyNtjY cjFpIvFqPWr2XDu8xq8y+6DzEHiIPRJ6pqiNt6+OLEAez1zSmUhehY5uHN+dirU/42wp347clmI JZ5VWLCy4= X-Google-Smtp-Source: AGHT+IEuEY2zhpSK6Ll67atcuqDpoLvacpwbYPpKQY7yzrvl2cfM1mMD3OtWBmpiEx+BAtxFOmfWOA== X-Received: by 2002:a17:902:cf05:b0:2a0:e5c3:d149 with SMTP id d9443c01a7336-2a0e5c3d2c3mr108269105ad.23.1765965320723; Wed, 17 Dec 2025 01:55:20 -0800 (PST) Received: from 7940hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a07fa0b1aasm140715945ad.3.2025.12.17.01.55.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Dec 2025 01:55:20 -0800 (PST) From: Menglong Dong X-Google-Original-From: Menglong Dong To: ast@kernel.org, andrii@kernel.org Cc: davem@davemloft.net, dsahern@kernel.org, daniel@iogearbox.net, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH bpf-next v4 4/9] bpf: add the kfunc bpf_fsession_cookie Date: Wed, 17 Dec 2025 17:54:40 +0800 Message-ID: <20251217095445.218428-5-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251217095445.218428-1-dongml2@chinatelecom.cn> References: <20251217095445.218428-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implement session cookie for fsession. In order to limit the stack usage, we make 4 as the maximum of the cookie count. The offset of the current cookie is stored in the "(ctx[-1] >> BPF_TRAMP_M_COOKIE) & 0xFF". Therefore, we can get the session cookie with ctx[-offset]. The stack will look like this: return value -> 8 bytes argN -> 8 bytes ... arg1 -> 8 bytes nr_args -> 8 bytes ip(optional) -> 8 bytes cookie2 -> 8 bytes cookie1 -> 8 bytes Inline the bpf_fsession_cookie() in the verifer too. Signed-off-by: Menglong Dong --- v4: - limit the maximum of the cookie count to 4 - store the session cookies before nr_regs in stack --- include/linux/bpf.h | 16 ++++++++++++++++ kernel/bpf/trampoline.c | 14 +++++++++++++- kernel/bpf/verifier.c | 20 ++++++++++++++++++-- kernel/trace/bpf_trace.c | 9 +++++++++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index d165ace5cc9b..0f35c6ab538c 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1215,6 +1215,7 @@ enum { =20 #define BPF_TRAMP_M_NR_ARGS 0 #define BPF_TRAMP_M_IS_RETURN 8 +#define BPF_TRAMP_M_COOKIE 9 =20 struct bpf_tramp_links { struct bpf_tramp_link *links[BPF_MAX_TRAMP_LINKS]; @@ -1318,6 +1319,7 @@ struct bpf_trampoline { struct mutex mutex; refcount_t refcnt; u32 flags; + int cookie_cnt; u64 key; struct { struct btf_func_model model; @@ -1762,6 +1764,7 @@ struct bpf_prog { enforce_expected_attach_type:1, /* Enforce expected_attach_type checki= ng at attach time */ call_get_stack:1, /* Do we call bpf_get_stack() or bpf_get_stackid() */ call_get_func_ip:1, /* Do we call get_func_ip() */ + call_session_cookie:1, /* Do we call bpf_fsession_cookie() */ tstamp_type_access:1, /* Accessed __sk_buff->tstamp_type */ sleepable:1; /* BPF program is sleepable */ enum bpf_prog_type type; /* Type of BPF program */ @@ -2137,6 +2140,19 @@ static inline int bpf_fsession_cnt(struct bpf_tramp_= links *links) return cnt; } =20 +static inline int bpf_fsession_cookie_cnt(struct bpf_tramp_links *links) +{ + struct bpf_tramp_links fentries =3D links[BPF_TRAMP_FENTRY]; + int cnt =3D 0; + + for (int i =3D 0; i < links[BPF_TRAMP_FENTRY].nr_links; i++) { + if (fentries.links[i]->link.prog->call_session_cookie) + cnt++; + } + + return cnt; +} + int bpf_prog_ctx_arg_info_init(struct bpf_prog *prog, const struct bpf_ctx_arg_aux *info, u32 cnt); =20 diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c index 3b9fc99e1e89..68f3d73a94a9 100644 --- a/kernel/bpf/trampoline.c +++ b/kernel/bpf/trampoline.c @@ -592,6 +592,8 @@ static int bpf_freplace_check_tgt_prog(struct bpf_prog = *tgt_prog) return 0; } =20 +#define BPF_TRAMP_MAX_COOKIES 4 + static int __bpf_trampoline_link_prog(struct bpf_tramp_link *link, struct bpf_trampoline *tr, struct bpf_prog *tgt_prog) @@ -599,7 +601,7 @@ static int __bpf_trampoline_link_prog(struct bpf_tramp_= link *link, enum bpf_tramp_prog_type kind, okind; struct bpf_tramp_link *link_existing; struct bpf_fsession_link *fslink; - int err =3D 0; + int err =3D 0, cookie_cnt; int cnt =3D 0, i; =20 okind =3D kind =3D bpf_attach_type_to_tramp(link->link.prog); @@ -640,6 +642,12 @@ static int __bpf_trampoline_link_prog(struct bpf_tramp= _link *link, /* prog already linked */ return -EBUSY; } + cookie_cnt =3D tr->cookie_cnt; + if (link->link.prog->call_session_cookie) { + if (cookie_cnt >=3D BPF_TRAMP_MAX_COOKIES) + return -E2BIG; + cookie_cnt++; + } =20 hlist_add_head(&link->tramp_hlist, &tr->progs_hlist[kind]); tr->progs_cnt[kind]++; @@ -657,6 +665,8 @@ static int __bpf_trampoline_link_prog(struct bpf_tramp_= link *link, } hlist_del_init(&link->tramp_hlist); tr->progs_cnt[kind]--; + } else { + tr->cookie_cnt =3D cookie_cnt; } return err; } @@ -696,6 +706,8 @@ static int __bpf_trampoline_unlink_prog(struct bpf_tram= p_link *link, hlist_del_init(&fslink->fexit.tramp_hlist); tr->progs_cnt[BPF_TRAMP_FEXIT]--; kind =3D BPF_TRAMP_FENTRY; + if (link->link.prog->call_session_cookie) + tr->cookie_cnt--; } hlist_del_init(&link->tramp_hlist); tr->progs_cnt[kind]--; diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index b0dcd715150f..da8335cf7c46 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -12381,6 +12381,7 @@ enum special_kfunc_type { KF_bpf_task_work_schedule_signal_impl, KF_bpf_task_work_schedule_resume_impl, KF_bpf_fsession_is_return, + KF_bpf_fsession_cookie, }; =20 BTF_ID_LIST(special_kfunc_list) @@ -12456,6 +12457,7 @@ BTF_ID(func, __bpf_trap) BTF_ID(func, bpf_task_work_schedule_signal_impl) BTF_ID(func, bpf_task_work_schedule_resume_impl) BTF_ID(func, bpf_fsession_is_return) +BTF_ID(func, bpf_fsession_cookie) =20 static bool is_task_work_add_kfunc(u32 func_id) { @@ -12511,7 +12513,8 @@ get_kfunc_ptr_arg_type(struct bpf_verifier_env *env, bool arg_mem_size =3D false; =20 if (meta->func_id =3D=3D special_kfunc_list[KF_bpf_cast_to_kern_ctx] || - meta->func_id =3D=3D special_kfunc_list[KF_bpf_fsession_is_return]) + meta->func_id =3D=3D special_kfunc_list[KF_bpf_fsession_is_return] || + meta->func_id =3D=3D special_kfunc_list[KF_bpf_fsession_cookie]) return KF_ARG_PTR_TO_CTX; =20 /* In this function, we verify the kfunc's BTF as per the argument type, @@ -14009,7 +14012,8 @@ static int check_kfunc_call(struct bpf_verifier_env= *env, struct bpf_insn *insn, } } =20 - if (meta.func_id =3D=3D special_kfunc_list[KF_bpf_session_cookie]) { + if (meta.func_id =3D=3D special_kfunc_list[KF_bpf_session_cookie] || + meta.func_id =3D=3D special_kfunc_list[KF_bpf_fsession_cookie]) { meta.r0_size =3D sizeof(u64); meta.r0_rdonly =3D false; } @@ -14293,6 +14297,9 @@ static int check_kfunc_call(struct bpf_verifier_env= *env, struct bpf_insn *insn, return err; } =20 + if (meta.func_id =3D=3D special_kfunc_list[KF_bpf_fsession_cookie]) + env->prog->call_session_cookie =3D true; + return 0; } =20 @@ -22565,6 +22572,15 @@ static int fixup_kfunc_call(struct bpf_verifier_en= v *env, struct bpf_insn *insn, insn_buf[1] =3D BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, BPF_TRAMP_M_IS_RETURN); insn_buf[2] =3D BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1); *cnt =3D 3; + } else if (desc->func_id =3D=3D special_kfunc_list[KF_bpf_fsession_cookie= ]) { + /* Load nr_args from ctx - 8 */ + insn_buf[0] =3D BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8); + insn_buf[1] =3D BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, BPF_TRAMP_M_COOKIE); + insn_buf[2] =3D BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xFF); + insn_buf[3] =3D BPF_ALU64_IMM(BPF_LSH, BPF_REG_0, 3); + insn_buf[4] =3D BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1); + insn_buf[5] =3D BPF_ALU64_IMM(BPF_NEG, BPF_REG_0, 0); + *cnt =3D 6; } =20 if (env->insn_aux_data[insn_idx].arg_prog) { diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 0857d77eb34c..ae7866d8ea62 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -3364,10 +3364,19 @@ __bpf_kfunc bool bpf_fsession_is_return(void *ctx) return !!(((u64 *)ctx)[-1] & (1 << BPF_TRAMP_M_IS_RETURN)); } =20 +__bpf_kfunc u64 *bpf_fsession_cookie(void *ctx) +{ + /* This helper call is inlined by verifier. */ + u64 off =3D (((u64 *)ctx)[-1] >> BPF_TRAMP_M_COOKIE) & 0xFF; + + return &((u64 *)ctx)[-off]; +} + __bpf_kfunc_end_defs(); =20 BTF_KFUNCS_START(tracing_kfunc_set_ids) BTF_ID_FLAGS(func, bpf_fsession_is_return, KF_FASTCALL) +BTF_ID_FLAGS(func, bpf_fsession_cookie, KF_FASTCALL) BTF_KFUNCS_END(tracing_kfunc_set_ids) =20 static int bpf_tracing_filter(const struct bpf_prog *prog, u32 kfunc_id) --=20 2.52.0 From nobody Sat Feb 7 07:09:37 2026 Received: from mail-pl1-f195.google.com (mail-pl1-f195.google.com [209.85.214.195]) (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 8EA0B33C19E for ; Wed, 17 Dec 2025 09:55:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965329; cv=none; b=dDhY5xjAtG4OkuiRlcNKX/JHFNO64oEBuk0z8ma1VX22eNwzsTcWJZAsAcj2Ol6Q4Q+Y89RTSxivgMdmYxSEY2PVkSYey8Uj/DfWnsGlsvLt38vL54rbeszWlUGGmZf21BwMpxEv6F6TZpbrIkY04zkU3mEb/Q1AajJH+V3iAN0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965329; c=relaxed/simple; bh=8UjztYwJ3V5glcGLXb6BENiANc0oStuVeMSUdlMadWU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PiG8JR31u4X+qTL/TQAhMHiRyHpFJyrdXKAA8prvQlOmibe6qrwmFyI14chRl24DKBbyAcixS7e/JD84kS0e1twqhtn1X82H2qcoKcT/loJz5ampkBwXPQ3zrvOTQOdbZ7wrq8V0URKd9XQeKwahJldbNRgf/IasLByRcO8xoo8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Fbkszo+i; arc=none smtp.client-ip=209.85.214.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Fbkszo+i" Received: by mail-pl1-f195.google.com with SMTP id d9443c01a7336-2a0bb2f093aso38365985ad.3 for ; Wed, 17 Dec 2025 01:55:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765965327; x=1766570127; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zYyVRjly71IVaO9XpSMOkg3chszPFkxF2ByaNmXFw0U=; b=Fbkszo+iU6QUDZU9moPXyAruR9ZREYm1i8fjwUcaCiDoWdKXKmYw8bOm1T032GmC/T JNRR+1f4IYSE7FP4UEsbVUBRqEy8fl24BrMu2EnUBWG5GzYB5vqc2RVOWJZVnSi5nFUR I2KKkHweTuYcOtpbZD9YZeb2MGdqcMBO9QZNytUj0minXz8FJWnO4H3+AjYJQCMftoh6 +1QGjhUdMXER33v9O40gD/JCxtVrPmt0anrJ0qqE15dUSw7UO4izjCd9GBJmtRsz2bFV EPkYuRTQudx7NceiwuUCU0GfQ/PvOVIrtFnqOV/zdfFuH7APzM785tz+Y30KqpMr01jp tnLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765965327; x=1766570127; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zYyVRjly71IVaO9XpSMOkg3chszPFkxF2ByaNmXFw0U=; b=iB7YIXZb2x+E2sOjX703BMdgC1WhCKtMNRKMPIwK1ocqbCi8yQmd0qCYX4vOShb1Dx 1jkO3/pabr5m7CvInXkBllKDKyJSmsPehw0X6qitWFjkXMNyzWlc717H6rROJJyprzlx wut1msBF/qTlc/mWtaXOqoxD3cfaYqMDqWNwbRHlzW/I1OiH0rMUKajr2oslg0yLrQpW Vokq8uwQ4mlszfnR/GD5JpbHxHHRUi6/4tc1QBbfsoOarO5n9Uq2mOCgNxzOvZGQ0Di2 GCIH0A3yBtPG6/EMbjyUjZRnnQ2+8N03lMsW1wVV/2Qw9S2xI8Kg1R6hM9ARySwvUw1n 8LfQ== X-Forwarded-Encrypted: i=1; AJvYcCVHhvn7hMQfwaBVPNFPrZzdtE2ENqXMBAC+7YCWEr9tvwoXD0pHaRZgI0jTR4ESZc1wCv53U3gp3xAeGwU=@vger.kernel.org X-Gm-Message-State: AOJu0Ywygqh3flku4v2xWiogPmOqT4Ya3NZfD6yaZ2eKrlxkduG9gPTM ModUYAvcO2TVd2hka4Y/TkNPcXIJSY9pFfwtxOerNjSt90HIXSPkUfWf X-Gm-Gg: AY/fxX7rZnmqMJKiuxPW17x30J1mNGJmb2XbN/5DuI34YDlZIbm3UW/t4r0HxPonbLi UHsWj0AwhQuXgZyqfjUTHu8ISeUJeSUHVlL4fPB21kZuWnN2DoEx5oueYES/0UBmxl8/4V67L3D hGZWVHdldhmSrDTqxVUtJHFCjGUUfxm/reN+hhjT/e7yF0/jBzn6APlfe15o1X5crnMmyfflgf9 MLUfJyK7BfXrEogMAsBDdJ8tFsdOrpbtUqD7oajMM/H5iDb/XIcxAp8pU7zpQoeBmUbPSDb65op TYEi6SbLUaAgDN66atIZHUD2nKRynYvmNhuZImlwkD2VBeU8zN8nTSnJTr85Zq5l4DsMYbqrV15 FXslml/HrQzUPIDKNnCV8vAO5eWzjjJ0SnJ4c6nil4w1+U/XKqAoPIYHGfCppaKK/C7dVqcYiP3 Htk4ezyTI= X-Google-Smtp-Source: AGHT+IEJALUlnag/srZc+nNutVyqUv3oQE6iSsJThTk62+uYDbyqqh3e2Gc3Am2sWZ6ZqH4wfrfqdg== X-Received: by 2002:a17:902:d488:b0:2a0:d149:5d0f with SMTP id d9443c01a7336-2a0d1495d3emr117851165ad.17.1765965326939; Wed, 17 Dec 2025 01:55:26 -0800 (PST) Received: from 7940hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a07fa0b1aasm140715945ad.3.2025.12.17.01.55.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Dec 2025 01:55:26 -0800 (PST) From: Menglong Dong X-Google-Original-From: Menglong Dong To: ast@kernel.org, andrii@kernel.org Cc: davem@davemloft.net, dsahern@kernel.org, daniel@iogearbox.net, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH bpf-next v4 5/9] bpf,x86: introduce emit_st_r0_imm64() for trampoline Date: Wed, 17 Dec 2025 17:54:41 +0800 Message-ID: <20251217095445.218428-6-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251217095445.218428-1-dongml2@chinatelecom.cn> References: <20251217095445.218428-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce the helper emit_st_r0_imm64(), which is used to store a imm64 to the stack with the help of r0. Signed-off-by: Menglong Dong --- arch/x86/net/bpf_jit_comp.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index b69dc7194e2c..8cbeefb26192 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c @@ -1300,6 +1300,15 @@ static void emit_st_r12(u8 **pprog, u32 size, u32 ds= t_reg, int off, int imm) emit_st_index(pprog, size, dst_reg, X86_REG_R12, off, imm); } =20 +static void emit_st_r0_imm64(u8 **pprog, u64 value, int off) +{ + /* mov rax, value + * mov QWORD PTR [rbp - off], rax + */ + emit_mov_imm64(pprog, BPF_REG_0, value >> 32, (u32) value); + emit_stx(pprog, BPF_DW, BPF_REG_FP, BPF_REG_0, -off); +} + static int emit_atomic_rmw(u8 **pprog, u32 atomic_op, u32 dst_reg, u32 src_reg, s16 off, u8 bpf_size) { @@ -3341,16 +3350,14 @@ static int __arch_prepare_bpf_trampoline(struct bpf= _tramp_image *im, void *rw_im * mov rax, nr_regs * mov QWORD PTR [rbp - nregs_off], rax */ - emit_mov_imm64(&prog, BPF_REG_0, 0, (u32) nr_regs); - emit_stx(&prog, BPF_DW, BPF_REG_FP, BPF_REG_0, -nregs_off); + emit_st_r0_imm64(&prog, nr_regs, nregs_off); =20 if (flags & BPF_TRAMP_F_IP_ARG) { /* Store IP address of the traced function: * movabsq rax, func_addr * mov QWORD PTR [rbp - ip_off], rax */ - emit_mov_imm64(&prog, BPF_REG_0, (long) func_addr >> 32, (u32) (long) fu= nc_addr); - emit_stx(&prog, BPF_DW, BPF_REG_FP, BPF_REG_0, -ip_off); + emit_st_r0_imm64(&prog, (long)func_addr, ip_off); } =20 save_args(m, &prog, regs_off, false, flags); --=20 2.52.0 From nobody Sat Feb 7 07:09:37 2026 Received: from mail-pl1-f194.google.com (mail-pl1-f194.google.com [209.85.214.194]) (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 350F533C191 for ; Wed, 17 Dec 2025 09:55:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.194 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965335; cv=none; b=NAZsEv+s1u7NJBDafKG5lGnHYobUSZ3lpFxTaqn7x2lvzsegjTmSZqMSg9x4Xodx98g+Nsb9pbFdaf4AbajLPGuAEq5CqF+10lTW42QgZRFKGay3vjiGv1kX45KJV7RXdR2wLBmNzhHc2h/OnZMMPx/NqdiMkwR60x8skBLcR+M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965335; c=relaxed/simple; bh=OJ+pmI+L2FN9LNa/GQ8rbcja6XaPYSuA8kA30fwb/sU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=awl1+eLpAyzB3Sa2Bo/HwHYi+CVzKR6DEk1R8zzWSTqU9pqpdRePskViRe96BBaGl8llWsJKkpL8BhrC3bUi9SWnc5HiCeq3fqqNx8qqNvJ2lZMGaSp9Qk1/VXC7vkfhPITTQ9y/9nd4q2+9GT0hHk7sPOPAe5lNBlAEC6dbvPM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Um7d+U3u; arc=none smtp.client-ip=209.85.214.194 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Um7d+U3u" Received: by mail-pl1-f194.google.com with SMTP id d9443c01a7336-29efd139227so68482365ad.1 for ; Wed, 17 Dec 2025 01:55:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765965333; x=1766570133; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=m7ajHfBTTsej1M2RhwUNhnzHgFKm/6J2aHc6UMKkyQU=; b=Um7d+U3uWl5SYeKkDDoJIq2cnbVipGwOTFLm5gmF3jvW+Fq/EttGoefVrXTrsXThfw QwqQM9GdpF31ayFFqOBUqokVXB4t2yKkVXFSIGcoanl8oXgeTSjscuNcQ7O94kKIYqiz 5c3lbMvwTAi50BtBZGRdP4mssHe7lx2EGIJ/BDPaWLZhPAoQjwQIYxHR5hs/ErqZLfrg ZJ9OyTlsZtdJSNLHmODSw06gSRk9zcE+UE0oN7/4uL8aQRIBWhtkPME/VPZVBb5+CaNl 71AZbIgKc7KGGX+dth+wVYWyhzN9X+8Zm8h4qRl/y1+YwqUPzkD31INrGeALd422vKDU G+hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765965333; x=1766570133; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=m7ajHfBTTsej1M2RhwUNhnzHgFKm/6J2aHc6UMKkyQU=; b=rEQqZgpq3Kq4CQbj5kQ9vr+XUyOGRW5SvxLJ4UQRJem/cRt8o/08GKMduaLEjwSSvn d/1fAcXIsWqbvMCEZcxoVQ9iLTpKwUM6IpN69Bc5rTOH+6D8FVGnexk+TGIyjzd5ycv/ a/OllnaARdoIHBvUD110A/YG21fDuS7jGQu4XI06ZsRMOCTESJhF+I8BUIb3tbOebS/w B0xZcs0TkFfkQ79TiKEa9LiiBYxxOT4h1HT1PzOv7PnaVPmy6kDKuOYT1Hsu1gwSn3my nryD4kxyOFPShTEF+WplLoJ5rAhpiuM15U1R2Z8cuF45SltgHpIEMrEzPfbkLOMFOZnx XG6w== X-Forwarded-Encrypted: i=1; AJvYcCXDIwFN++g07G3W7anwS3Z8+z7okvHYw88u0rGyzLw7gDdsJlnw//ylPZZ+fAOXbX5Rkack4FhlPwVwlL8=@vger.kernel.org X-Gm-Message-State: AOJu0Yz2SgvPzTLskOWYzQuPIbwNRF6f6/RUe1zeNpvaoJ8e0QT7rOev z4gHK4VSYC8bSIxG/A/blrEuj9k0CLrNeEIGGTSMvfyYRsOk3gHCBTfD X-Gm-Gg: AY/fxX7byYHrVpRYBd/126VxCV9JHNnUE6zQSTwvLOwlzUbaFMwFzCgAFXk9edwcvdU lLIclJhXOKgbEgjo8Yyrz2UazHq3bvSsEHTx2qQtJ9O8A3Z9UHTBh5Rz+KTvoQH2hLz0UuyS5e7 snHahvGUH9SW4x3I99+ML7bldJ1K/bDA1MSCXM8Zgb3gi2VIaXNbO62TrkszhPyEe7y/HKeBW/E 0ugG+Duzeyo9Cbe+9Z5P7ePk8/1CcjBxpUDdxqhLLo8JFZO8YjBbwr8ASMq/XKeeqlqSTn/DfFt F3rMbJ7Od8KhL5M8mnwrgZfe50esASU+Do9FOmmDPhksr4JIu1gJb2endqXI6AxnmKCmJ7P6tsc mJMKAVNYC2eR2JImeMdtzp7SmP0Vojtj4OSKX9fxyz3vNaPfP8KNHSrXsVakBdha3NVXfnxRh8g AWiuuYieE= X-Google-Smtp-Source: AGHT+IEWPBto4teSaddmB1eqJXnA1IXD2xBXoEGQddliKYYXcy7uKp4BcIOhpNQZDsftssScJ+vVfQ== X-Received: by 2002:a17:902:f54b:b0:2a0:8963:c147 with SMTP id d9443c01a7336-2a08963c3fbmr154947065ad.45.1765965333540; Wed, 17 Dec 2025 01:55:33 -0800 (PST) Received: from 7940hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a07fa0b1aasm140715945ad.3.2025.12.17.01.55.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Dec 2025 01:55:33 -0800 (PST) From: Menglong Dong X-Google-Original-From: Menglong Dong To: ast@kernel.org, andrii@kernel.org Cc: davem@davemloft.net, dsahern@kernel.org, daniel@iogearbox.net, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH bpf-next v4 6/9] bpf,x86: add tracing session supporting for x86_64 Date: Wed, 17 Dec 2025 17:54:42 +0800 Message-ID: <20251217095445.218428-7-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251217095445.218428-1-dongml2@chinatelecom.cn> References: <20251217095445.218428-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add BPF_TRACE_SESSION supporting to x86_64, including: 1. clear the return value in the stack before fentry to make the fentry of the fsession can only get 0 with bpf_get_func_ret(). If we can limit that bpf_get_func_ret() can only be used in the "bpf_fsession_is_return() =3D=3D true" code path, we don't need do this thing anymore. 2. clear all the session cookies' value in the stack. If we can make sure that the reading to session cookie can only be done after initialize in the verifier, we don't need this anymore. 2. store the index of the cookie to ctx[-1] before the calling to fsession 3. store the "is_return" flag to ctx[-1] before the calling to fexit of the fsession. Signed-off-by: Menglong Dong Co-developed-by: Leon Hwang Signed-off-by: Leon Hwang --- v4: - some adjustment to the 1st patch, such as we get the fsession prog from fentry and fexit hlist - remove the supporting of skipping fexit with fentry return non-zero v2: - add session cookie support - add the session stuff after return value, instead of before nr_args --- arch/x86/net/bpf_jit_comp.c | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 8cbeefb26192..99b0223374bd 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c @@ -3086,12 +3086,17 @@ static int emit_cond_near_jump(u8 **pprog, void *fu= nc, void *ip, u8 jmp_cond) static int invoke_bpf(const struct btf_func_model *m, u8 **pprog, struct bpf_tramp_links *tl, int stack_size, int run_ctx_off, bool save_ret, - void *image, void *rw_image) + void *image, void *rw_image, u64 nr_regs) { int i; u8 *prog =3D *pprog; =20 for (i =3D 0; i < tl->nr_links; i++) { + if (tl->links[i]->link.prog->call_session_cookie) { + /* 'stack_size + 8' is the offset of nr_regs in stack */ + emit_st_r0_imm64(&prog, nr_regs, stack_size + 8); + nr_regs -=3D (1 << BPF_TRAMP_M_COOKIE); + } if (invoke_bpf_prog(m, &prog, tl->links[i], stack_size, run_ctx_off, save_ret, image, rw_image)) return -EINVAL; @@ -3208,8 +3213,9 @@ static int __arch_prepare_bpf_trampoline(struct bpf_t= ramp_image *im, void *rw_im struct bpf_tramp_links *tlinks, void *func_addr) { - int i, ret, nr_regs =3D m->nr_args, stack_size =3D 0; - int regs_off, nregs_off, ip_off, run_ctx_off, arg_stack_off, rbx_off; + int i, ret, nr_regs =3D m->nr_args, cookie_cnt, stack_size =3D 0; + int regs_off, nregs_off, ip_off, run_ctx_off, arg_stack_off, rbx_off, + cookie_off; struct bpf_tramp_links *fentry =3D &tlinks[BPF_TRAMP_FENTRY]; struct bpf_tramp_links *fexit =3D &tlinks[BPF_TRAMP_FEXIT]; struct bpf_tramp_links *fmod_ret =3D &tlinks[BPF_TRAMP_MODIFY_RETURN]; @@ -3282,6 +3288,11 @@ static int __arch_prepare_bpf_trampoline(struct bpf_= tramp_image *im, void *rw_im =20 ip_off =3D stack_size; =20 + cookie_cnt =3D bpf_fsession_cookie_cnt(tlinks); + /* room for session cookies */ + stack_size +=3D cookie_cnt * 8; + cookie_off =3D stack_size; + stack_size +=3D 8; rbx_off =3D stack_size; =20 @@ -3372,9 +3383,19 @@ static int __arch_prepare_bpf_trampoline(struct bpf_= tramp_image *im, void *rw_im } } =20 + if (bpf_fsession_cnt(tlinks)) { + /* clear all the session cookies' value */ + for (int i =3D 0; i < cookie_cnt; i++) + emit_st_r0_imm64(&prog, 0, cookie_off - 8 * i); + /* clear the return value to make sure fentry always get 0 */ + emit_st_r0_imm64(&prog, 0, 8); + nr_regs +=3D (((cookie_off - regs_off) / 8) << BPF_TRAMP_M_COOKIE); + } + if (fentry->nr_links) { if (invoke_bpf(m, &prog, fentry, regs_off, run_ctx_off, - flags & BPF_TRAMP_F_RET_FENTRY_RET, image, rw_image)) + flags & BPF_TRAMP_F_RET_FENTRY_RET, image, rw_image, + nr_regs)) return -EINVAL; } =20 @@ -3434,9 +3455,14 @@ static int __arch_prepare_bpf_trampoline(struct bpf_= tramp_image *im, void *rw_im } } =20 + /* set the "is_return" flag for fsession */ + nr_regs +=3D (1 << BPF_TRAMP_M_IS_RETURN); + if (bpf_fsession_cnt(tlinks)) + emit_st_r0_imm64(&prog, nr_regs, nregs_off); + if (fexit->nr_links) { if (invoke_bpf(m, &prog, fexit, regs_off, run_ctx_off, - false, image, rw_image)) { + false, image, rw_image, nr_regs)) { ret =3D -EINVAL; goto cleanup; } --=20 2.52.0 From nobody Sat Feb 7 07:09:37 2026 Received: from mail-pl1-f193.google.com (mail-pl1-f193.google.com [209.85.214.193]) (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 65CA7342536 for ; Wed, 17 Dec 2025 09:55:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965342; cv=none; b=mfl2x50CgWALMph9/Wnjc0irM8a/7b80b6RVO42t4l0JpUnFARl+cEF3iKJZPCUfFYaq4M3X9mGLHgG0FtiVGYHm1+Altr2sApIE75Q6vVmOc8CcUzfZNqpB9bac81JgSkACJ7FT9pRI76O8T/hEDg8BmJA1B/85IC5+pe7GbDM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965342; c=relaxed/simple; bh=UkSmveJpeLu2H0txFtf6NwK9YZmeNSpp7nztFJDWGgI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=q6KCqWVORTLXxLibX3ZLosnNa9lDGYqRLVQYZXdtGqNZsDOEOMY4e7qTB4t8Tbv0N0oT8xkKiVf3XkDPeZ1kk59Rdwpd2x2fUeQve+MvwZva9ldPwnP/o3jAmkyn2Mm7UCccyYsBISXX4x7X1GvxoTGqHFtca2HBr7hLr6YGniI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ja87KcUW; arc=none smtp.client-ip=209.85.214.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ja87KcUW" Received: by mail-pl1-f193.google.com with SMTP id d9443c01a7336-29f0f875bc5so73516815ad.3 for ; Wed, 17 Dec 2025 01:55:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765965340; x=1766570140; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=F3hISc+qVpfPhZR5W/mBA2uyXZnUeLvA3pjNsPMwako=; b=ja87KcUWave+KNJYXe4b3tVV9IHOIVQrvCZ5ZNq1YbQsIBvhG3Vw5W6FqSY3RVRM2H dPSlFo2yU4hwjmYNZAvdAuNCRSXjvnu/B/GghU+i8y/COdFND1SG4yG9KqoXUghZRMtG J5p+9gvneS4hbS4roRqZFr33gUgUUmz0oz16KW1qQx0YZtmwDr4MyRLVKZgH11kZ//6X vxVJ5pwvo/ct+QvbN+cotk98tcgtHkYh0aq8UDJuA9zH9oo3l2x/wMLopymD44alU1yK nlcDKG+zH33kgqheI9P1HEIM/QF26+SGiGOiKwaZR9CG18ACaXIcAhgZZieX4szZ1iJU y2kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765965340; x=1766570140; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=F3hISc+qVpfPhZR5W/mBA2uyXZnUeLvA3pjNsPMwako=; b=KwYgLS/rhyoaVbaVeF4WQAUenLA0udcWd+abLTSHuPcifrht9y0AOkEgpo8DTvnjbZ XFKOK1kRKKfeJyAluKPvZ7hzl0YmN14rPNwJbmfDmDhDUMYtHL6ZNFpbLX3MeoGOPPZ2 fEoYGtnniGL6nwgc4NPVVJCn7QEKPNusWistfUb4NZV/MIGwr+jgVvoUrc+KQt9LiRFi dULmwyrv5IMAjJOe5Nax0H/V402hUDvFrud0Rbd7LG90MTGDYgAI+w4dxIhQQeWnVz4A yWaa52Fie7kmusyVJXUBZffpgUfkps6UOlzO7tzdsaMnOk+J0UH3vp53iO4P0aSxuan0 I+cg== X-Forwarded-Encrypted: i=1; AJvYcCVXesCg4lHbbZDqLxZBoEFAiD9euOcIvxWg6zTlXG2gx1vJ5dTqMGjJpn/000D+mEyVrdRI6EArp/VCpO0=@vger.kernel.org X-Gm-Message-State: AOJu0Yw80lVER//AdwHdOSuXdhQnmI7dLvUeEd2/zZPnCQ+8I5xiZYbK /hP+bl/t0HDyF/bOCknZuSreSOOJk8MGWqrreh4HVuRbYLKOjbLRjrEa X-Gm-Gg: AY/fxX4icIs+4hrGyd/D/pRHNwkRbx/16B+4dnB8J9xidTa4XZMMTFr6cqqtlda5Sir ShPXk1BAozKMajW+13gJeQoiZhwZVJBY4eiv3f5Ut6ie9Q5VFmISBy75kmk/jxT2mfluetq7hbh sJbnW3LIV1xBhJhjk+anPjKPJcr+7BrGRiLsKmEqm1JAj+icuECo/ecLRJFjf9auuAZH+zSuFoY OS5YtXeNVPdRWdBkJu7DvKn0W/VaJDizb4jyZuyaaCDSzOlK3GuHt4KwYaLb5n4yufhTClO6vC9 MQaBzETU8o0kUWuxrK7kkqwVHAMbYdgQTaufyiGUAo5IclmfDw3LNXcc6O16+ukdVfJeC5dZzX3 aINhhYMtjMXozuHp3l7fjcqDhUsE3DwmFU4fO0pLubRWJaYIr7QpQheBCPRCSnXroOKEFk10P1S FWWLBYnvc= X-Google-Smtp-Source: AGHT+IE5C/7U4p2EYr4v4jB/aE1Y+kulMB/uRRmgnAOhqGAxDTc1dap1o8cF6QJMgVNWg3Mc/h9vQQ== X-Received: by 2002:a17:902:d54d:b0:295:557e:7476 with SMTP id d9443c01a7336-29f23dfddb0mr161739725ad.7.1765965339729; Wed, 17 Dec 2025 01:55:39 -0800 (PST) Received: from 7940hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a07fa0b1aasm140715945ad.3.2025.12.17.01.55.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Dec 2025 01:55:39 -0800 (PST) From: Menglong Dong X-Google-Original-From: Menglong Dong To: ast@kernel.org, andrii@kernel.org Cc: davem@davemloft.net, dsahern@kernel.org, daniel@iogearbox.net, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH bpf-next v4 7/9] libbpf: add support for tracing session Date: Wed, 17 Dec 2025 17:54:43 +0800 Message-ID: <20251217095445.218428-8-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251217095445.218428-1-dongml2@chinatelecom.cn> References: <20251217095445.218428-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add BPF_TRACE_SESSION to libbpf and bpftool. Signed-off-by: Menglong Dong --- tools/bpf/bpftool/common.c | 1 + tools/lib/bpf/bpf.c | 2 ++ tools/lib/bpf/libbpf.c | 3 +++ 3 files changed, 6 insertions(+) diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c index e8daf963ecef..534be6cfa2be 100644 --- a/tools/bpf/bpftool/common.c +++ b/tools/bpf/bpftool/common.c @@ -1191,6 +1191,7 @@ const char *bpf_attach_type_input_str(enum bpf_attach= _type t) case BPF_TRACE_FENTRY: return "fentry"; case BPF_TRACE_FEXIT: return "fexit"; case BPF_MODIFY_RETURN: return "mod_ret"; + case BPF_TRACE_SESSION: return "fsession"; case BPF_SK_REUSEPORT_SELECT: return "sk_skb_reuseport_select"; case BPF_SK_REUSEPORT_SELECT_OR_MIGRATE: return "sk_skb_reuseport_select_= or_migrate"; default: return libbpf_bpf_attach_type_str(t); diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index 21b57a629916..5042df4a5df7 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -794,6 +794,7 @@ int bpf_link_create(int prog_fd, int target_fd, case BPF_TRACE_FENTRY: case BPF_TRACE_FEXIT: case BPF_MODIFY_RETURN: + case BPF_TRACE_SESSION: case BPF_LSM_MAC: attr.link_create.tracing.cookie =3D OPTS_GET(opts, tracing.cookie, 0); if (!OPTS_ZEROED(opts, tracing)) @@ -917,6 +918,7 @@ int bpf_link_create(int prog_fd, int target_fd, case BPF_TRACE_FENTRY: case BPF_TRACE_FEXIT: case BPF_MODIFY_RETURN: + case BPF_TRACE_SESSION: return bpf_raw_tracepoint_open(NULL, prog_fd); default: return libbpf_err(err); diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index c7c79014d46c..0c095195df31 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -115,6 +115,7 @@ static const char * const attach_type_name[] =3D { [BPF_TRACE_FENTRY] =3D "trace_fentry", [BPF_TRACE_FEXIT] =3D "trace_fexit", [BPF_MODIFY_RETURN] =3D "modify_return", + [BPF_TRACE_SESSION] =3D "trace_session", [BPF_LSM_MAC] =3D "lsm_mac", [BPF_LSM_CGROUP] =3D "lsm_cgroup", [BPF_SK_LOOKUP] =3D "sk_lookup", @@ -9853,6 +9854,8 @@ static const struct bpf_sec_def section_defs[] =3D { SEC_DEF("fentry.s+", TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF | SEC_SLE= EPABLE, attach_trace), SEC_DEF("fmod_ret.s+", TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF | SEC_= SLEEPABLE, attach_trace), SEC_DEF("fexit.s+", TRACING, BPF_TRACE_FEXIT, SEC_ATTACH_BTF | SEC_SLEEP= ABLE, attach_trace), + SEC_DEF("fsession+", TRACING, BPF_TRACE_SESSION, SEC_ATTACH_BTF, attach_= trace), + SEC_DEF("fsession.s+", TRACING, BPF_TRACE_SESSION, SEC_ATTACH_BTF | SEC_= SLEEPABLE, attach_trace), SEC_DEF("freplace+", EXT, 0, SEC_ATTACH_BTF, attach_trace), SEC_DEF("lsm+", LSM, BPF_LSM_MAC, SEC_ATTACH_BTF, attach_lsm), SEC_DEF("lsm.s+", LSM, BPF_LSM_MAC, SEC_ATTACH_BTF | SEC_SLEEPABLE, atta= ch_lsm), --=20 2.52.0 From nobody Sat Feb 7 07:09:37 2026 Received: from mail-pl1-f196.google.com (mail-pl1-f196.google.com [209.85.214.196]) (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 800E134105C for ; Wed, 17 Dec 2025 09:55:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.196 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965348; cv=none; b=jyZQ23eBXfrv2yWNxiQRzgAeRnSvzdMt0zXhlyEc7t0G+wvPMAB5RHXsK2A8GflUavO17PDVsdxTYgBDwmD8rUdr0ixl4nx74UHlUev2zYb3Ry1buXeUVcstKEtKZPxJLLsqgipx3kvI8uHvyDxhViesqJ4fHjbLnmXlMCj8u0o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965348; c=relaxed/simple; bh=Cr2r8qD8ZWRFZUO9C+91nA66i7GFwEZnV+6CkrHW6vY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SOs/xMdPLboOReRZ5uAcrqia5KP8dAuP/t4Ek+d3fWY0HzkQWenkQ3oJFL103mpf9TgsVIKs5owTR0iw6VdXE/4/1hJAr4He7lkphLh4r0WDrvVK9hWlWam1LPWasIKafta+wpK0XyP+72RfOVCPssY6cL66bI5y1N1Y6HMQ5GY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=THbPkt3c; arc=none smtp.client-ip=209.85.214.196 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="THbPkt3c" Received: by mail-pl1-f196.google.com with SMTP id d9443c01a7336-2a1388cdac3so17134255ad.0 for ; Wed, 17 Dec 2025 01:55:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765965346; x=1766570146; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0J31z4SW8kSTDfjblM9XS54ZD7hbsR0g1QvNBMlKhxY=; b=THbPkt3chSTBeFHnWpTZXydZj30o55wXxMiFG70j7MXXbpn8r1eAsAz/GT64lUTuC6 DYT7gTIQMwKDvYRKsnpBclgVOXN80WpLN5VPsFuOOh0Sx7wWK2JRB9XT7H97gySTa5Xe rJNUB+KRApYdqr0CW9Fdo5n0T4i+X4/LkPyFHDt2sGzqafBAatgjvpdLNYi0wsg5604N GgfCYB4d2X3y1Ei56fOyAapHBKa4Wmj6Fp85Yc0/bVHZbZ3ZytDmzhO/9i6P+ldp81p/ o3WEKR+AKwEUL64pF3dSRzD7UXN9bGubzrT+KI+1WF1wSrs0d8ZlLpVcek4r78R8ttvn Vqmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765965346; x=1766570146; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=0J31z4SW8kSTDfjblM9XS54ZD7hbsR0g1QvNBMlKhxY=; b=McckYsqTQz3t0b0q1Tx8s1IfvrHLtWvlhevPrVrwUHmFhGV1M0/LKc3GQRlxRy+jCf qpki7uCYTxq2n64+tXAIDm7TPmSig7ceEU2bDtFNo3lMVvHfs+3DazCKVhmvrdPOyJve r5kmsAlC7VYiHlXJ5jd4lcTDdd0r+Jq/ULKq6ErT9cDWLFeO362mHmnKqefILEm9gmUf 86aCQdr/S+R513NwxhkYDJOdP5Nv4wEtnk9sT5ieBl9s6yu2m+cZ53BPcRCitTKP+yMS 2szghq6QPOV4RVciRFt3WQxDDdzymm8S5LhLx9y2f089WdlTMFqVrs63a8WhNcCpgcll hT8w== X-Forwarded-Encrypted: i=1; AJvYcCVjUDKO+aBXuYLKuUKakiVydl5lvu2oAnqjWnonz4l0gxufBCC5a1JyB96vrcNkxArTfCu6KoOgIwMTEG8=@vger.kernel.org X-Gm-Message-State: AOJu0YwDqJju/ZKEz1mQw4vHbYrvwstFYaaes/BqeMYLG+Dl2CsHXlQ6 tXbIXRFtvurhwxKZfgudk/tqfHTa9xgZg7W6SHphuwTCLUPurKca93F4 X-Gm-Gg: AY/fxX6DPmh0hc8vnai8DdcO1bSYoGMxf5pZj5jX5nmo5ycVehEqzO1HAaNyjMD6Mx6 KvPxCw0n7ubLSDh1RRpvKil14F58Tj2UJqQfcEBTPBFcQ5e7s72hEzsThpp68x+Suc7QDm5S12s o2BnR7x26jj6h8dwU/eN6BTIPRnCi8pNP7yjaDGIkqh3RPWprz1L3J+yAkRmBIspjdX8MezVvxK Cz3EhsJe/g+WBoSlXVHdz/KBmq5LvEm6pthUdio2bvR/A4v+zfvEuZKaVlLchhh2P1aKlub6bCn 0vTujRox9UZX38vIwSzUP9JX7DXQ48xRRhgg72utfPCytRcp8Ts5wSXJOdHUUFiULV9RUrr7vzg fpcO5z+chZE4/s9E6dNRDfuD95Sss4KhKKFxYqMJ33zXNDjykHVMugiAIbLtkOpOXXvuShpX1cv jGUnTD6aU= X-Google-Smtp-Source: AGHT+IGKNgea5xK7/Mf38nTbcPf7/sUVgupdhael53Zs4BVPA7pk2NAb9QT1LP+wMqe8Dut8oqyncg== X-Received: by 2002:a17:902:f549:b0:29f:29ae:8733 with SMTP id d9443c01a7336-29f29ae8938mr168934205ad.53.1765965345836; Wed, 17 Dec 2025 01:55:45 -0800 (PST) Received: from 7940hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a07fa0b1aasm140715945ad.3.2025.12.17.01.55.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Dec 2025 01:55:45 -0800 (PST) From: Menglong Dong X-Google-Original-From: Menglong Dong To: ast@kernel.org, andrii@kernel.org Cc: davem@davemloft.net, dsahern@kernel.org, daniel@iogearbox.net, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH bpf-next v4 8/9] selftests/bpf: add testcases for tracing session Date: Wed, 17 Dec 2025 17:54:44 +0800 Message-ID: <20251217095445.218428-9-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251217095445.218428-1-dongml2@chinatelecom.cn> References: <20251217095445.218428-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add testcases for BPF_TRACE_SESSION. The function arguments and return value are tested both in the entry and exit. And the kfunc bpf_tracing_is_exit() is also tested. As the layout of the stack changed for fsession, so we also test bpf_get_func_ip() for it. Session cookie for fsession is also tested. Multiple fsession BPF progs is attached to bpf_fentry_test1() and session cookie is read and write in the testcase. Signed-off-by: Menglong Dong --- v3: - restructure the testcase by combine the testcases for session cookie and get_func_ip into one patch --- .../selftests/bpf/prog_tests/fsession_test.c | 90 ++++++++ .../selftests/bpf/progs/fsession_test.c | 192 ++++++++++++++++++ 2 files changed, 282 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/fsession_test.c create mode 100644 tools/testing/selftests/bpf/progs/fsession_test.c diff --git a/tools/testing/selftests/bpf/prog_tests/fsession_test.c b/tools= /testing/selftests/bpf/prog_tests/fsession_test.c new file mode 100644 index 000000000000..83f3953a1ff6 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/fsession_test.c @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2025 ChinaTelecom */ +#include +#include "fsession_test.skel.h" + +static int check_result(struct fsession_test *skel) +{ + LIBBPF_OPTS(bpf_test_run_opts, topts); + int err, prog_fd; + + /* Trigger test function calls */ + prog_fd =3D bpf_program__fd(skel->progs.test1); + err =3D bpf_prog_test_run_opts(prog_fd, &topts); + if (!ASSERT_OK(err, "test_run_opts err")) + return err; + if (!ASSERT_OK(topts.retval, "test_run_opts retval")) + return topts.retval; + + for (int i =3D 0; i < sizeof(*skel->bss) / sizeof(__u64); i++) { + if (!ASSERT_EQ(((__u64 *)skel->bss)[i], 1, "test_result")) + return -EINVAL; + } + + return 0; +} + +static void test_fsession_basic(void) +{ + struct fsession_test *skel =3D NULL; + int err; + + skel =3D fsession_test__open_and_load(); + if (!ASSERT_OK_PTR(skel, "fsession_test__open_and_load")) + goto cleanup; + + err =3D fsession_test__attach(skel); + if (!ASSERT_OK(err, "fsession_attach")) + goto cleanup; + + check_result(skel); +cleanup: + fsession_test__destroy(skel); +} + +static void test_fsession_reattach(void) +{ + struct fsession_test *skel =3D NULL; + int err; + + skel =3D fsession_test__open_and_load(); + if (!ASSERT_OK_PTR(skel, "fsession_test__open_and_load")) + goto cleanup; + + /* First attach */ + err =3D fsession_test__attach(skel); + if (!ASSERT_OK(err, "fsession_first_attach")) + goto cleanup; + + if (check_result(skel)) + goto cleanup; + + /* Detach */ + fsession_test__detach(skel); + + /* Reset counters */ + memset(skel->bss, 0, sizeof(*skel->bss)); + + /* Second attach */ + err =3D fsession_test__attach(skel); + if (!ASSERT_OK(err, "fsession_second_attach")) + goto cleanup; + + if (check_result(skel)) + goto cleanup; + +cleanup: + fsession_test__destroy(skel); +} + +void test_fsession_test(void) +{ +#if !defined(__x86_64__) + test__skip(); + return; +#endif + if (test__start_subtest("fsession_basic")) + test_fsession_basic(); + if (test__start_subtest("fsession_reattach")) + test_fsession_reattach(); +} diff --git a/tools/testing/selftests/bpf/progs/fsession_test.c b/tools/test= ing/selftests/bpf/progs/fsession_test.c new file mode 100644 index 000000000000..f7c96ef1c7a9 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/fsession_test.c @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2025 ChinaTelecom */ +#include +#include +#include + +char _license[] SEC("license") =3D "GPL"; + +__u64 test1_entry_result =3D 0; +__u64 test1_exit_result =3D 0; + +SEC("fsession/bpf_fentry_test1") +int BPF_PROG(test1, int a, int ret) +{ + bool is_exit =3D bpf_fsession_is_return(ctx); + + if (!is_exit) { + /* This is entry */ + test1_entry_result =3D a =3D=3D 1 && ret =3D=3D 0; + /* Return 0 to allow exit to be called */ + return 0; + } + + /* This is exit */ + test1_exit_result =3D a =3D=3D 1 && ret =3D=3D 2; + return 0; +} + +__u64 test2_entry_result =3D 0; +__u64 test2_exit_result =3D 0; + +SEC("fsession/bpf_fentry_test3") +int BPF_PROG(test2, char a, int b, __u64 c, int ret) +{ + bool is_exit =3D bpf_fsession_is_return(ctx); + + if (!is_exit) { + test2_entry_result =3D a =3D=3D 4 && b =3D=3D 5 && c =3D=3D 6 && ret =3D= =3D 0; + return 0; + } + + test2_exit_result =3D a =3D=3D 4 && b =3D=3D 5 && c =3D=3D 6 && ret =3D= =3D 15; + return 0; +} + +__u64 test3_entry_result =3D 0; +__u64 test3_exit_result =3D 0; + +SEC("fsession/bpf_fentry_test4") +int BPF_PROG(test3, void *a, char b, int c, __u64 d, int ret) +{ + bool is_exit =3D bpf_fsession_is_return(ctx); + + if (!is_exit) { + test3_entry_result =3D a =3D=3D (void *)7 && b =3D=3D 8 && c =3D=3D 9 &&= d =3D=3D 10 && ret =3D=3D 0; + return 0; + } + + test3_exit_result =3D a =3D=3D (void *)7 && b =3D=3D 8 && c =3D=3D 9 && d= =3D=3D 10 && ret =3D=3D 34; + return 0; +} + +__u64 test4_entry_result =3D 0; +__u64 test4_exit_result =3D 0; + +SEC("fsession/bpf_fentry_test5") +int BPF_PROG(test4, __u64 a, void *b, short c, int d, __u64 e, int ret) +{ + bool is_exit =3D bpf_fsession_is_return(ctx); + + if (!is_exit) { + test4_entry_result =3D a =3D=3D 11 && b =3D=3D (void *)12 && c =3D=3D 13= && d =3D=3D 14 && + e =3D=3D 15 && ret =3D=3D 0; + return 0; + } + + test4_exit_result =3D a =3D=3D 11 && b =3D=3D (void *)12 && c =3D=3D 13 &= & d =3D=3D 14 && + e =3D=3D 15 && ret =3D=3D 65; + return 0; +} + +__u64 test5_entry_result =3D 0; +__u64 test5_exit_result =3D 0; + +SEC("fsession/bpf_fentry_test7") +int BPF_PROG(test5, struct bpf_fentry_test_t *arg, int ret) +{ + bool is_exit =3D bpf_fsession_is_return(ctx); + + if (!is_exit) { + if (!arg) + test5_entry_result =3D ret =3D=3D 0; + return 0; + } + + if (!arg) + test5_exit_result =3D 1; + return 0; +} + +__u64 test6_entry_result =3D 0; +__u64 test6_exit_result =3D 0; +/* + * test1, test8 and test9 hook the same target to verify the "ret" is alwa= ys + * 0 in the entry. + */ +SEC("fsession/bpf_fentry_test1") +int BPF_PROG(test6, int a, int ret) +{ + bool is_exit =3D bpf_fsession_is_return(ctx); + + if (!is_exit) { + test6_entry_result =3D a =3D=3D 1 && ret =3D=3D 0; + return 0; + } + + /* This is exit */ + test6_exit_result =3D 1; + return 0; +} + +__u64 test7_entry_result =3D 0; +__u64 test7_exit_result =3D 0; + +SEC("fsession/bpf_fentry_test1") +int BPF_PROG(test7, int a, int ret) +{ + bool is_exit =3D bpf_fsession_is_return(ctx); + + if (!is_exit) { + test7_entry_result =3D a =3D=3D 1 && ret =3D=3D 0; + return 0; + } + + test7_exit_result =3D 1; + return 0; +} + +__u64 test8_entry_result =3D 0; +__u64 test8_exit_result =3D 0; +SEC("fsession/bpf_fentry_test1") +int BPF_PROG(test8, int a) +{ + __u64 addr =3D bpf_get_func_ip(ctx); + + if (bpf_fsession_is_return(ctx)) + test8_exit_result =3D (const void *) addr =3D=3D &bpf_fentry_test1; + else + test8_entry_result =3D (const void *) addr =3D=3D &bpf_fentry_test1; + return 0; +} + +__u64 test9_entry_ok =3D 0; +__u64 test9_exit_ok =3D 0; +SEC("fsession/bpf_fentry_test1") +int BPF_PROG(test9, int a) +{ + __u64 *cookie =3D bpf_fsession_cookie(ctx); + + if (!bpf_fsession_is_return(ctx)) { + if (cookie) { + *cookie =3D 0xAAAABBBBCCCCDDDDull; + test9_entry_ok =3D *cookie =3D=3D 0xAAAABBBBCCCCDDDDull; + } + return 0; + } + + if (cookie) + test9_exit_ok =3D *cookie =3D=3D 0xAAAABBBBCCCCDDDDull; + return 0; +} + +__u64 test10_entry_ok =3D 0; +__u64 test10_exit_ok =3D 0; + +SEC("fsession/bpf_fentry_test1") +int BPF_PROG(test10, int a) +{ + __u64 *cookie =3D bpf_fsession_cookie(ctx); + + if (!bpf_fsession_is_return(ctx)) { + if (cookie) { + *cookie =3D 0x1111222233334444ull; + test10_entry_ok =3D *cookie =3D=3D 0x1111222233334444ull; + } + return 0; + } + + if (cookie) + test10_exit_ok =3D *cookie =3D=3D 0x1111222233334444ull; + return 0; +} --=20 2.52.0 From nobody Sat Feb 7 07:09:37 2026 Received: from mail-pl1-f194.google.com (mail-pl1-f194.google.com [209.85.214.194]) (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 3B0BB344031 for ; Wed, 17 Dec 2025 09:55:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.194 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965356; cv=none; b=BZzJh+6Z/L1ow5fJfdtUO4kjwzB6HWlFiILcwRV+Gn3xOEPd9MMmc25hpwEQ8QwDaV/GMC2mKVuThBlHyJC4Gjkib62hauxwKcRfJPwG8tL66zbAbaEikPKa+gJbHh1Vr+1oIY4xWtL/WHeYPw5/aZMjuLiSfmMbjl3bXjI8240= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765965356; c=relaxed/simple; bh=Yb5/UWx4ETqVzjpmnt4mp4ucReGhuU4KaNvRMGqzA/Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GWr3HaJbir7My+ivhqOa2yt9C8cxbjFYlm1BmsCCjC9f7Akq2nxOy/CLpnG19wUDGbH1R9U8gAnQFtjScxmMB48/6YxohqiF52uO6FdYOk5elXwH39x6h2XSz9EP7/ybbfiqfyhfJ1kxoVlI39IRysBL6E++v0h0SC/kk2UR9XA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Vrsuoc0G; arc=none smtp.client-ip=209.85.214.194 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Vrsuoc0G" Received: by mail-pl1-f194.google.com with SMTP id d9443c01a7336-2a110548cdeso34948145ad.0 for ; Wed, 17 Dec 2025 01:55:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765965352; x=1766570152; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=N1TUFEJUx0NUwFPar33N5JyqgDjZHtLZ8/dAi+dAv+U=; b=Vrsuoc0GGDCWFdn/fgOI4170rQDbkpEruQK0lgp3GxtjQKpW5K2lvepj6Ly8CSgSO6 02kPVnPwHVLGYXGM/DlykQ6jWYov3gX13dBeMOJG1VdOXbHGxjpuIyxEjB7l1s0EwMmR 6IskURwA59Kwp6VtI2YxoDZQLvIFBFo98lR7lad6mPgdfFhNcROj/gJq8r/nwnMSJHMk DQdKKsai+4dXCaEyRiBwGrjT3e9CecVVjNJcfUGWaLvzqmpwSdwW/kIZREnSy0KC9ylj zu/vvXAPoQhB+A2JfCDv+4xr0q5+0N5jOL3XQFaJN7O+uceVaFgcUMv8QqZNpsZLf0J6 qnRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765965352; x=1766570152; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=N1TUFEJUx0NUwFPar33N5JyqgDjZHtLZ8/dAi+dAv+U=; b=oySTTOGdAZTr2IMVYAIMvrEbAmhvHkcozcWEHTjq+zfbCNZp1Dv+C0kn3erj9c8hLU 1sdd/sK8O7OhTmOqJYCCCoRY4lrZN50RrhRvk4rbCNSM+7luYNnM3X9cOsmuN+c3FSo6 /7Uc99qIj88pl2dOrS39BMD66kSZN47ZRVpNe+es8rRG3Lgka6/b6iTEdPpvqWGnWFkT X1EDPeBE+zbfihCdv7pWjAu/4Ba8Qt1y8Jv2dVYYSaSdtxry9Bh+gJ3nBU55nBePsLfE XxO0qt39/i81QnLQTg/5HRfqscmcTUp+nbDnkLh+gPUG7ILJwn7DVB9rx3TioOts+PxJ nAUg== X-Forwarded-Encrypted: i=1; AJvYcCVO9nhOYFJB8QIYY4Vany7+hSYHw7hHrkWGdyl0eK4Z+TO3ZyKrafMv4HmkEl33Vz9dhdeL72+DRJzHRBw=@vger.kernel.org X-Gm-Message-State: AOJu0YwZ+UurKr9JxHUkvrigUwcbkNvnOIprmIFAgqlhs5txV7Amvo/f BmfRul8k3s/uLtt1/j/FaT+uYyJ+oheU7GRFSc5FXWsnhJdxq5KeZev7 X-Gm-Gg: AY/fxX6Dxk4XUmF7CMQooflruY7RGC6+WOpr4PLlWP4powCBA1SYI4bHSYdmc0a9tbI 1G9VtLwq1ShG9wQn5UOyyXnrdGAseiXXGlLorlQe/QcsVXRoZebbIHUjlAs2MG+Y0CBMQ2Ivb/p ccwzsmBzl8X19PY9+1OP2friPwmOBSVLTQNTjyWLZpxgbORw6Bjq3krCe1V5wJISTfx7bU60nZi uR9mLZ/OrM8sI2Fys6Xq3h6thPR+N3xkmy8BgEDraETL8vLSPe/A+ay3M7X8BIYj/sT+w3regSi Zg81bewKtNtOLSFiw2Zi4EOPvgBj4d5MjmET7YpCEYppSmT2V4iARwfptro+i2w/BCsZxs3bCEk cPcR645tqcN0WbI3lRUdQwX5RN2bzEsWzB9tmEZ803oKJmd5wm6rm5k5Aukix7SNFLQK3H14PEx vDHE2n2V0= X-Google-Smtp-Source: AGHT+IH/IrGCAvWhN5SwCzXnuM6ATb26TVbLzAtyqwtKp2xc+K59EJog5pKbvQBAIw3NE1gXxnNZ3Q== X-Received: by 2002:a17:903:144f:b0:2a0:e80e:b118 with SMTP id d9443c01a7336-2a0e80eb3bemr106850305ad.7.1765965352560; Wed, 17 Dec 2025 01:55:52 -0800 (PST) Received: from 7940hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a07fa0b1aasm140715945ad.3.2025.12.17.01.55.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Dec 2025 01:55:52 -0800 (PST) From: Menglong Dong X-Google-Original-From: Menglong Dong To: ast@kernel.org, andrii@kernel.org Cc: davem@davemloft.net, dsahern@kernel.org, daniel@iogearbox.net, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH bpf-next v4 9/9] selftests/bpf: test fsession mixed with fentry and fexit Date: Wed, 17 Dec 2025 17:54:45 +0800 Message-ID: <20251217095445.218428-10-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251217095445.218428-1-dongml2@chinatelecom.cn> References: <20251217095445.218428-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Test the fsession when it is used together with fentry, fexit. Signed-off-by: Menglong Dong --- .../selftests/bpf/progs/fsession_test.c | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tools/testing/selftests/bpf/progs/fsession_test.c b/tools/test= ing/selftests/bpf/progs/fsession_test.c index f7c96ef1c7a9..223a6ea47888 100644 --- a/tools/testing/selftests/bpf/progs/fsession_test.c +++ b/tools/testing/selftests/bpf/progs/fsession_test.c @@ -190,3 +190,37 @@ int BPF_PROG(test10, int a) test10_exit_ok =3D *cookie =3D=3D 0x1111222233334444ull; return 0; } + +__u64 test11_entry_result =3D 0; +__u64 test11_exit_result =3D 0; + +SEC("fsession/bpf_fentry_test1") +int BPF_PROG(test11, int a, int ret) +{ + __u64 *cookie =3D bpf_fsession_cookie(ctx); + + if (!bpf_fsession_is_return(ctx)) { + test11_entry_result =3D a =3D=3D 1 && ret =3D=3D 0; + *cookie =3D 0x123456ULL; + return 0; + } + + test11_exit_result =3D a =3D=3D 1 && ret =3D=3D 2 && *cookie =3D=3D 0x123= 456ULL; + return 0; +} + +__u64 test12_result =3D 0; +SEC("fexit/bpf_fentry_test1") +int BPF_PROG(test12, int a, int ret) +{ + test12_result =3D a =3D=3D 1 && ret =3D=3D 2; + return 0; +} + +__u64 test13_result =3D 0; +SEC("fentry/bpf_fentry_test1") +int BPF_PROG(test13, int a) +{ + test13_result =3D a =3D=3D 1; + return 0; +} --=20 2.52.0