You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
[PATCH] sleep profiling
Implement prof=sleep profiling. TASK_UNINTERRUPTIBLE sleeps will be taken as a profile hit, and every millisecond spent sleeping causes a profile-hit for the call site that initiated the sleep. Sample readprofile output on i386: 306 ps2_sendbyte 1.3973 432 call_usermodehelper_keys 1.9548 484 ps2_command 0.6453 790 __driver_attach 4.7879 1593 msleep 44.2500 3976 sync_buffer 64.1290 4076 do_lookup 12.4648 8587 sync_page 122.6714 20820 total 0.0067 (NOTE: architectures need to check whether get_wchan() can be called from deep within the wakeup path.) akpm: we need to mark more functions __sched. lock_sock(), msleep(), others.. akpm: the contention in do_lookup() is a surprise. Presumably doing disk reads for directory contents while holding i_mutex. [akpm@osdl.org: various fixes] Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
70888bd5b7
commit
ece8a684c7
@@ -948,6 +948,17 @@ static void activate_task(struct task_struct *p, struct rq *rq, int local)
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Sleep time is in units of nanosecs, so shift by 20 to get a
|
||||
* milliseconds-range estimation of the amount of time that the task
|
||||
* spent sleeping:
|
||||
*/
|
||||
if (unlikely(prof_on == SLEEP_PROFILING)) {
|
||||
if (p->state == TASK_UNINTERRUPTIBLE)
|
||||
profile_hits(SLEEP_PROFILING, (void *)get_wchan(p),
|
||||
(now - p->timestamp) >> 20);
|
||||
}
|
||||
|
||||
if (!rt_task(p))
|
||||
p->prio = recalc_task_prio(p, now);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user