All of lore.kernel.org
 help / color / mirror / Atom feed
From: Menglong Dong <menglong.dong@linux.dev>
To: Menglong Dong <menglong8.dong@gmail.com>,
	Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: ast@kernel.org, andrii@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, davem@davemloft.net, dsahern@kernel.org,
	tglx@linutronix.de, mingo@redhat.com, jiang.biao@linux.dev,
	bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org,
	hpa@zytor.com, bpf@vger.kernel.org, netdev@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH bpf-next v9 04/11] bpf: support fsession for bpf_session_is_return
Date: Wed, 14 Jan 2026 10:25:31 +0800	[thread overview]
Message-ID: <9562692.CDJkKcVGEf@7940hx> (raw)
In-Reply-To: <CAEf4BzZBhGfWN3t0_u-1GrOxtjoJUhMk+NqAaZFnFpgB4QskHQ@mail.gmail.com>

On 2026/1/14 09:22 Andrii Nakryiko <andrii.nakryiko@gmail.com> write:
> On Sat, Jan 10, 2026 at 6:12 AM Menglong Dong <menglong8.dong@gmail.com> wrote:
> >
> > If fsession exists, we will use the bit (1 << BPF_TRAMP_M_IS_RETURN) in
> > ctx[-1] to store the "is_return" flag.
> >
> > The logic of bpf_session_is_return() for fsession is implemented in the
> > verifier by inline following code:
> >
> >   bool bpf_session_is_return(void *ctx)
> >   {
> >       return !!(((u64 *)ctx)[-1] & (1 << BPF_TRAMP_M_IS_RETURN));
> 
> this look unnecessarily scary :) !! part is unnecessary because
> non-zero integer will be converted to proper true(1)/false(0) by
> compiler. But I'd just rewrite it in arguably slightly simpler form
> that lays itself to assembly more directly:
> 
> return ((u64 *)ctx[-1] >> BPF_TRAMP_M_IS_RETURN) & 1;

Yeah, the C code in the comment is wrong and not corresponding
to the inline code. I'll update it in the next version.

> 
> >   }
> >
[......]
> >  };
> >
> > +#define BPF_TRAMP_M_NR_ARGS    0
> > +#define BPF_TRAMP_M_IS_RETURN  8
> 
> nit: What does "M" stand for? Macro? Mask? Menglong? ;) Some new
> convention, why?

Ah, I think it stand for Mask. I'm not good at naming, and
this word come to my mind when I want a prefix for the
case ;)

> 
> > +
> >  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 bfff3f84fd91..1b0292a03186 100644
> > --- a/kernel/bpf/verifier.c
> > +++ b/kernel/bpf/verifier.c
> > @@ -12374,6 +12374,7 @@ enum special_kfunc_type {
> >         KF_bpf_arena_alloc_pages,
> >         KF_bpf_arena_free_pages,
> >         KF_bpf_arena_reserve_pages,
> > +       KF_bpf_session_is_return,
> >  };
> >
> >  BTF_ID_LIST(special_kfunc_list)
> > @@ -12451,6 +12452,7 @@ BTF_ID(func, bpf_task_work_schedule_resume_impl)
> >  BTF_ID(func, bpf_arena_alloc_pages)
> >  BTF_ID(func, bpf_arena_free_pages)
> >  BTF_ID(func, bpf_arena_reserve_pages)
> > +BTF_ID(func, bpf_session_is_return)
> >
> >  static bool is_task_work_add_kfunc(u32 func_id)
> >  {
> > @@ -12505,7 +12507,8 @@ get_kfunc_ptr_arg_type(struct bpf_verifier_env *env,
> >         struct bpf_reg_state *reg = &regs[regno];
> >         bool arg_mem_size = false;
> >
> > -       if (meta->func_id == special_kfunc_list[KF_bpf_cast_to_kern_ctx])
> > +       if (meta->func_id == special_kfunc_list[KF_bpf_cast_to_kern_ctx] ||
> > +           meta->func_id == special_kfunc_list[KF_bpf_session_is_return])
> >                 return KF_ARG_PTR_TO_CTX;
> >
> >         if (argno + 1 < nargs &&
> > @@ -22558,6 +22561,16 @@ static int fixup_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
> >                    desc->func_id == special_kfunc_list[KF_bpf_rdonly_cast]) {
> >                 insn_buf[0] = BPF_MOV64_REG(BPF_REG_0, BPF_REG_1);
> >                 *cnt = 1;
> > +       } else if (desc->func_id == special_kfunc_list[KF_bpf_session_is_return] &&
> > +                  env->prog->expected_attach_type == BPF_TRACE_FSESSION) {
> > +               /* implement and inline the bpf_session_is_return() for
> 
> nit: comment style

ACK

> 
> > +                * fsession, and the logic is:
> > +                *   return !!(((u64 *)ctx)[-1] & (1 << BPF_TRAMP_M_IS_RETURN))
> > +                */
> > +               insn_buf[0] = BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8);
> > +               insn_buf[1] = BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, BPF_TRAMP_M_IS_RETURN);
> > +               insn_buf[2] = BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1);
> 
> lol, your assembly is simpler than that C expression above, let's keep
> C close to what you actually are doing in assembler

