jump_label, x86: Emit short JMP
authorPeter Zijlstra <peterz@infradead.org>
Thu, 6 May 2021 19:34:01 +0000 (21:34 +0200)
committerIngo Molnar <mingo@kernel.org>
Wed, 12 May 2021 12:54:55 +0000 (14:54 +0200)
Now that we can patch short JMP/NOP, allow the compiler/assembler to
emit short JMP instructions.

There is no way to have the assembler emit short NOPs based on the
potential displacement, so leave those long for now.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20210506194157.967034497@infradead.org
arch/x86/include/asm/jump_label.h
arch/x86/kernel/jump_label.c

index d85802a..ef819e3 100644 (file)
@@ -35,8 +35,7 @@ l_yes:
 static __always_inline bool arch_static_branch_jump(struct static_key * const key, const bool branch)
 {
        asm_volatile_goto("1:"
-               ".byte 0xe9 \n\t"
-               ".long %l[l_yes] - (. + 4) \n\t"
+               "jmp %l[l_yes]\n\t"
                JUMP_TABLE_ENTRY
                : :  "i" (key), "i" (branch) : : l_yes);
 
index 190d810..a762dc1 100644 (file)
 #include <asm/kprobes.h>
 #include <asm/alternative.h>
 #include <asm/text-patching.h>
+#include <asm/insn.h>
 
 #define JUMP_LABEL_NOP_SIZE    JMP32_INSN_SIZE
 
 int arch_jump_entry_size(struct jump_entry *entry)
 {
-       return JMP32_INSN_SIZE;
+       struct insn insn = {};
+
+       insn_decode_kernel(&insn, (void *)jump_entry_code(entry));
+       BUG_ON(insn.length != 2 && insn.length != 5);
+
+       return insn.length;
 }
 
 struct jump_label_patch {