summaryrefslogtreecommitdiff
path: root/sys/dev/hwpmc
diff options
context:
space:
mode:
authorAndriy Gapon <avg@FreeBSD.org>2014-02-17 12:42:57 +0000
committerAndriy Gapon <avg@FreeBSD.org>2014-02-17 12:42:57 +0000
commit21ae892345b9788eb7cf1c87c713bdcf1119f8fe (patch)
treed081797cd4d24844a8c30d373c739b0aae72abf5 /sys/dev/hwpmc
parentffee2b4b115b8ac6696f54634ff91d0d9c5207b5 (diff)
Notes
Diffstat (limited to 'sys/dev/hwpmc')
-rw-r--r--sys/dev/hwpmc/hwpmc_mod.c111
1 files changed, 53 insertions, 58 deletions
diff --git a/sys/dev/hwpmc/hwpmc_mod.c b/sys/dev/hwpmc/hwpmc_mod.c
index 7eb9f92cc513..60f5b8f39aa2 100644
--- a/sys/dev/hwpmc/hwpmc_mod.c
+++ b/sys/dev/hwpmc/hwpmc_mod.c
@@ -131,7 +131,8 @@ static int *pmc_pmcdisp; /* PMC row dispositions */
/* various event handlers */
-static eventhandler_tag pmc_exit_tag, pmc_fork_tag;
+static eventhandler_tag pmc_exit_tag, pmc_fork_tag, pmc_kld_load_tag,
+ pmc_kld_unload_tag;
/* Module statistics */
struct pmc_op_getdriverstats pmc_stats;
@@ -1475,50 +1476,6 @@ pmc_process_csw_out(struct thread *td)
}
/*
- * Log a KLD operation.
- */
-
-static void
-pmc_process_kld_load(struct pmckern_map_in *pkm)
-{
- struct pmc_owner *po;
-
- sx_assert(&pmc_sx, SX_LOCKED);
-
- /*
- * Notify owners of system sampling PMCs about KLD operations.
- */
-
- LIST_FOREACH(po, &pmc_ss_owners, po_ssnext)
- if (po->po_flags & PMC_PO_OWNS_LOGFILE)
- pmclog_process_map_in(po, (pid_t) -1, pkm->pm_address,
- (char *) pkm->pm_file);
-
- /*
- * TODO: Notify owners of (all) process-sampling PMCs too.
- */
-
- return;
-}
-
-static void
-pmc_process_kld_unload(struct pmckern_map_out *pkm)
-{
- struct pmc_owner *po;
-
- sx_assert(&pmc_sx, SX_LOCKED);
-
- LIST_FOREACH(po, &pmc_ss_owners, po_ssnext)
- if (po->po_flags & PMC_PO_OWNS_LOGFILE)
- pmclog_process_map_out(po, (pid_t) -1,
- pkm->pm_address, pkm->pm_address + pkm->pm_size);
-
- /*
- * TODO: Notify owners of process-sampling PMCs.
- */
-}
-
-/*
* A mapping change for a process.
*/
@@ -1835,8 +1792,8 @@ const char *pmc_hooknames[] = {
"CSW-IN",
"CSW-OUT",
"SAMPLE",
- "KLDLOAD",
- "KLDUNLOAD",
+ "UNUSED1",
+ "UNUSED2",
"MMAP",
"MUNMAP",
"CALLCHAIN-NMI",
@@ -2004,17 +1961,6 @@ pmc_hook_handler(struct thread *td, int function, void *arg)
pmc_process_samples(PCPU_GET(cpuid), PMC_SR);
break;
-
- case PMC_FN_KLD_LOAD:
- sx_assert(&pmc_sx, SX_LOCKED);
- pmc_process_kld_load((struct pmckern_map_in *) arg);
- break;
-
- case PMC_FN_KLD_UNLOAD:
- sx_assert(&pmc_sx, SX_LOCKED);
- pmc_process_kld_unload((struct pmckern_map_out *) arg);
- break;
-
case PMC_FN_MMAP:
sx_assert(&pmc_sx, SX_LOCKED);
pmc_process_mmap(td, (struct pmckern_map_in *) arg);
@@ -4649,6 +4595,47 @@ pmc_process_fork(void *arg __unused, struct proc *p1, struct proc *newproc,
sx_xunlock(&pmc_sx);
}
+static void
+pmc_kld_load(void *arg __unused, linker_file_t lf)
+{
+ struct pmc_owner *po;
+
+ sx_slock(&pmc_sx);
+
+ /*
+ * Notify owners of system sampling PMCs about KLD operations.
+ */
+ LIST_FOREACH(po, &pmc_ss_owners, po_ssnext)
+ if (po->po_flags & PMC_PO_OWNS_LOGFILE)
+ pmclog_process_map_in(po, (pid_t) -1,
+ (uintfptr_t) lf->address, lf->filename);
+
+ /*
+ * TODO: Notify owners of (all) process-sampling PMCs too.
+ */
+
+ sx_sunlock(&pmc_sx);
+}
+
+static void
+pmc_kld_unload(void *arg __unused, const char *filename __unused,
+ caddr_t address, size_t size)
+{
+ struct pmc_owner *po;
+
+ sx_slock(&pmc_sx);
+
+ LIST_FOREACH(po, &pmc_ss_owners, po_ssnext)
+ if (po->po_flags & PMC_PO_OWNS_LOGFILE)
+ pmclog_process_map_out(po, (pid_t) -1,
+ (uintfptr_t) address, (uintfptr_t) address + size);
+
+ /*
+ * TODO: Notify owners of process-sampling PMCs.
+ */
+
+ sx_sunlock(&pmc_sx);
+}
/*
* initialization
@@ -4924,6 +4911,12 @@ pmc_initialize(void)
pmc_fork_tag = EVENTHANDLER_REGISTER(process_fork,
pmc_process_fork, NULL, EVENTHANDLER_PRI_ANY);
+ /* register kld event handlers */
+ pmc_kld_load_tag = EVENTHANDLER_REGISTER(kld_load, pmc_kld_load,
+ NULL, EVENTHANDLER_PRI_ANY);
+ pmc_kld_unload_tag = EVENTHANDLER_REGISTER(kld_unload, pmc_kld_unload,
+ NULL, EVENTHANDLER_PRI_ANY);
+
/* initialize logging */
pmclog_initialize();
@@ -4981,6 +4974,8 @@ pmc_cleanup(void)
/* deregister event handlers */
EVENTHANDLER_DEREGISTER(process_fork, pmc_fork_tag);
EVENTHANDLER_DEREGISTER(process_exit, pmc_exit_tag);
+ EVENTHANDLER_DEREGISTER(kld_load, pmc_kld_load_tag);
+ EVENTHANDLER_DEREGISTER(kld_unload, pmc_kld_unload_tag);
/* send SIGBUS to all owner threads, free up allocations */
if (pmc_ownerhash)