ACK

> 
> > +               *cnt = 3;
> >         }
> >
> >         if (env->insn_aux_data[insn_idx].arg_prog) {
> > diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
> > index 297dcafb2c55..1fe508d451b7 100644
> > --- a/kernel/trace/bpf_trace.c
> > +++ b/kernel/trace/bpf_trace.c
> > @@ -3334,34 +3334,40 @@ __bpf_kfunc __u64 *bpf_session_cookie(void *ctx)
> >
> >  __bpf_kfunc_end_defs();
> >
> > -BTF_KFUNCS_START(kprobe_multi_kfunc_set_ids)
> > +BTF_KFUNCS_START(session_kfunc_set_ids)
> >  BTF_ID_FLAGS(func, bpf_session_is_return)
> >  BTF_ID_FLAGS(func, bpf_session_cookie)
> > -BTF_KFUNCS_END(kprobe_multi_kfunc_set_ids)
> > +BTF_KFUNCS_END(session_kfunc_set_ids)
> >
> > -static int bpf_kprobe_multi_filter(const struct bpf_prog *prog, u32 kfunc_id)
> > +static int bpf_session_filter(const struct bpf_prog *prog, u32 kfunc_id)
> >  {
> > -       if (!btf_id_set8_contains(&kprobe_multi_kfunc_set_ids, kfunc_id))
> > +       if (!btf_id_set8_contains(&session_kfunc_set_ids, kfunc_id))
> >                 return 0;
> >
> > -       if (!is_kprobe_session(prog) && !is_uprobe_session(prog))
> > +       if (!is_kprobe_session(prog) && !is_uprobe_session(prog) &&
> > +           prog->expected_attach_type != BPF_TRACE_FSESSION)
> 
> check both expected_attach_type *and* prog_type, please (and I think
> it would be good to check prog type for kprobe_session and
> uprobe_session as well, because now it's not guaranteed that program
> will be of BPF_PROG_TYPE_KPROBE

OK, it make sense. I'll check the prog_type for all of them.

Thanks!
Menglong Dong

> 
> 
> >                 return -EACCES;
> >
> >         return 0;
> >  }
> >
> > -static const struct btf_kfunc_id_set bpf_kprobe_multi_kfunc_set = {
> > +static const struct btf_kfunc_id_set bpf_session_kfunc_set = {
> >         .owner = THIS_MODULE,
> > -       .set = &kprobe_multi_kfunc_set_ids,
> > -       .filter = bpf_kprobe_multi_filter,
> > +       .set = &session_kfunc_set_ids,
> > +       .filter = bpf_session_filter,
> >  };
> >
> > -static int __init bpf_kprobe_multi_kfuncs_init(void)
> > +static int __init bpf_trace_kfuncs_init(void)
> >  {
> > -       return register_btf_kfunc_id_set(BPF_PROG_TYPE_KPROBE, &bpf_kprobe_multi_kfunc_set);
> > +       int err = 0;
> > +
> > +       err = err ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_KPROBE, &bpf_session_kfunc_set);
> > +       err = err ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_TRACING, &bpf_session_kfunc_set);
> > +
> > +       return err;
> >  }
> >
> > -late_initcall(bpf_kprobe_multi_kfuncs_init);
> > +late_initcall(bpf_trace_kfuncs_init);
> >
> >  typedef int (*copy_fn_t)(void *dst, const void *src, u32 size, struct task_struct *tsk);
> >
> > --
> > 2.52.0
> >
> 





  reply	other threads:[~2026-01-14  2:25 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-10 14:11 [PATCH bpf-next v9 00/11] bpf: fsession support Menglong Dong
2026-01-10 14:11 ` [PATCH bpf-next v9 01/11] bpf: add " Menglong Dong
2026-01-14  1:22   ` Andrii Nakryiko
2026-01-14  2:10     ` Menglong Dong
2026-01-14 18:56       ` Andrii Nakryiko
2026-01-15  2:05         ` Menglong Dong
2026-01-15  8:33         ` Menglong Dong
2026-01-10 14:11 ` [PATCH bpf-next v9 02/11] bpf: use last 8-bits for the nr_args in trampoline Menglong Dong
2026-01-14  1:22   ` Andrii Nakryiko
2026-01-14  2:19     ` Menglong Dong
2026-01-14  9:52       ` David Laight
2026-01-10 14:11 ` [PATCH bpf-next v9 03/11] bpf: change prototype of bpf_session_{cookie,is_return} Menglong Dong
2026-01-14  1:22   ` Andrii Nakryiko
2026-01-14  2:19     ` Menglong Dong
2026-01-10 14:11 ` [PATCH bpf-next v9 04/11] bpf: support fsession for bpf_session_is_return Menglong Dong
2026-01-14  1:22   ` Andrii Nakryiko
2026-01-14  2:25     ` Menglong Dong [this message]
2026-01-10 14:11 ` [PATCH bpf-next v9 05/11] bpf: support fsession for bpf_session_cookie Menglong Dong
2026-01-10 14:42   ` bot+bpf-ci
2026-01-11  1:54     ` Menglong Dong
2026-01-14  1:22   ` Andrii Nakryiko
2026-01-14  2:33     ` Alexei Starovoitov
2026-01-14  2:38       ` Menglong Dong
2026-01-14  2:48     ` Menglong Dong
2026-01-10 14:11 ` [PATCH bpf-next v9 06/11] bpf,x86: introduce emit_store_stack_imm64() for trampoline Menglong Dong
2026-01-14  1:22   ` Andrii Nakryiko
2026-01-14  2:31     ` Menglong Dong
2026-01-10 14:11 ` [PATCH bpf-next v9 07/11] bpf,x86: add fsession support for x86_64 Menglong Dong
2026-01-14  1:25   ` Andrii Nakryiko
2026-01-14  3:27     ` Menglong Dong
2026-01-14  3:35       ` Menglong Dong
2026-01-14 19:05       ` Andrii Nakryiko
2026-01-15  2:12         ` Menglong Dong
2026-01-10 14:11 ` [PATCH bpf-next v9 08/11] libbpf: add fsession support Menglong Dong
2026-01-14  1:24   ` Andrii Nakryiko
2026-01-14  3:27     ` Menglong Dong
2026-01-10 14:11 ` [PATCH bpf-next v9 09/11] selftests/bpf: add testcases for fsession Menglong Dong
2026-01-10 14:11 ` [PATCH bpf-next v9 10/11] selftests/bpf: add testcases for fsession cookie Menglong Dong
2026-01-10 14:11 ` [PATCH bpf-next v9 11/11] selftests/bpf: test fsession mixed with fentry and fexit Menglong Dong
2026-01-14  2:28 ` [PATCH bpf-next v9 00/11] bpf: fsession support Alexei Starovoitov
2026-01-14  2:52   ` Menglong Dong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9562692.CDJkKcVGEf@7940hx \
    --to=menglong.dong@linux.dev \
    --cc=andrii.nakryiko@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bp@alien8.de \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=dave.hansen@linux.intel.com \
    --cc=davem@davemloft.net \
    --cc=dsahern@kernel.org \
    --cc=eddyz87@gmail.com \
    --cc=haoluo@google.com \
    --cc=hpa@zytor.com \
    --cc=jiang.biao@linux.dev \
    --cc=john.fastabend@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=kpsingh@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=martin.lau@linux.dev \
    --cc=menglong8.dong@gmail.com \
    --cc=mingo@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=sdf@fomichev.me \
    --cc=song@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    --cc=yonghong.song@linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.