diff options
author | Matt Macy <mmacy@FreeBSD.org> | 2018-05-23 17:25:00 +0000 |
---|---|---|
committer | Matt Macy <mmacy@FreeBSD.org> | 2018-05-23 17:25:00 +0000 |
commit | 0b5dc7f64fcbbcebce577bb267ba4bd861d62251 (patch) | |
tree | 1f0553274902ce652d135787848d7087fb4103f1 | |
parent | 9c4a7c50aeebc645b13007066b018cbc802d688e (diff) |
Notes
-rw-r--r-- | lib/libpmc/pmclog.c | 4 | ||||
-rw-r--r-- | lib/libpmc/pmclog.h | 5 | ||||
-rw-r--r-- | lib/libpmcstat/libpmcstat.h | 2 | ||||
-rw-r--r-- | lib/libpmcstat/libpmcstat_logging.c | 5 | ||||
-rw-r--r-- | sys/sys/pmc.h | 6 | ||||
-rw-r--r-- | sys/sys/pmclog.h | 7 | ||||
-rw-r--r-- | usr.sbin/pmcstat/pmcstat.c | 6 |
7 files changed, 31 insertions, 4 deletions
diff --git a/lib/libpmc/pmclog.c b/lib/libpmc/pmclog.c index 8620a0c8789d2..dd91a68d864fc 100644 --- a/lib/libpmc/pmclog.c +++ b/lib/libpmc/pmclog.c @@ -326,8 +326,10 @@ pmclog_get_event(void *cookie, char **data, ssize_t *len, switch (ev->pl_type = PMCLOG_HEADER_TO_TYPE(h)) { case PMCLOG_TYPE_CALLCHAIN: PMCLOG_READ32(le,ev->pl_u.pl_cc.pl_pid); + PMCLOG_READ32(le,ev->pl_u.pl_cc.pl_tid); PMCLOG_READ32(le,ev->pl_u.pl_cc.pl_pmcid); PMCLOG_READ32(le,ev->pl_u.pl_cc.pl_cpuflags); + PMCLOG_READ32(le,ev->pl_u.pl_cc.pl_cpuflags2); PMCLOG_GET_CALLCHAIN_SIZE(ev->pl_u.pl_cc.pl_npc,evlen); for (npc = 0; npc < ev->pl_u.pl_cc.pl_npc; npc++) PMCLOG_READADDR(le,ev->pl_u.pl_cc.pl_pc[npc]); @@ -363,6 +365,7 @@ pmclog_get_event(void *cookie, char **data, ssize_t *len, PMCLOG_READADDR(le,ev->pl_u.pl_s.pl_pc); PMCLOG_READ32(le,ev->pl_u.pl_s.pl_pmcid); PMCLOG_READ32(le,ev->pl_u.pl_s.pl_usermode); + PMCLOG_READ32(le,ev->pl_u.pl_s.pl_tid); break; case PMCLOG_TYPE_PMCALLOCATE: PMCLOG_READ32(le,ev->pl_u.pl_a.pl_pmcid); @@ -393,6 +396,7 @@ pmclog_get_event(void *cookie, char **data, ssize_t *len, PMCLOG_READ32(le,ev->pl_u.pl_c.pl_pmcid); PMCLOG_READ64(le,ev->pl_u.pl_c.pl_value); PMCLOG_READ32(le,ev->pl_u.pl_c.pl_pid); + PMCLOG_READ32(le,ev->pl_u.pl_c.pl_tid); break; case PMCLOG_TYPE_PROCEXEC: PMCLOG_GET_PATHLEN(pathlen,evlen,pmclog_procexec); diff --git a/lib/libpmc/pmclog.h b/lib/libpmc/pmclog.h index 77644a85ed8c4..9f748b77d69a1 100644 --- a/lib/libpmc/pmclog.h +++ b/lib/libpmc/pmclog.h @@ -47,8 +47,10 @@ enum pmclog_state { struct pmclog_ev_callchain { uint32_t pl_pid; + uint32_t pl_tid; uint32_t pl_pmcid; uint32_t pl_cpuflags; + uint32_t pl_cpuflags2; uint32_t pl_npc; uintfptr_t pl_pc[PMC_CALLCHAIN_DEPTH_MAX]; }; @@ -79,7 +81,9 @@ struct pmclog_ev_map_out { struct pmclog_ev_pcsample { uintfptr_t pl_pc; pid_t pl_pid; + pid_t pl_tid; pmc_id_t pl_pmcid; + uint32_t pl_flags; uint32_t pl_usermode; }; @@ -110,6 +114,7 @@ struct pmclog_ev_pmcdetach { struct pmclog_ev_proccsw { pid_t pl_pid; + pid_t pl_tid; pmc_id_t pl_pmcid; pmc_value_t pl_value; }; diff --git a/lib/libpmcstat/libpmcstat.h b/lib/libpmcstat/libpmcstat.h index ed48acc513303..de657e2215abd 100644 --- a/lib/libpmcstat/libpmcstat.h +++ b/lib/libpmcstat/libpmcstat.h @@ -107,6 +107,7 @@ struct pmcstat_args { #define FLAG_HAS_DURATION 0x00080000 /* -l secs */ #define FLAG_DO_WIDE_GPROF_HC 0x00100000 /* -e */ #define FLAG_SKIP_TOP_FN_RES 0x00200000 /* -I */ +#define FLAG_FILTER_THREAD_ID 0x00400000 /* -L */ int pa_required; /* required features */ int pa_pplugin; /* pre-processing plugin */ @@ -131,6 +132,7 @@ struct pmcstat_args { int pa_topcolor; /* terminal support color */ int pa_mergepmc; /* merge PMC with same name */ double pa_duration; /* time duration */ + uint32_t pa_tid; int pa_argc; char **pa_argv; STAILQ_HEAD(, pmcstat_ev) pa_events; diff --git a/lib/libpmcstat/libpmcstat_logging.c b/lib/libpmcstat/libpmcstat_logging.c index a77a326b9ab5a..71ee524bbd8c8 100644 --- a/lib/libpmcstat/libpmcstat_logging.c +++ b/lib/libpmcstat/libpmcstat_logging.c @@ -313,6 +313,11 @@ pmcstat_analyze_log(struct pmcstat_args *args, cpuflags = ev.pl_u.pl_cc.pl_cpuflags; cpu = PMC_CALLCHAIN_CPUFLAGS_TO_CPU(cpuflags); + if ((args->pa_flags & FLAG_FILTER_THREAD_ID) && + args->pa_tid != ev.pl_u.pl_cc.pl_tid) { + pmcstat_stats->ps_samples_skipped++; + break; + } /* Filter on the CPU id. */ if (!CPU_ISSET(cpu, &(args->pa_cpumask))) { pmcstat_stats->ps_samples_skipped++; diff --git a/sys/sys/pmc.h b/sys/sys/pmc.h index 7b6bba0b30c91..a5306c7f75b45 100644 --- a/sys/sys/pmc.h +++ b/sys/sys/pmc.h @@ -922,8 +922,10 @@ struct pmc_hw { struct pmc_sample { uint16_t ps_nsamples; /* callchain depth */ - uint8_t ps_cpu; /* cpu number */ - uint8_t ps_flags; /* other flags */ + uint16_t ps_cpu; /* cpu number */ + uint16_t ps_flags; /* other flags */ + uint8_t ps_pad[2]; + lwpid_t ps_tid; /* thread id */ pid_t ps_pid; /* process PID or -1 */ struct thread *ps_td; /* which thread */ struct pmc *ps_pmc; /* interrupting PMC */ diff --git a/sys/sys/pmclog.h b/sys/sys/pmclog.h index b2f89de3ae771..7d34f0021d8e3 100644 --- a/sys/sys/pmclog.h +++ b/sys/sys/pmclog.h @@ -107,8 +107,10 @@ enum pmclog_type { struct pmclog_callchain { PMCLOG_ENTRY_HEADER uint32_t pl_pid; + uint32_t pl_tid; uint32_t pl_pmcid; uint32_t pl_cpuflags; + uint32_t pl_cpuflags2; /* 8 byte aligned */ uintptr_t pl_pc[PMC_CALLCHAIN_DEPTH_MAX]; } __packed; @@ -152,6 +154,8 @@ struct pmclog_pcsample { uintfptr_t pl_pc; /* 8 byte aligned */ uint32_t pl_pmcid; uint32_t pl_usermode; + uint32_t pl_tid; + uint32_t pl_pad; } __packed; struct pmclog_pmcallocate { @@ -179,6 +183,7 @@ struct pmclog_proccsw { uint32_t pl_pmcid; uint64_t pl_value; /* keep 8 byte aligned */ uint32_t pl_pid; + uint32_t pl_tid; } __packed; struct pmclog_procexec { @@ -275,7 +280,7 @@ void pmclog_process_pmcallocate(struct pmc *_pm); void pmclog_process_pmcattach(struct pmc *_pm, pid_t _pid, char *_path); void pmclog_process_pmcdetach(struct pmc *_pm, pid_t _pid); void pmclog_process_proccsw(struct pmc *_pm, struct pmc_process *_pp, - pmc_value_t _v); + pmc_value_t _v, struct thread *); void pmclog_process_procexec(struct pmc_owner *_po, pmc_id_t _pmid, pid_t _pid, uintfptr_t _startaddr, char *_path); void pmclog_process_procexit(struct pmc *_pm, struct pmc_process *_pp); diff --git a/usr.sbin/pmcstat/pmcstat.c b/usr.sbin/pmcstat/pmcstat.c index 198a29ddd4663..f7ae30ad3f839 100644 --- a/usr.sbin/pmcstat/pmcstat.c +++ b/usr.sbin/pmcstat/pmcstat.c @@ -500,7 +500,7 @@ main(int argc, char **argv) CPU_COPY(&rootmask, &cpumask); while ((option = getopt(argc, argv, - "CD:EF:G:IM:NO:P:R:S:TWa:c:def:gk:l:m:n:o:p:qr:s:t:vw:z:")) != -1) + "CD:EF:G:IL:M:NO:P:R:S:TWa:c:def:gk:l:m:n:o:p:qr:s:t:vw:z:")) != -1) switch (option) { case 'a': /* Annotate + callgraph */ args.pa_flags |= FLAG_DO_ANNOTATE; @@ -581,6 +581,10 @@ main(int argc, char **argv) args.pa_flags |= FLAG_HAS_KERNELPATH; break; + case 'L': + args.pa_flags |= FLAG_FILTER_THREAD_ID; + args.pa_tid = strtol(optarg, &end, 0); + break; case 'l': /* time duration in seconds */ duration = strtod(optarg, &end); if (*end != '\0' || duration <= 0) |