summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2025-03-24 10:35:26 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2025-03-24 10:35:26 -0400
commitbd176ff969fbde282f5e3335fe3e45e341427941 (patch)
treedf59a524cd2cc57e38d181cf20a918aebbba06aa
parenta415e1f10898f9cb706c57814655cfe578cd8374 (diff)
trace_sched_switch -> trace_sched_wakinglatency_debug
-rw-r--r--include/linux/sched.h2
-rw-r--r--kernel/sched/core.c13
2 files changed, 11 insertions, 4 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 73a330748658..cf7ca571a29d 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -228,8 +228,6 @@ extern ktime_t ktime_get(void);
#define set_task_sleep_time(task, state_value) \
do { \
- if (((state_value) & TASK_NORMAL) && !((task)->__state & TASK_NORMAL))\
- task->sleep_timestamp = ktime_get(); \
} while (0)
#define __set_task_state(task, type, state_value) \
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index dae03d76cd2c..172defd6ed83 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -4200,15 +4200,19 @@ int try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
goto out;
trace_sched_waking(p);
+
+ if (p->sleep_timestamp)
+ sched_wakeup_backtrace(p, p->sleep_timestamp);
+ p->sleep_timestamp = 0;
ttwu_do_wakeup(p);
goto out;
}
-
+#if 0
u64 sleep_start;
if (p->sleep_timestamp &&
(sleep_start = xchg(&p->sleep_timestamp, 0)))
sched_wakeup_backtrace(p, sleep_start);
-
+#endif
/*
* If we are going to wake up a thread waiting for CONDITION we
* need to ensure that CONDITION=1 done by the caller can not be
@@ -4222,6 +4226,10 @@ int try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
trace_sched_waking(p);
+ if (p->sleep_timestamp)
+ sched_wakeup_backtrace(p, p->sleep_timestamp);
+ p->sleep_timestamp = 0;
+
/*
* Ensure we load p->on_rq _after_ p->state, otherwise it would
* be possible to, falsely, observe p->on_rq == 0 and get stuck
@@ -6763,6 +6771,7 @@ picked:
psi_sched_switch(prev, next, !task_on_rq_queued(prev) ||
prev->se.sched_delayed);
+ prev->sleep_timestamp = ktime_get_ns();
trace_sched_switch(preempt, prev, next, prev_state);
/* Also unlocks the rq: */