Page MenuHomeFreeBSD

D59358.id188091.diff
No OneTemporary

D59358.id188091.diff

diff --git a/sys/dev/hwpmc/hwpmc_logging.c b/sys/dev/hwpmc/hwpmc_logging.c
--- a/sys/dev/hwpmc/hwpmc_logging.c
+++ b/sys/dev/hwpmc/hwpmc_logging.c
@@ -920,7 +920,7 @@
PMCLOG_RESERVE_SAFE(po, PMCLOG_TYPE_CALLCHAIN, recordlen, ps->ps_tsc);
PMCLOG_EMIT32(ps->ps_pid);
PMCLOG_EMIT32(ps->ps_tid);
- PMCLOG_EMIT32(pm->pm_id);
+ PMCLOG_EMIT32(pm->pm_handle);
PMCLOG_EMIT32(flags);
for (n = 0; n < ps->ps_nsamples; n++)
PMCLOG_EMITADDR(ps->ps_pc[n]);
@@ -967,6 +967,45 @@
PMCLOG_DESPATCH_SYNC(po);
}
+/*
+ * Queue a mapping record without a thread wakeup.
+ * Use this function when the caller holds a spin lock.
+ */
+void
+pmclog_process_map_in_nowakeup(struct pmc_owner *po, pid_t pid,
+ uintfptr_t start, const char *path)
+{
+ int pathlen, recordlen;
+
+ KASSERT(path != NULL, ("[pmclog,%d] map-in, null path", __LINE__));
+
+ pathlen = strlen(path) + 1; /* #bytes for path name */
+ recordlen = offsetof(struct pmclog_map_in, pl_pathname) +
+ pathlen;
+
+ PMCLOG_RESERVE_SAFE(po, PMCLOG_TYPE_MAP_IN, recordlen, pmc_rdtsc());
+ PMCLOG_EMIT32(pid);
+ PMCLOG_EMIT32(0);
+ PMCLOG_EMITADDR(start);
+ PMCLOG_EMITSTRING(path,pathlen);
+ PMCLOG_DESPATCH_SCHED_LOCK(po);
+}
+
+void
+pmclog_process_map_out_nowakeup(struct pmc_owner *po, pid_t pid,
+ uintfptr_t start, uintfptr_t end)
+{
+ KASSERT(start <= end, ("[pmclog,%d] start > end", __LINE__));
+
+ PMCLOG_RESERVE_SAFE(po, PMCLOG_TYPE_MAP_OUT,
+ sizeof(struct pmclog_map_out), pmc_rdtsc());
+ PMCLOG_EMIT32(pid);
+ PMCLOG_EMIT32(0);
+ PMCLOG_EMITADDR(start);
+ PMCLOG_EMITADDR(end);
+ PMCLOG_DESPATCH_SCHED_LOCK(po);
+}
+
void
pmclog_process_map_out(struct pmc_owner *po, pid_t pid, uintfptr_t start,
uintfptr_t end)
@@ -994,7 +1033,7 @@
if (PMC_TO_CLASS(pm) == PMC_CLASS_SOFT) {
PMCLOG_RESERVE(po, PMCLOG_TYPE_PMCALLOCATEDYN,
sizeof(struct pmclog_pmcallocatedyn));
- PMCLOG_EMIT32(pm->pm_id);
+ PMCLOG_EMIT32(pm->pm_handle);
PMCLOG_EMIT32(pm->pm_event);
PMCLOG_EMIT32(pm->pm_flags);
PMCLOG_EMIT32(0);
@@ -1009,7 +1048,7 @@
} else {
PMCLOG_RESERVE(po, PMCLOG_TYPE_PMCALLOCATE,
sizeof(struct pmclog_pmcallocate));
- PMCLOG_EMIT32(pm->pm_id);
+ PMCLOG_EMIT32(pm->pm_handle);
PMCLOG_EMIT32(pm->pm_event);
PMCLOG_EMIT32(pm->pm_flags);
PMCLOG_EMIT32(0);
@@ -1032,7 +1071,7 @@
recordlen = offsetof(struct pmclog_pmcattach, pl_pathname) + pathlen;
PMCLOG_RESERVE(po, PMCLOG_TYPE_PMCATTACH, recordlen);
- PMCLOG_EMIT32(pm->pm_id);
+ PMCLOG_EMIT32(pm->pm_handle);
PMCLOG_EMIT32(pid);
PMCLOG_EMITSTRING(path, pathlen);
PMCLOG_DESPATCH_SYNC(po);
@@ -1049,7 +1088,27 @@
PMCLOG_RESERVE(po, PMCLOG_TYPE_PMCDETACH,
sizeof(struct pmclog_pmcdetach));
- PMCLOG_EMIT32(pm->pm_id);
+ PMCLOG_EMIT32(pm->pm_handle);
+ PMCLOG_EMIT32(pid);
+ PMCLOG_DESPATCH_SYNC(po);
+}
+
+/*
+ * Record that a group did not follow a fork.
+ * This is not a detach. The edge never attached, so PMCDETACH is wrong here.
+ */
+void
+pmclog_process_pmcgroupinheritmiss(struct pmc *pm, pid_t pid)
+{
+ struct pmc_owner *po;
+
+ PMCDBG2(LOG,ATT,1,"!pm=%p pid=%d", pm, pid);
+
+ po = pm->pm_owner;
+
+ PMCLOG_RESERVE(po, PMCLOG_TYPE_PMCGROUPINHERITMISS,
+ sizeof(struct pmclog_pmcgroupinheritmiss));
+ PMCLOG_EMIT32(pm->pm_handle);
PMCLOG_EMIT32(pid);
PMCLOG_DESPATCH_SYNC(po);
}
@@ -1094,7 +1153,7 @@
PMCLOG_RESERVE_SAFE(po, PMCLOG_TYPE_PROCCSW,
sizeof(struct pmclog_proccsw), pmc_rdtsc());
PMCLOG_EMIT64(v);
- PMCLOG_EMIT32(pm->pm_id);
+ PMCLOG_EMIT32(pm->pm_handle);
PMCLOG_EMIT32(pp->pp_proc->p_pid);
PMCLOG_EMIT32(td->td_tid);
PMCLOG_EMIT32(0);
@@ -1138,7 +1197,7 @@
PMCLOG_RESERVE(po, PMCLOG_TYPE_PROCEXIT,
sizeof(struct pmclog_procexit));
- PMCLOG_EMIT32(pm->pm_id);
+ PMCLOG_EMIT32(pm->pm_handle);
PMCLOG_EMIT32(pp->pp_proc->p_pid);
PMCLOG_EMIT64(pp->pp_pmcs[ri].pp_pmcval);
PMCLOG_DESPATCH(po);
diff --git a/sys/sys/pmclog.h b/sys/sys/pmclog.h
--- a/sys/sys/pmclog.h
+++ b/sys/sys/pmclog.h
@@ -71,7 +71,8 @@
*/
PMCLOG_TYPE_THR_CREATE = 18,
PMCLOG_TYPE_THR_EXIT = 19,
- PMCLOG_TYPE_PROC_CREATE = 20
+ PMCLOG_TYPE_PROC_CREATE = 20,
+ PMCLOG_TYPE_PMCGROUPINHERITMISS = 21
};
/*
@@ -200,6 +201,12 @@
uint32_t pl_pid;
} __packed;
+struct pmclog_pmcgroupinheritmiss {
+ PMCLOG_ENTRY_HEADER
+ uint32_t pl_pmcid;
+ uint32_t pl_pid;
+} __packed;
+
struct pmclog_proccsw {
PMCLOG_ENTRY_HEADER
uint64_t pl_value; /* keep 8 byte aligned */
@@ -287,6 +294,7 @@
struct pmclog_pmcallocatedyn pl_ad;
struct pmclog_pmcattach pl_t;
struct pmclog_pmcdetach pl_d;
+ struct pmclog_pmcgroupinheritmiss pl_gim;
struct pmclog_proccsw pl_c;
struct pmclog_proccreate pl_pc;
struct pmclog_procexec pl_x;
@@ -327,11 +335,16 @@
void pmclog_process_dropnotify(struct pmc_owner *po);
void pmclog_process_map_in(struct pmc_owner *po, pid_t pid,
uintfptr_t start, const char *path);
+void pmclog_process_map_in_nowakeup(struct pmc_owner *po, pid_t pid,
+ uintfptr_t start, const char *path);
void pmclog_process_map_out(struct pmc_owner *po, pid_t pid,
uintfptr_t start, uintfptr_t end);
+void pmclog_process_map_out_nowakeup(struct pmc_owner *po, pid_t pid,
+ uintfptr_t start, uintfptr_t end);
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_pmcgroupinheritmiss(struct pmc *_pm, pid_t _pid);
void pmclog_process_proccsw(struct pmc *_pm, struct pmc_process *_pp,
pmc_value_t _v, struct thread *);
void pmclog_process_procexec(struct pmc_owner *_po, pmc_id_t _pmid, pid_t _pid,

File Metadata

Mime Type
text/plain
Expires
Tue, Oct 20, 1:06 PM (3 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41103453
Default Alt Text
D59358.id188091.diff (5 KB)

Event Timeline