Skip to content

Commit

Permalink
powerpc/code-patching: Inline create_branch()
Browse files Browse the repository at this point in the history
create_branch() is a good candidate for inlining because:
- Flags can be folded in.
- Range tests are likely to be already done.

Hence reducing the create_branch() to only a set of instructions.

So inline it.

It improves ftrace activation by 10%.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/69851cc9a7bf8f03d025e6d29e165f2d0bd3bb6e.1652074503.git.christophe.leroy@csgroup.eu
  • Loading branch information
Christophe Leroy authored and Michael Ellerman committed May 19, 2022
1 parent a1facd2 commit d2f47da
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 22 deletions.
22 changes: 20 additions & 2 deletions arch/powerpc/include/asm/code-patching.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,26 @@ static inline bool is_offset_in_cond_branch_range(long offset)
return offset >= -0x8000 && offset <= 0x7fff && !(offset & 0x3);
}

int create_branch(ppc_inst_t *instr, const u32 *addr,
unsigned long target, int flags);
static inline int create_branch(ppc_inst_t *instr, const u32 *addr,
unsigned long target, int flags)
{
long offset;

*instr = ppc_inst(0);
offset = target;
if (! (flags & BRANCH_ABSOLUTE))
offset = offset - (unsigned long)addr;

/* Check we can represent the target in the instruction format */
if (!is_offset_in_branch_range(offset))
return 1;

/* Mask out the flags and target, so they don't step on each other. */
*instr = ppc_inst(0x48000000 | (flags & 0x3) | (offset & 0x03FFFFFC));

return 0;
}

int create_cond_branch(ppc_inst_t *instr, const u32 *addr,
unsigned long target, int flags);
int patch_branch(u32 *addr, unsigned long target, int flags);
Expand Down
20 changes: 0 additions & 20 deletions arch/powerpc/lib/code-patching.c
Original file line number Diff line number Diff line change
Expand Up @@ -236,26 +236,6 @@ bool is_conditional_branch(ppc_inst_t instr)
}
NOKPROBE_SYMBOL(is_conditional_branch);

int create_branch(ppc_inst_t *instr, const u32 *addr,
unsigned long target, int flags)
{
long offset;

*instr = ppc_inst(0);
offset = target;
if (! (flags & BRANCH_ABSOLUTE))
offset = offset - (unsigned long)addr;

/* Check we can represent the target in the instruction format */
if (!is_offset_in_branch_range(offset))
return 1;

/* Mask out the flags and target, so they don't step on each other. */
*instr = ppc_inst(0x48000000 | (flags & 0x3) | (offset & 0x03FFFFFC));

return 0;
}

int create_cond_branch(ppc_inst_t *instr, const u32 *addr,
unsigned long target, int flags)
{
Expand Down

0 comments on commit d2f47da

Please sign in to comment.