On 16/01/26 1:19 pm, Christophe Leroy (CS GROUP) wrote:
Le 16/01/2026 à 05:50, Hari Bathini a écrit :
Not received this mail that Hari is reponding to.
That is weird.
On 14/01/26 6:33 pm, adubey wrote:
On 2026-01-14 17:57, Christophe Leroy (CS GROUP) wrote:
Le 14/01/2026 à 12:44, [email protected] a écrit :
From: Abhishek Dubey <[email protected]>
Enabling tailcalls with subprog combinations by referencing
method. The actual tailcall count is always maintained in the
tail_call_info variable present in the frame of main function
(also called entry function). The tail_call_info variables in
the frames of all other subprog contains reference to the
tail_call_info present in frame of main function.
Dynamic resolution interprets the tail_call_info either as
value or reference depending on the context of active frame
while tailcall is invoked.
Signed-off-by: Abhishek Dubey <[email protected]>
---
arch/powerpc/net/bpf_jit.h | 12 +++++-
arch/powerpc/net/bpf_jit_comp.c | 10 ++++-
arch/powerpc/net/bpf_jit_comp64.c | 68 ++++++++++++++++++++++
+--------
3 files changed, 70 insertions(+), 20 deletions(-)
diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h
index 45d419c0ee73..5d735bc5e6bd 100644
--- a/arch/powerpc/net/bpf_jit.h
+++ b/arch/powerpc/net/bpf_jit.h
@@ -51,6 +51,12 @@
EMIT(PPC_INST_BRANCH_COND | (((cond) & 0x3ff) << 16) |
(offset & 0xfffc)); \
} while (0)
+/* Same as PPC_BCC_SHORT, except valid dest is known prior to
call. */
+#define PPC_COND_BRANCH(cond, dest) \
+ do { \
+ long offset = (long)(dest) - CTX_NIA(ctx); \
+ EMIT(PPC_INST_BRANCH_COND | (((cond) & 0x3ff) << 16) |
(offset & 0xfffc)); \
+ } while (0)
I don't like the idea of duplicating PPC_BCC_SHORT() to just kick the
verification out. Now we will have two macros doing the exact same
thing with one handling failure case and one ignoring failure case.
There is a big risk that one day or another someone will use the wrong
macro.
Could you change bpf_jit_build_prologue() to return an int add use
PPC_BCC_SHORT() instead of that new PPC_COND_BRANCH() ?
I implemented exactly same change in bpf_jit_build_prologue(). But,
during internal review, @HariBathini suggested
to have separate macro with a caution note.
@Hari please suggest here!
Not just about the change of return type but the check seems like an
overkill for cases where the offset is known and within branch range.
How about using BUILD_BUG_ON() to avoid unecessary checks and
return type change for places where the branch offset is known
and is a constant?
When offset is a constant known at build time, checks are eliminated by
gcc at build, see exemple below from disasembly of bpf_jit_comp32.o,
there are no checks.
PPC_BCC_SHORT(COND_GT, (ctx->idx + 4) *
4);
36d8: 3c 80 41 81 lis r4,16769
EMIT(PPC_RAW_CMPLW(src_reg, _R0));
36dc: 81 3f 00 04 lwz r9,4(r31)
PPC_BCC_SHORT(COND_GT, (ctx->idx + 4) *
4);
36e0: 60 84 00 10 ori r4,r4,16
EMIT(PPC_RAW_CMPLW(src_reg, _R0));
36e4: 39 29 00 01 addi r9,r9,1
PPC_BCC_SHORT(COND_GT, (ctx->idx + 4) *
4);
36e8: 55 23 10 3a slwi r3,r9,2
EMIT(PPC_RAW_CMPLW(src_reg, _R0));
36ec: 91 3f 00 04 stw r9,4(r31)
PPC_BCC_SHORT(COND_GT, (ctx->idx + 4) *
4);
36f0: 7c 97 19 2e stwx r4,r23,r3
EMIT(PPC_RAW_LI(dst_reg, 0));
36f4: 55 49 a9 94 rlwinm r9,r10,21,6,10
PPC_BCC_SHORT(COND_GT, (ctx->idx + 4) *
4);
36f8: 80 9f 00 04 lwz r4,4(r31)
EMIT(PPC_RAW_LI(dst_reg, 0));
36fc: 65 29 38 00 oris r9,r9,14336
PPC_BCC_SHORT(COND_GT, (ctx->idx + 4) *
4);
3700: 38 84 00 01 addi r4,r4,1
EMIT(PPC_RAW_LI(dst_reg, 0));
3704: 54 83 10 3a slwi r3,r4,2
PPC_BCC_SHORT(COND_GT, (ctx->idx + 4) *
4);
3708: 90 9f 00 04 stw r4,4(r31)
EMIT(PPC_RAW_LI(dst_reg, 0));
370c: 7d 37 19 2e stwx r9,r23,r3
Interesting. I do see is_offset_in_cond_branch_range() in action with
constant offsets too, on ppc64 compile at least. fwiw, I had this
optimized version in mind for constant offset:
#define PPC_BCC_CONST_SHORT(cond, offset)
\
do {
\
BUILD_BUG_ON(offset < -0x8000 || offset > 0x7fff ||
(offset & 0x3)); \
EMIT(PPC_INST_BRANCH_COND | (((cond) & 0x3ff) << 16) |
(offset & 0xfffc)); \
} while (0)
With that, something like:
PPC_BCC_SHORT(COND_NE, (ctx->idx + 3) * 4);
becomes
PPC_BCC_CONST_SHORT(COND_NE, 12);
- Hari