Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

uprobes/x86: Add support to emulate NOP instructions

Add support to emulate all NOP instructions as the original uprobe
instruction.

This change speeds up uprobe on top of all NOP instructions and is a
preparation for usdt probe optimization, that will be done on top of
NOP5 instructions.

With this change the usdt probe on top of NOP5s won't take the performance
hit compared to usdt probe on top of standard NOP instructions.

Suggested-by: Oleg Nesterov <oleg@redhat.com>
Suggested-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Cc: Alan Maguire <alan.maguire@oracle.com>
Cc: Hao Luo <haoluo@google.com>
Cc: John Fastabend <john.fastabend@gmail.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Song Liu <songliubraving@fb.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/r/20250414083647.1234007-1-jolsa@kernel.org

authored by

Jiri Olsa and committed by
Ingo Molnar
610f6e14 4a3fd130

+5
+5
arch/x86/kernel/uprobes.c
··· 840 840 insn_byte_t p; 841 841 int i; 842 842 843 + /* x86_nops[insn->length]; same as jmp with .offs = 0 */ 844 + if (insn->length <= ASM_NOP_MAX && 845 + !memcmp(insn->kaddr, x86_nops[insn->length], insn->length)) 846 + goto setup; 847 + 843 848 switch (opc1) { 844 849 case 0xeb: /* jmp 8 */ 845 850 case 0xe9: /* jmp 32 */