Skip to content

Commit b8a8fcb

Browse files
libbpf-tools/klockstat: Support nested mutex_trylock
Since kernel 6.16, mutex_trylock() also have a nested version. Add the support for it. Moreover the nested version of mutex_lock_killable() is implemented differently and mutex_lock_killable_nested symbol is replaced by _mutex_lock_killable. It fixes the following error of debug kernels: libbpf: prog 'mutex_trylock_exit': failed to find kernel BTF type ID of 'mutex_trylock': -3 libbpf: prog 'mutex_trylock_exit': failed to prepare load attributes: -3 libbpf: prog 'mutex_trylock_exit': failed to load: -3 libbpf: failed to load object 'klockstat_bpf' libbpf: failed to load BPF skeleton 'klockstat_bpf': -3 failed to load BPF object Signed-off-by: Jerome Marchand <jmarchan@redhat.com>
1 parent 093a7ee commit b8a8fcb

1 file changed

Lines changed: 38 additions & 8 deletions

File tree

libbpf-tools/klockstat.c

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ static const char *lock_ksym_names[] = {
103103
"mutex_lock_interruptible_nested",
104104
"mutex_lock_killable",
105105
"mutex_lock_killable_nested",
106+
"_mutex_lock_killable",
106107
"mutex_trylock",
108+
"_mutex_trylock_nest_lock",
107109
"down_read",
108110
"down_read_nested",
109111
"down_read_interruptible",
@@ -838,10 +840,24 @@ static void enable_fentry(struct klockstat_bpf *obj)
838840
"down_write_nested");
839841
bpf_program__set_attach_target(obj->progs.down_write_exit, 0,
840842
"down_write_nested");
841-
bpf_program__set_attach_target(obj->progs.down_write_killable, 0,
842-
"down_write_killable_nested");
843-
bpf_program__set_attach_target(obj->progs.down_write_killable_exit, 0,
844-
"down_write_killable_nested");
843+
844+
/* Since v6.16 mutex_lock_killable nested variant is implemented differently */
845+
if (fentry_can_attach("_mutex_lock_killable", NULL)) {
846+
bpf_program__set_attach_target(obj->progs.mutex_lock_killable, 0,
847+
"_mutex_lock_killable");
848+
bpf_program__set_attach_target(obj->progs.mutex_lock_killable_exit, 0,
849+
"_mutex_lock_killable");
850+
} else {
851+
bpf_program__set_attach_target(obj->progs.down_write_killable, 0,
852+
"down_write_killable_nested");
853+
bpf_program__set_attach_target(obj->progs.down_write_killable_exit, 0,
854+
"down_write_killable_nested");
855+
}
856+
857+
/* Since v6.16 mutex_trylock also have a nested variant */
858+
if (fentry_can_attach("_mutex_trylock_nest_lock", NULL))
859+
bpf_program__set_attach_target(obj->progs.mutex_trylock_exit, 0,
860+
"_mutex_trylock_nest_lock");
845861
}
846862

847863
static void enable_kprobes(struct klockstat_bpf *obj)
@@ -906,10 +922,24 @@ static void enable_kprobes(struct klockstat_bpf *obj)
906922
"down_write_nested");
907923
bpf_program__set_attach_target(obj->progs.kprobe_down_write_exit, 0,
908924
"down_write_nested");
909-
bpf_program__set_attach_target(obj->progs.kprobe_down_write_killable, 0,
910-
"down_write_killable_nested");
911-
bpf_program__set_attach_target(obj->progs.kprobe_down_write_killable_exit, 0,
912-
"down_write_killable_nested");
925+
926+
/* Since v6.16 mutex_lock_killable nested variant is implemented differently */
927+
if (kprobe_exists("_mutex_lock_killable")) {
928+
bpf_program__set_attach_target(obj->progs.mutex_lock_killable, 0,
929+
"_mutex_lock_killable");
930+
bpf_program__set_attach_target(obj->progs.mutex_lock_killable_exit, 0,
931+
"_mutex_lock_killable");
932+
} else {
933+
bpf_program__set_attach_target(obj->progs.kprobe_down_write_killable, 0,
934+
"down_write_killable_nested");
935+
bpf_program__set_attach_target(obj->progs.kprobe_down_write_killable_exit, 0,
936+
"down_write_killable_nested");
937+
}
938+
939+
/* Since v6.16 mutex_trylock also have a nested variant */
940+
if (kprobe_exists("_mutex_trylock_nest_lock"))
941+
bpf_program__set_attach_target(obj->progs.mutex_trylock_exit, 0,
942+
"_mutex_trylock_nest_lock");
913943
}
914944

915945
static void disable_nldump_ioctl_probes(struct klockstat_bpf *obj)

0 commit comments

Comments
 (0)