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 /lib | |
| parent | 9c4a7c50aeebc645b13007066b018cbc802d688e (diff) | |
Notes
Diffstat (limited to 'lib')
| -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 |
4 files changed, 16 insertions, 0 deletions
diff --git a/lib/libpmc/pmclog.c b/lib/libpmc/pmclog.c index 8620a0c8789d..dd91a68d864f 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 77644a85ed8c..9f748b77d69a 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 ed48acc51330..de657e2215ab 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 a77a326b9ab5..71ee524bbd8c 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++; |
