Skip to content

Commit 093a7ee

Browse files
libbpf-tools/klockstat: Don't needlessly duplicate BPF programs
The BPF programs for the kprobe fallback are duplicated for their nested version. This is unnecessary. We can reuse the original program and reattach it to the nested function such as what is already done in the fentry case. It simplifies the code quite a bit. Signed-off-by: Jerome Marchand <jmarchan@redhat.com>
1 parent 15dc359 commit 093a7ee

2 files changed

Lines changed: 33 additions & 248 deletions

File tree

libbpf-tools/klockstat.bpf.c

Lines changed: 0 additions & 195 deletions
Original file line numberDiff line numberDiff line change
@@ -832,201 +832,6 @@ int BPF_KPROBE(kprobe_up_write, struct rw_semaphore *lock)
832832
return 0;
833833
}
834834

835-
/* CONFIG_DEBUG_LOCK_ALLOC is enabled */
836-
837-
SEC("kprobe/mutex_lock_nested")
838-
int BPF_KPROBE(kprobe_mutex_lock_nested, struct mutex *lock)
839-
{
840-
u32 tid = (u32)bpf_get_current_pid_tgid();
841-
842-
bpf_map_update_elem(&locks, &tid, &lock, BPF_ANY);
843-
lock_contended(ctx, lock);
844-
return 0;
845-
}
846-
847-
SEC("kretprobe/mutex_lock_nested")
848-
int BPF_KRETPROBE(kprobe_mutex_lock_exit_nested, long ret)
849-
{
850-
u32 tid = (u32)bpf_get_current_pid_tgid();
851-
void **lock;
852-
853-
lock = bpf_map_lookup_elem(&locks, &tid);
854-
if (!lock)
855-
return 0;
856-
857-
bpf_map_delete_elem(&locks, &tid);
858-
lock_acquired(*lock);
859-
return 0;
860-
}
861-
862-
SEC("kprobe/mutex_lock_interruptible_nested")
863-
int BPF_KPROBE(kprobe_mutex_lock_interruptible_nested, struct mutex *lock)
864-
{
865-
u32 tid = (u32)bpf_get_current_pid_tgid();
866-
867-
bpf_map_update_elem(&locks, &tid, &lock, BPF_ANY);
868-
lock_contended(ctx, lock);
869-
return 0;
870-
}
871-
872-
SEC("kretprobe/mutex_lock_interruptible_nested")
873-
int BPF_KRETPROBE(kprobe_mutex_lock_interruptible_exit_nested, long ret)
874-
{
875-
u32 tid = (u32)bpf_get_current_pid_tgid();
876-
void **lock;
877-
878-
lock = bpf_map_lookup_elem(&locks, &tid);
879-
if (!lock)
880-
return 0;
881-
882-
bpf_map_delete_elem(&locks, &tid);
883-
884-
if (ret)
885-
lock_aborted(*lock);
886-
else
887-
lock_acquired(*lock);
888-
return 0;
889-
}
890-
891-
SEC("kprobe/mutex_lock_killable_nested")
892-
int BPF_KPROBE(kprobe_mutex_lock_killable_nested, struct mutex *lock)
893-
{
894-
u32 tid = (u32)bpf_get_current_pid_tgid();
895-
896-
bpf_map_update_elem(&locks, &tid, &lock, BPF_ANY);
897-
lock_contended(ctx, lock);
898-
return 0;
899-
}
900-
901-
SEC("kretprobe/mutex_lock_killable_nested")
902-
int BPF_KRETPROBE(kprobe_mutex_lock_killable_exit_nested, long ret)
903-
{
904-
u32 tid = (u32)bpf_get_current_pid_tgid();
905-
void **lock;
906-
907-
lock = bpf_map_lookup_elem(&locks, &tid);
908-
if (!lock)
909-
return 0;
910-
911-
bpf_map_delete_elem(&locks, &tid);
912-
913-
if (ret)
914-
lock_aborted(*lock);
915-
else
916-
lock_acquired(*lock);
917-
return 0;
918-
}
919-
920-
SEC("kprobe/down_read_nested")
921-
int BPF_KPROBE(kprobe_down_read_nested, struct rw_semaphore *lock)
922-
{
923-
u32 tid = (u32)bpf_get_current_pid_tgid();
924-
925-
bpf_map_update_elem(&locks, &tid, &lock, BPF_ANY);
926-
lock_contended(ctx, lock);
927-
return 0;
928-
}
929-
930-
SEC("kretprobe/down_read_nested")
931-
int BPF_KRETPROBE(kprobe_down_read_exit_nested, long ret)
932-
{
933-
u32 tid = (u32)bpf_get_current_pid_tgid();
934-
void **lock;
935-
936-
lock = bpf_map_lookup_elem(&locks, &tid);
937-
if (!lock)
938-
return 0;
939-
940-
bpf_map_delete_elem(&locks, &tid);
941-
942-
lock_acquired(*lock);
943-
return 0;
944-
}
945-
946-
SEC("kprobe/down_read_killable_nested")
947-
int BPF_KPROBE(kprobe_down_read_killable_nested, struct rw_semaphore *lock)
948-
{
949-
u32 tid = (u32)bpf_get_current_pid_tgid();
950-
951-
bpf_map_update_elem(&locks, &tid, &lock, BPF_ANY);
952-
lock_contended(ctx, lock);
953-
return 0;
954-
}
955-
956-
SEC("kretprobe/down_read_killable_nested")
957-
int BPF_KRETPROBE(kprobe_down_read_killable_exit_nested, long ret)
958-
{
959-
u32 tid = (u32)bpf_get_current_pid_tgid();
960-
void **lock;
961-
962-
lock = bpf_map_lookup_elem(&locks, &tid);
963-
if (!lock)
964-
return 0;
965-
966-
bpf_map_delete_elem(&locks, &tid);
967-
968-
if (ret)
969-
lock_aborted(*lock);
970-
else
971-
lock_acquired(*lock);
972-
return 0;
973-
}
974-
975-
SEC("kprobe/down_write_nested")
976-
int BPF_KPROBE(kprobe_down_write_nested, struct rw_semaphore *lock)
977-
{
978-
u32 tid = (u32)bpf_get_current_pid_tgid();
979-
980-
bpf_map_update_elem(&locks, &tid, &lock, BPF_ANY);
981-
lock_contended(ctx, lock);
982-
return 0;
983-
}
984-
985-
SEC("kretprobe/down_write_nested")
986-
int BPF_KRETPROBE(kprobe_down_write_exit_nested, long ret)
987-
{
988-
u32 tid = (u32)bpf_get_current_pid_tgid();
989-
void **lock;
990-
991-
lock = bpf_map_lookup_elem(&locks, &tid);
992-
if (!lock)
993-
return 0;
994-
995-
bpf_map_delete_elem(&locks, &tid);
996-
997-
lock_acquired(*lock);
998-
return 0;
999-
}
1000-
1001-
SEC("kprobe/down_write_killable_nested")
1002-
int BPF_KPROBE(kprobe_down_write_killable_nested, struct rw_semaphore *lock)
1003-
{
1004-
u32 tid = (u32)bpf_get_current_pid_tgid();
1005-
1006-
bpf_map_update_elem(&locks, &tid, &lock, BPF_ANY);
1007-
lock_contended(ctx, lock);
1008-
return 0;
1009-
}
1010-
1011-
SEC("kretprobe/down_write_killable_nested")
1012-
int BPF_KRETPROBE(kprobe_down_write_killable_exit_nested, long ret)
1013-
{
1014-
u32 tid = (u32)bpf_get_current_pid_tgid();
1015-
void **lock;
1016-
1017-
lock = bpf_map_lookup_elem(&locks, &tid);
1018-
if (!lock)
1019-
return 0;
1020-
1021-
bpf_map_delete_elem(&locks, &tid);
1022-
1023-
if (ret)
1024-
lock_aborted(*lock);
1025-
else
1026-
lock_acquired(*lock);
1027-
return 0;
1028-
}
1029-
1030835
SEC("kprobe/rtnetlink_rcv_msg")
1031836
int BPF_KPROBE(kprobe_rtnetlink_rcv_msg, struct sk_buff *skb, struct nlmsghdr *nlh,
1032837
struct netlink_ext_ack *ext)

