mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-28 23:55:20 -04:00
libbpf: Change has_nop_combo to work on top of nop10
We now expect nop combo with 10 bytes nop instead of 5 bytes nop, fixing has_nop_combo to reflect that. Fixes:41a5c7df44("libbpf: Add support to detect nop,nop5 instructions combo for usdt probe") Fixes:554ba38456("uprobes/x86: Move optimized uprobe from nop5 to nop10") Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Reviewed-by: Jakub Sitnicki <jakub@cloudflare.com> Acked-by: Andrii Nakryiko <andrii@kernel.org> Link: https://patch.msgid.link/20260703114917.238144-7-jolsa@kernel.org
This commit is contained in:
@@ -305,7 +305,7 @@ struct usdt_manager *usdt_manager_new(struct bpf_object *obj)
|
||||
|
||||
/*
|
||||
* Detect kernel support for uprobe() syscall, it's presence means we can
|
||||
* take advantage of faster nop5 uprobe handling.
|
||||
* take advantage of faster nop10 uprobe handling.
|
||||
* Added in: 56101b69c919 ("uprobes/x86: Add uprobe syscall to speed up uprobe")
|
||||
*/
|
||||
man->has_uprobe_syscall = kernel_supports(obj, FEAT_UPROBE_SYSCALL);
|
||||
@@ -604,14 +604,14 @@ static int parse_usdt_spec(struct usdt_spec *spec, const struct usdt_note *note,
|
||||
#if defined(__x86_64__)
|
||||
static bool has_nop_combo(int fd, long off)
|
||||
{
|
||||
unsigned char nop_combo[6] = {
|
||||
0x90, 0x0f, 0x1f, 0x44, 0x00, 0x00 /* nop,nop5 */
|
||||
unsigned char nop_combo[11] = {
|
||||
0x90, 0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
unsigned char buf[6];
|
||||
unsigned char buf[11];
|
||||
|
||||
if (pread(fd, buf, 6, off) != 6)
|
||||
if (pread(fd, buf, 11, off) != 11)
|
||||
return false;
|
||||
return memcmp(buf, nop_combo, 6) == 0;
|
||||
return memcmp(buf, nop_combo, 11) == 0;
|
||||
}
|
||||
#else
|
||||
static bool has_nop_combo(int fd, long off)
|
||||
@@ -822,8 +822,8 @@ static int collect_usdt_targets(struct usdt_manager *man, struct elf_fd *elf_fd,
|
||||
memset(target, 0, sizeof(*target));
|
||||
|
||||
/*
|
||||
* We have uprobe syscall and usdt with nop,nop5 instructions combo,
|
||||
* so we can place the uprobe directly on nop5 (+1) and get this probe
|
||||
* We have uprobe syscall and usdt with nop,nop10 instructions combo,
|
||||
* so we can place the uprobe directly on nop10 (+1) and get this probe
|
||||
* optimized.
|
||||
*/
|
||||
if (man->has_uprobe_syscall && has_nop_combo(elf_fd->fd, usdt_rel_ip)) {
|
||||
|
||||
Reference in New Issue
Block a user