aboutsummaryrefslogtreecommitdiff
path: root/libbpf-tools/klockstat.bpf.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbpf-tools/klockstat.bpf.c')
-rw-r--r--libbpf-tools/klockstat.bpf.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/libbpf-tools/klockstat.bpf.c b/libbpf-tools/klockstat.bpf.c
index eddf8b7e..2a5c8e72 100644
--- a/libbpf-tools/klockstat.bpf.c
+++ b/libbpf-tools/klockstat.bpf.c
@@ -107,6 +107,21 @@ static void lock_contended(void *ctx, struct mutex *lock)
bpf_map_update_elem(&lockholder_map, &tl, li, BPF_ANY);
}
+static void lock_aborted(struct mutex *lock)
+{
+ u64 task_id;
+ struct task_lock tl = {};
+
+ if (targ_lock && targ_lock != lock)
+ return;
+ task_id = bpf_get_current_pid_tgid();
+ if (!tracing_task(task_id))
+ return;
+ tl.task_id = task_id;
+ tl.lock_ptr = (u64)lock;
+ bpf_map_delete_elem(&lockholder_map, &tl);
+}
+
static void lock_acquired(struct mutex *lock)
{
u64 task_id;
@@ -220,6 +235,40 @@ int BPF_PROG(mutex_trylock_exit, struct mutex *lock, long ret)
return 0;
}
+SEC("fentry/mutex_lock_interruptible")
+int BPF_PROG(mutex_lock_interruptible, struct mutex *lock)
+{
+ lock_contended(ctx, lock);
+ return 0;
+}
+
+SEC("fexit/mutex_lock_interruptible")
+int BPF_PROG(mutex_lock_interruptible_exit, struct mutex *lock, long ret)
+{
+ if (ret)
+ lock_aborted(lock);
+ else
+ lock_acquired(lock);
+ return 0;
+}
+
+SEC("fentry/mutex_lock_killable")
+int BPF_PROG(mutex_lock_killable, struct mutex *lock)
+{
+ lock_contended(ctx, lock);
+ return 0;
+}
+
+SEC("fexit/mutex_lock_killable")
+int BPF_PROG(mutex_lock_killable_exit, struct mutex *lock, long ret)
+{
+ if (ret)
+ lock_aborted(lock);
+ else
+ lock_acquired(lock);
+ return 0;
+}
+
SEC("fentry/mutex_unlock")
int BPF_PROG(mutex_unlock, struct mutex *lock)
{