libbpf-tools/klockstat.c

Lines changed: 33 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -775,8 +775,6 @@ static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va
775775

776776
static void enable_fentry(struct klockstat_bpf *obj)
777777
{
778-
bool debug_lock;
779-
780778
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock, false);
781779
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_exit, false);
782780
bpf_program__set_autoload(obj->progs.kprobe_mutex_trylock, false);
@@ -804,22 +802,6 @@ static void enable_fentry(struct klockstat_bpf *obj)
804802
bpf_program__set_autoload(obj->progs.kprobe_down_write_killable_exit, false);
805803
bpf_program__set_autoload(obj->progs.kprobe_up_write, false);
806804

807-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_nested, false);
808-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_exit_nested, false);
809-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_interruptible_nested, false);
810-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_interruptible_exit_nested, false);
811-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_killable_nested, false);
812-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_killable_exit_nested, false);
813-
814-
bpf_program__set_autoload(obj->progs.kprobe_down_read_nested, false);
815-
bpf_program__set_autoload(obj->progs.kprobe_down_read_exit_nested, false);
816-
bpf_program__set_autoload(obj->progs.kprobe_down_read_killable_nested, false);
817-
bpf_program__set_autoload(obj->progs.kprobe_down_read_killable_exit_nested, false);
818-
bpf_program__set_autoload(obj->progs.kprobe_down_write_nested, false);
819-
bpf_program__set_autoload(obj->progs.kprobe_down_write_exit_nested, false);
820-
bpf_program__set_autoload(obj->progs.kprobe_down_write_killable_nested, false);
821-
bpf_program__set_autoload(obj->progs.kprobe_down_write_killable_exit_nested, false);
822-
823805
bpf_program__set_autoload(obj->progs.kprobe_rtnetlink_rcv_msg, false);
824806
bpf_program__set_autoload(obj->progs.kprobe_rtnetlink_rcv_msg_exit, false);
825807
bpf_program__set_autoload(obj->progs.kprobe_netlink_dump, false);
@@ -828,8 +810,7 @@ static void enable_fentry(struct klockstat_bpf *obj)
828810
bpf_program__set_autoload(obj->progs.kprobe_sock_do_ioctl_exit, false);
829811

830812
/* CONFIG_DEBUG_LOCK_ALLOC is on */
831-
debug_lock = fentry_can_attach("mutex_lock_nested", NULL);
832-
if (!debug_lock)
813+
if (!fentry_can_attach("mutex_lock_nested", NULL))
833814
return;
834815

835816
bpf_program__set_attach_target(obj->progs.mutex_lock, 0,
@@ -897,39 +878,38 @@ static void enable_kprobes(struct klockstat_bpf *obj)
897878
bpf_program__set_autoload(obj->progs.sock_do_ioctl_exit, false);
898879

899880
/* CONFIG_DEBUG_LOCK_ALLOC is on */
900-
if (kprobe_exists("mutex_lock_nested")) {
901-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock, false);
902-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_exit, false);
903-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_interruptible, false);
904-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_interruptible_exit, false);
905-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_killable, false);
906-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_killable_exit, false);
907-
908-
bpf_program__set_autoload(obj->progs.kprobe_down_read, false);
909-
bpf_program__set_autoload(obj->progs.kprobe_down_read_exit, false);
910-
bpf_program__set_autoload(obj->progs.kprobe_down_read_killable, false);
911-
bpf_program__set_autoload(obj->progs.kprobe_down_read_killable_exit, false);
912-
bpf_program__set_autoload(obj->progs.kprobe_down_write, false);
913-
bpf_program__set_autoload(obj->progs.kprobe_down_write_exit, false);
914-
bpf_program__set_autoload(obj->progs.kprobe_down_write_killable, false);
915-
bpf_program__set_autoload(obj->progs.kprobe_down_write_killable_exit, false);
916-
} else {
917-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_nested, false);
918-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_exit_nested, false);
919-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_interruptible_nested, false);
920-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_interruptible_exit_nested, false);
921-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_killable_nested, false);
922-
bpf_program__set_autoload(obj->progs.kprobe_mutex_lock_killable_exit_nested, false);
923-
924-
bpf_program__set_autoload(obj->progs.kprobe_down_read_nested, false);
925-
bpf_program__set_autoload(obj->progs.kprobe_down_read_exit_nested, false);
926-
bpf_program__set_autoload(obj->progs.kprobe_down_read_killable_nested, false);
927-
bpf_program__set_autoload(obj->progs.kprobe_down_read_killable_exit_nested, false);
928-
bpf_program__set_autoload(obj->progs.kprobe_down_write_nested, false);
929-
bpf_program__set_autoload(obj->progs.kprobe_down_write_exit_nested, false);
930-
bpf_program__set_autoload(obj->progs.kprobe_down_write_killable_nested, false);
931-
bpf_program__set_autoload(obj->progs.kprobe_down_write_killable_exit_nested, false);
932-
}
881+
if (!kprobe_exists("mutex_lock_nested"))
882+
return;
883+
884+
bpf_program__set_attach_target(obj->progs.mutex_lock, 0,
885+
"mutex_lock_nested");
886+
bpf_program__set_attach_target(obj->progs.kprobe_mutex_lock_exit, 0,
887+
"mutex_lock_nested");
888+
bpf_program__set_attach_target(obj->progs.kprobe_mutex_lock_interruptible, 0,
889+
"mutex_lock_interruptible_nested");
890+
bpf_program__set_attach_target(obj->progs.kprobe_mutex_lock_interruptible_exit, 0,
891+
"mutex_lock_interruptible_nested");
892+
bpf_program__set_attach_target(obj->progs.kprobe_mutex_lock_killable, 0,
893+
"mutex_lock_killable_nested");
894+
bpf_program__set_attach_target(obj->progs.kprobe_mutex_lock_killable_exit, 0,
895+
"mutex_lock_killable_nested");
896+
897+
bpf_program__set_attach_target(obj->progs.kprobe_down_read, 0,
898+
"down_read_nested");
899+
bpf_program__set_attach_target(obj->progs.kprobe_down_read_exit, 0,
900+
"down_read_nested");
901+
bpf_program__set_attach_target(obj->progs.kprobe_down_read_killable, 0,
902+
"down_read_killable_nested");
903+
bpf_program__set_attach_target(obj->progs.kprobe_down_read_killable_exit, 0,
904+
"down_read_killable_nested");
905+
bpf_program__set_attach_target(obj->progs.kprobe_down_write, 0,
906+
"down_write_nested");
907+
bpf_program__set_attach_target(obj->progs.kprobe_down_write_exit, 0,
908+
"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");
933913
}
934914

935915
static void disable_nldump_ioctl_probes(struct klockstat_bpf *obj)

0 commit comments

Comments
 (0)