aboutsummaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorMatt Macy <mmacy@FreeBSD.org>2018-06-05 04:26:40 +0000
committerMatt Macy <mmacy@FreeBSD.org>2018-06-05 04:26:40 +0000
commitebfaf69cc0a741100c3ef6ec6960d3a3ba0d1168 (patch)
tree43428d2c3cb5da86f51cf6b8a2bffa67d47f84d8 /sys/kern
parenta12a06fae282272577b48a4c8b722f659bbf053e (diff)
downloadsrc-ebfaf69cc0a741100c3ef6ec6960d3a3ba0d1168.tar.gz
src-ebfaf69cc0a741100c3ef6ec6960d3a3ba0d1168.zip
hwpmc: log name->pid, name->tid mappings
By logging all threads and processes 'pmc filter' can now filter on process or thread name, relieving the user of the burden of determining which tid or pid was which when the sample was taken. % pmc filter -T if_io_tqg -P nginx pmc.log pmc-iflib.log % pmc filter -x -T idle pmc.log pmc-noidle.log
Notes
Notes: svn path=/head/; revision=334647
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_kthread.c15
-rw-r--r--sys/kern/kern_thr.c6
-rw-r--r--sys/kern/kern_thread.c3
3 files changed, 22 insertions, 2 deletions
diff --git a/sys/kern/kern_kthread.c b/sys/kern/kern_kthread.c
index 2554572d88f8..19b7df110641 100644
--- a/sys/kern/kern_kthread.c
+++ b/sys/kern/kern_kthread.c
@@ -126,6 +126,12 @@ kproc_create(void (*func)(void *), void *arg,
sched_clear_tdname(td);
#endif
TSTHREAD(td, td->td_name);
+#ifdef HWPMC_HOOKS
+ if (PMC_SYSTEM_SAMPLING_ACTIVE()) {
+ PMC_CALL_HOOK_UNLOCKED(td, PMC_FN_PROC_CREATE_LOG, p2);
+ PMC_CALL_HOOK_UNLOCKED(td, PMC_FN_THR_CREATE_LOG, NULL);
+ }
+#endif
/* call the processes' main()... */
cpu_fork_kthread_handler(td, func, arg);
@@ -310,7 +316,10 @@ kthread_add(void (*func)(void *), void *arg, struct proc *p,
/* Avoid inheriting affinity from a random parent. */
cpuset_kernthread(newtd);
-
+#ifdef HWPMC_HOOKS
+ if (PMC_SYSTEM_SAMPLING_ACTIVE())
+ PMC_CALL_HOOK_UNLOCKED(td, PMC_FN_THR_CREATE_LOG, NULL);
+#endif
/* Delay putting it on the run queue until now. */
if (!(flags & RFSTOPPED)) {
thread_lock(newtd);
@@ -331,6 +340,10 @@ kthread_exit(void)
td = curthread;
p = td->td_proc;
+#ifdef HWPMC_HOOKS
+ if (PMC_SYSTEM_SAMPLING_ACTIVE())
+ PMC_CALL_HOOK_UNLOCKED(td, PMC_FN_THR_EXIT_LOG, NULL);
+#endif
/* A module may be waiting for us to exit. */
wakeup(td);
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c
index 5e817cdfaad7..915b552706a3 100644
--- a/sys/kern/kern_thr.c
+++ b/sys/kern/kern_thr.c
@@ -265,6 +265,8 @@ thread_create(struct thread *td, struct rtprio *rtp,
#ifdef HWPMC_HOOKS
if (PMC_PROC_IS_USING_PMCS(p))
PMC_CALL_HOOK(newtd, PMC_FN_THR_CREATE, NULL);
+ else if (PMC_SYSTEM_SAMPLING_ACTIVE())
+ PMC_CALL_HOOK_UNLOCKED(newtd, PMC_FN_THR_CREATE_LOG, NULL);
#endif
tidhash_add(newtd);
@@ -592,6 +594,10 @@ sys_thr_set_name(struct thread *td, struct thr_set_name_args *uap)
if (ttd == NULL)
return (ESRCH);
strcpy(ttd->td_name, name);
+#ifdef HWPMC_HOOKS
+ if (PMC_PROC_IS_USING_PMCS(p) || PMC_SYSTEM_SAMPLING_ACTIVE())
+ PMC_CALL_HOOK_UNLOCKED(ttd, PMC_FN_THR_CREATE_LOG, NULL);
+#endif
#ifdef KTR
sched_clear_tdname(ttd);
#endif
diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c
index 86bcdc90bfa0..a3a6e87d2c4a 100644
--- a/sys/kern/kern_thread.c
+++ b/sys/kern/kern_thread.c
@@ -589,7 +589,8 @@ thread_exit(void)
if (PMC_PROC_IS_USING_PMCS(td->td_proc)) {
PMC_SWITCH_CONTEXT(td, PMC_FN_CSW_OUT);
PMC_CALL_HOOK_UNLOCKED(td, PMC_FN_THR_EXIT, NULL);
- }
+ } else if (PMC_SYSTEM_SAMPLING_ACTIVE())
+ PMC_CALL_HOOK_UNLOCKED(td, PMC_FN_THR_EXIT_LOG, NULL);
#endif
PROC_UNLOCK(p);
PROC_STATLOCK(p);