public inbox for bpf@vger.kernel.org
 help / color / mirror / Atom feed
From: Menglong Dong <menglong.dong@linux.dev>
To: Hengqi Chen <hengqi.chen@gmail.com>
Cc: ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org,
	martin.lau@linux.dev, chenhuacai@kernel.org,
	yangtiezhu@loongson.cn, vincent.mc.li@gmail.com,
	menglong8.dong@gmail.com, loongarch@lists.linux.dev,
	bpf@vger.kernel.org, Hengqi Chen <hengqi.chen@gmail.com>
Subject: Re: [PATCH 2/3] LoongArch: BPF: Add fsession support for trampolines
Date: Wed, 04 Mar 2026 10:11:49 +0800	[thread overview]
Message-ID: <2254625.irdbgypaU6@7940hx> (raw)
In-Reply-To: <20260226065952.4082859-3-hengqi.chen@gmail.com>

On 2026/2/26 14:59 Hengqi Chen <hengqi.chen@gmail.com> write:
> Implement BPF_TRACE_FSESSION support in LoongArch BPF JIT.
> The logic here is almost identical to what has been done in
> RISC-V JIT.
> 
> The key changes are:
>   - Allocate stack space for function meta and session cookies
>   - Introduce invoke_bpf() as a wrapper around invoke_bpf_prog()
>     that populates session cookies before each invocation
>   - Implement bpf_jit_supports_fsession() callback
> 
> Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com>
> ---
>  arch/loongarch/net/bpf_jit.c | 78 +++++++++++++++++++++++++++++++-----
>  1 file changed, 67 insertions(+), 11 deletions(-)
> 
> diff --git a/arch/loongarch/net/bpf_jit.c b/arch/loongarch/net/bpf_jit.c
> index e3deb0da6a50..16da53f80266 100644
> --- a/arch/loongarch/net/bpf_jit.c
> +++ b/arch/loongarch/net/bpf_jit.c
> @@ -1549,6 +1549,31 @@ static int invoke_bpf_prog(struct jit_ctx *ctx, struct bpf_tramp_link *l,
>  	return ret;
>  }
>  

LGTM.

Reviewed-by: Menglong Dong <menglong8.dong@gmail.com>

Some nits maybe you can do when you respin the V2 if you don't mind,
see below.

> +static int invoke_bpf(struct jit_ctx *ctx, struct bpf_tramp_links *tl,
> +		      int args_off, int retval_off, int run_ctx_off,
> +		      int func_meta_off, bool save_ret, u64 func_meta,
> +		      int cookie_off)
> +{
[...]
>  
> +	if (bpf_fsession_cnt(tlinks)) {
> +		/* clear all session cookies' value */
> +		for (i = 0; i < cookie_cnt; i++)
> +			emit_insn(ctx, std, LOONGARCH_GPR_ZERO, LOONGARCH_GPR_FP, -cookie_off + 8 * i);
> +		/* clear return value to make sure fentry always get 0 */
> +		emit_insn(ctx, std, LOONGARCH_GPR_ZERO, LOONGARCH_GPR_FP, -retval_off);
> +	}
> +
>  	/* To traced function */
>  	/* Ftrace jump skips 2 NOP instructions */
>  	if (is_kernel_text((unsigned long)orig_call) ||
> @@ -1755,9 +1799,10 @@ static int __arch_prepare_bpf_trampoline(struct jit_ctx *ctx, struct bpf_tramp_i
>  			return ret;
>  	}
>  
> -	for (i = 0; i < fentry->nr_links; i++) {
> -		ret = invoke_bpf_prog(ctx, fentry->links[i], args_off, retval_off,
> -				      run_ctx_off, flags & BPF_TRAMP_F_RET_FENTRY_RET);
> +	if (fentry->nr_links) {

This checking is unnecessary, as invoke_bpf() will return directly
if !fentry->nr_links.

PS: I was told this when I implement the fsession for s390 this way :)


> +		ret = invoke_bpf(ctx, fentry, args_off, retval_off, run_ctx_off,
> +				 func_meta_off, flags & BPF_TRAMP_F_RET_FENTRY_RET,
> +				 func_meta, cookie_off);
>  		if (ret)
>  			return ret;
>  	}
> @@ -1791,8 +1836,14 @@ static int __arch_prepare_bpf_trampoline(struct jit_ctx *ctx, struct bpf_tramp_i
>  		*branches[i] = larch_insn_gen_bne(LOONGARCH_GPR_T1, LOONGARCH_GPR_ZERO, offset);
>  	}
>  
> -	for (i = 0; i < fexit->nr_links; i++) {
> -		ret = invoke_bpf_prog(ctx, fexit->links[i], args_off, retval_off, run_ctx_off, false);
> +	/* set "is_return" flag for fsession */
> +	func_meta |= (1ULL << BPF_TRAMP_IS_RETURN_SHIFT);
> +	if (bpf_fsession_cnt(tlinks))
> +		emit_store_stack_imm64(ctx, LOONGARCH_GPR_T1, -func_meta_off, func_meta);
> +
> +	if (fexit->nr_links) {

And this checking.

Thanks!
Menglong Dong

> +		ret = invoke_bpf(ctx, fexit, args_off, retval_off, run_ctx_off,
> +				 func_meta_off, false, func_meta, cookie_off);
>  		if (ret)
>  			goto out;
>  	}
> @@ -2132,3 +2183,8 @@ bool bpf_jit_supports_subprog_tailcalls(void)
>  {
>  	return true;
>  }
> +
> +bool bpf_jit_supports_fsession(void)
> +{
> +	return true;
> +}
> -- 
> 2.43.5
> 
> 
> 





  reply	other threads:[~2026-03-04  2:12 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-26  6:59 [PATCH 0/3] bpf: fsession support for LoongArch Hengqi Chen
2026-02-26  6:59 ` [PATCH 1/3] LoongArch: BPF: Introduce emit_store_stack_imm64() helper Hengqi Chen
2026-03-04  2:04   ` Menglong Dong
2026-02-26  6:59 ` [PATCH 2/3] LoongArch: BPF: Add fsession support for trampolines Hengqi Chen
2026-03-04  2:11   ` Menglong Dong [this message]
2026-02-26  6:59 ` [PATCH bpf-next 3/3] bpf/selftests: Enable fsession tests for LoongArch Hengqi Chen
2026-02-27  1:59   ` Vincent Li
2026-03-04  1:43   ` Menglong Dong
2026-03-04  2:51 ` [PATCH 0/3] bpf: fsession support " 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=2254625.irdbgypaU6@7940hx \
    --to=menglong.dong@linux.dev \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=chenhuacai@kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=hengqi.chen@gmail.com \
    --cc=loongarch@lists.linux.dev \
    --cc=martin.lau@linux.dev \
    --cc=menglong8.dong@gmail.com \
    --cc=vincent.mc.li@gmail.com \
    --cc=yangtiezhu@loongson.cn \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox