[PATCH] hwpmc(4) changes to use 'mp_maxid' instead of 'mp_ncpus'.

David O'Brien obrien at freebsd.org
Thu Mar 13 18:08:05 UTC 2008


Hi folks,
Some folks at Juniper have submitted these changes to hwpmc(4).
I am sending them here for public review.

Their thoughts are:
    The mp_ncpus refers to the count of the active CPU's.  Where as
    mp_maxid refers to the count of all the cpus on the SMP.  Using
    mp_ncpus in the cpu_id range-check of hwpmc module would lead to the
    assumption that all the active CPU's in the SMP are not interleaved.
    But for running on some platforms, the active and inactive cpus could
    be interleaved making hwpmc not work for the cpus whose cpu_id is
    greater than the active-cpu count.

-- 
-- David  (obrien at FreeBSD.org)

Index: sys/dev/hwpmc/hwpmc_amd.c
===================================================================
RCS file: /cvs/junos-2001/src/sys/dev/hwpmc/hwpmc_amd.c,v
retrieving revision 1.1.1.1
retrieving revision 1.4
diff -u -p -r1.1.1.1 -r1.4
--- sys/dev/hwpmc/hwpmc_amd.c	21 Jun 2006 03:30:02 -0000	1.1.1.1
+++ sys/dev/hwpmc/hwpmc_amd.c	30 Oct 2007 18:00:43 -0000	1.4
@@ -265,7 +265,7 @@ amd_read_pmc(int cpu, int ri, pmc_value_
 	const struct pmc_hw *phw;
 	pmc_value_t tmp;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[amd,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < AMD_NPMCS,
 	    ("[amd,%d] illegal row-index %d", __LINE__, ri));
@@ -320,7 +320,7 @@ amd_write_pmc(int cpu, int ri, pmc_value
 	const struct pmc_hw *phw;
 	enum pmc_mode mode;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[amd,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < AMD_NPMCS,
 	    ("[amd,%d] illegal row-index %d", __LINE__, ri));
@@ -367,7 +367,7 @@ amd_config_pmc(int cpu, int ri, struct p
 
 	PMCDBG(MDP,CFG,1, "cpu=%d ri=%d pm=%p", cpu, ri, pm);
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[amd,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < AMD_NPMCS,
 	    ("[amd,%d] illegal row-index %d", __LINE__, ri));
@@ -449,7 +449,7 @@ amd_allocate_pmc(int cpu, int ri, struct
 
 	(void) cpu;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[amd,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < AMD_NPMCS,
 	    ("[amd,%d] illegal row index %d", __LINE__, ri));
@@ -543,7 +543,7 @@ amd_release_pmc(int cpu, int ri, struct 
 
 	(void) pmc;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[amd,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < AMD_NPMCS,
 	    ("[amd,%d] illegal row-index %d", __LINE__, ri));
@@ -575,7 +575,7 @@ amd_start_pmc(int cpu, int ri)
 	struct pmc_hw *phw;
 	const struct amd_descr *pd;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[amd,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < AMD_NPMCS,
 	    ("[amd,%d] illegal row-index %d", __LINE__, ri));
@@ -624,7 +624,7 @@ amd_stop_pmc(int cpu, int ri)
 	const struct amd_descr *pd;
 	uint64_t config;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[amd,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < AMD_NPMCS,
 	    ("[amd,%d] illegal row-index %d", __LINE__, ri));
@@ -676,7 +676,7 @@ amd_intr(int cpu, uintptr_t eip, int use
 	struct pmc_hw *phw;
 	pmc_value_t v;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[amd,%d] out of range CPU %d", __LINE__, cpu));
 
 	PMCDBG(MDP,INT,1, "cpu=%d eip=%p um=%d", cpu, (void *) eip,
@@ -756,7 +756,7 @@ amd_describe(int cpu, int ri, struct pmc
 	const struct amd_descr *pd;
 	struct pmc_hw *phw;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[amd,%d] illegal CPU %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < AMD_NPMCS,
 	    ("[amd,%d] row-index %d out of range", __LINE__, ri));
@@ -825,7 +825,7 @@ amd_init(int cpu)
 	struct amd_cpu *pcs;
 	struct pmc_hw  *phw;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[amd,%d] insane cpu number %d", __LINE__, cpu));
 
 	PMCDBG(MDP,INI,1,"amd-init cpu=%d", cpu);
@@ -868,7 +868,7 @@ amd_cleanup(int cpu)
 	uint32_t evsel;
 	struct pmc_cpu *pcs;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[amd,%d] insane cpu number (%d)", __LINE__, cpu));
 
 	PMCDBG(MDP,INI,1,"amd-cleanup cpu=%d", cpu);
Index: sys/dev/hwpmc/hwpmc_mod.c
===================================================================
RCS file: /cvs/junos-2001/src/sys/dev/hwpmc/hwpmc_mod.c,v
retrieving revision 1.1.1.1
retrieving revision 1.4
diff -u -p -r1.1.1.1 -r1.4
--- sys/dev/hwpmc/hwpmc_mod.c	21 Jun 2006 03:30:03 -0000	1.1.1.1
+++ sys/dev/hwpmc/hwpmc_mod.c	30 Oct 2007 18:00:43 -0000	1.4
@@ -615,7 +615,7 @@ pmc_restore_cpu_binding(struct pmc_bindi
 static void
 pmc_select_cpu(int cpu)
 {
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[pmc,%d] bad cpu number %d", __LINE__, cpu));
 
 	/* never move to a disabled CPU */
@@ -1167,7 +1167,7 @@ pmc_process_csw_in(struct thread *td)
 	PMCDBG(CSW,SWI,1, "cpu=%d proc=%p (%d, %s) pp=%p", cpu, p,
 	    p->p_pid, p->p_comm, pp);
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[pmc,%d] wierd CPU id %d", __LINE__, cpu));
 
 	pc = pmc_pcpu[cpu];
@@ -1292,7 +1292,7 @@ pmc_process_csw_out(struct thread *td)
 	PMCDBG(CSW,SWO,1, "cpu=%d proc=%p (%d, %s) pp=%p", cpu, p,
 	    p->p_pid, p->p_comm, pp);
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[pmc,%d wierd CPU id %d", __LINE__, cpu));
 
 	pc = pmc_pcpu[cpu];
@@ -2313,7 +2313,7 @@ pmc_stop(struct pmc *pm)
 
 	cpu = PMC_TO_CPU(pm);
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[pmc,%d] illegal cpu=%d", __LINE__, cpu));
 
 	if (pmc_cpu_is_disabled(cpu))
@@ -2478,7 +2478,7 @@ pmc_syscall_handler(struct thread *td, v
 		struct pmc_op_getcpuinfo gci;
 
 		gci.pm_cputype = md->pmd_cputype;
-		gci.pm_ncpu    = mp_ncpus;
+		gci.pm_ncpu    = mp_maxid + 1;
 		gci.pm_npmc    = md->pmd_npmc;
 		gci.pm_nclass  = md->pmd_nclass;
 		bcopy(md->pmd_classes, &gci.pm_classes,
@@ -2546,7 +2546,7 @@ pmc_syscall_handler(struct thread *td, v
 		if ((error = copyin(&gpi->pm_cpu, &cpu, sizeof(cpu))) != 0)
 			break;
 
-		if (cpu >= (unsigned int) mp_ncpus) {
+		if (cpu > (unsigned int) mp_maxid) {
 			error = EINVAL;
 			break;
 		}
@@ -2641,7 +2641,7 @@ pmc_syscall_handler(struct thread *td, v
 
 		cpu = pma.pm_cpu;
 
-		if (cpu < 0 || cpu >= mp_ncpus) {
+		if (cpu < 0 || cpu > mp_maxid) {
 			error = EINVAL;
 			break;
 		}
@@ -2734,7 +2734,7 @@ pmc_syscall_handler(struct thread *td, v
 
 		if ((mode != PMC_MODE_SS  &&  mode != PMC_MODE_SC  &&
 		     mode != PMC_MODE_TS  &&  mode != PMC_MODE_TC) ||
-		    (cpu != (u_int) PMC_CPU_ANY && cpu >= (u_int) mp_ncpus)) {
+		    (cpu != (u_int) PMC_CPU_ANY && cpu > (u_int) mp_maxid)) {
 			error = EINVAL;
 			break;
 		}
@@ -3973,16 +3973,16 @@ pmc_initialize(void)
 		return ENOSYS;
 
 	/* allocate space for the per-cpu array */
-	MALLOC(pmc_pcpu, struct pmc_cpu **, mp_ncpus * sizeof(struct pmc_cpu *),
-	    M_PMC, M_WAITOK|M_ZERO);
+	MALLOC(pmc_pcpu, struct pmc_cpu **,
+	    (mp_maxid + 1) * sizeof(struct pmc_cpu *), M_PMC, M_WAITOK|M_ZERO);
 
 	/* per-cpu 'saved values' for managing process-mode PMCs */
 	MALLOC(pmc_pcpu_saved, pmc_value_t *,
-	    sizeof(pmc_value_t) * mp_ncpus * md->pmd_npmc, M_PMC, M_WAITOK);
+	    sizeof(pmc_value_t) * (mp_maxid + 1) * md->pmd_npmc, M_PMC, M_WAITOK);
 
 	/* perform cpu dependent initialization */
 	pmc_save_cpu_binding(&pb);
-	for (cpu = 0; cpu < mp_ncpus; cpu++) {
+	for (cpu = 0; cpu <= mp_maxid; cpu++) {
 		if (pmc_cpu_is_disabled(cpu))
 			continue;
 		pmc_select_cpu(cpu);
@@ -3995,7 +3995,7 @@ pmc_initialize(void)
 		return error;
 
 	/* allocate space for the sample array */
-	for (cpu = 0; cpu < mp_ncpus; cpu++) {
+	for (cpu = 0; cpu <= mp_maxid; cpu++) {
 		if (pmc_cpu_is_disabled(cpu))
 			continue;
 		MALLOC(sb, struct pmc_samplebuffer *,
@@ -4156,7 +4156,7 @@ pmc_cleanup(void)
 	    ("[pmc,%d] Global SS count not empty", __LINE__));
 
 	/* free the per-cpu sample buffers */
-	for (cpu = 0; cpu < mp_ncpus; cpu++) {
+	for (cpu = 0; cpu <= mp_maxid; cpu++) {
 		if (pmc_cpu_is_disabled(cpu))
 			continue;
 		KASSERT(pmc_pcpu[cpu]->pc_sb != NULL,
@@ -4170,7 +4170,7 @@ pmc_cleanup(void)
 	PMCDBG(MOD,INI,3, "%s", "md cleanup");
 	if (md) {
 		pmc_save_cpu_binding(&pb);
-		for (cpu = 0; cpu < mp_ncpus; cpu++) {
+		for (cpu = 0; cpu <= mp_maxid; cpu++) {
 			PMCDBG(MOD,INI,1,"pmc-cleanup cpu=%d pcs=%p",
 			    cpu, pmc_pcpu[cpu]);
 			if (pmc_cpu_is_disabled(cpu))
Index: sys/dev/hwpmc/hwpmc_piv.c
===================================================================
RCS file: /cvs/junos-2001/src/sys/dev/hwpmc/hwpmc_piv.c,v
retrieving revision 1.1.1.1
retrieving revision 1.4
diff -u -p -r1.1.1.1 -r1.4
--- sys/dev/hwpmc/hwpmc_piv.c	21 Jun 2006 03:30:03 -0000	1.1.1.1
+++ sys/dev/hwpmc/hwpmc_piv.c	30 Oct 2007 18:00:43 -0000	1.4
@@ -585,7 +585,7 @@ p4_init(int cpu)
 	struct p4_logicalcpu *plcs;
 	struct pmc_hw *phw;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p4,%d] insane cpu number %d", __LINE__, cpu));
 
 	PMCDBG(MDP,INI,0, "p4-init cpu=%d logical=%d", cpu,
@@ -737,7 +737,7 @@ p4_read_pmc(int cpu, int ri, pmc_value_t
 	struct pmc_hw *phw;
 	pmc_value_t tmp;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p4,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < P4_NPMCS,
 	    ("[p4,%d] illegal row-index %d", __LINE__, ri));
@@ -815,7 +815,7 @@ p4_write_pmc(int cpu, int ri, pmc_value_
 	const struct pmc_hw *phw;
 	const struct p4pmc_descr *pd;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[amd,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < P4_NPMCS,
 	    ("[amd,%d] illegal row-index %d", __LINE__, ri));
@@ -889,7 +889,7 @@ p4_config_pmc(int cpu, int ri, struct pm
 	struct p4_cpu *pc;
 	int cfgflags, cpuflag;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p4,%d] illegal CPU %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < P4_NPMCS,
 	    ("[p4,%d] illegal row-index %d", __LINE__, ri));
@@ -1026,7 +1026,7 @@ p4_allocate_pmc(int cpu, int ri, struct 
 	struct p4_event_descr *pevent;
 	const struct p4pmc_descr *pd;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p4,%d] illegal CPU %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < P4_NPMCS,
 	    ("[p4,%d] illegal row-index value %d", __LINE__, ri));
@@ -1273,7 +1273,7 @@ p4_start_pmc(int cpu, int ri)
 	struct pmc_hw *phw;
 	struct p4pmc_descr *pd;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p4,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < P4_NPMCS,
 	    ("[p4,%d] illegal row-index %d", __LINE__, ri));
@@ -1425,7 +1425,7 @@ p4_stop_pmc(int cpu, int ri)
 	struct p4pmc_descr *pd;
 	pmc_value_t tmp;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p4,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < P4_NPMCS,
 	    ("[p4,%d] illegal row index %d", __LINE__, ri));
@@ -1694,7 +1694,7 @@ p4_describe(int cpu, int ri, struct pmc_
 	struct pmc_hw *phw;
 	const struct p4pmc_descr *pd;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p4,%d] illegal CPU %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < P4_NPMCS,
 	    ("[p4,%d] row-index %d out of range", __LINE__, ri));
Index: sys/dev/hwpmc/hwpmc_ppro.c
===================================================================
RCS file: /cvs/junos-2001/src/sys/dev/hwpmc/hwpmc_ppro.c,v
retrieving revision 1.1.1.1
retrieving revision 1.4
diff -u -p -r1.1.1.1 -r1.4
--- sys/dev/hwpmc/hwpmc_ppro.c	21 Jun 2006 03:30:03 -0000	1.1.1.1
+++ sys/dev/hwpmc/hwpmc_ppro.c	30 Oct 2007 18:00:43 -0000	1.4
@@ -331,7 +331,7 @@ p6_init(int cpu)
 	struct p6_cpu *pcs;
 	struct pmc_hw *phw;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p6,%d] bad cpu %d", __LINE__, cpu));
 
 	PMCDBG(MDP,INI,0,"p6-init cpu=%d", cpu);
@@ -361,7 +361,7 @@ p6_cleanup(int cpu)
 {
 	struct pmc_cpu *pcs;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p6,%d] bad cpu %d", __LINE__, cpu));
 
 	PMCDBG(MDP,INI,0,"p6-cleanup cpu=%d", cpu);
@@ -507,7 +507,7 @@ p6_allocate_pmc(int cpu, int ri, struct 
 
 	(void) cpu;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p4,%d] illegal CPU %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < P6_NPMCS,
 	    ("[p4,%d] illegal row-index value %d", __LINE__, ri));
@@ -611,7 +611,7 @@ p6_release_pmc(int cpu, int ri, struct p
 
 	PMCDBG(MDP,REL,1, "p6-release cpu=%d ri=%d pm=%p", cpu, ri, pm);
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p6,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < P6_NPMCS,
 	    ("[p6,%d] illegal row-index %d", __LINE__, ri));
@@ -633,7 +633,7 @@ p6_start_pmc(int cpu, int ri)
 	struct pmc_hw *phw;
 	const struct p6pmc_descr *pd;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p6,%d] illegal CPU value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < P6_NPMCS,
 	    ("[p6,%d] illegal row-index %d", __LINE__, ri));
@@ -677,7 +677,7 @@ p6_stop_pmc(int cpu, int ri)
 	struct pmc_hw *phw;
 	struct p6pmc_descr *pd;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p6,%d] illegal cpu value %d", __LINE__, cpu));
 	KASSERT(ri >= 0 && ri < P6_NPMCS,
 	    ("[p6,%d] illegal row index %d", __LINE__, ri));
@@ -719,7 +719,7 @@ p6_intr(int cpu, uintptr_t eip, int user
 	struct pmc_hw *phw;
 	pmc_value_t v;
 
-	KASSERT(cpu >= 0 && cpu < mp_ncpus,
+	KASSERT(cpu >= 0 && cpu <= mp_maxid,
 	    ("[p6,%d] CPU %d out of range", __LINE__, cpu));
 
 	retval = 0;
Index: usr.sbin/pmccontrol/pmccontrol.c
===================================================================
RCS file: /cvs/junos-2001/src/usr.sbin/pmccontrol/pmccontrol.c,v
retrieving revision 1.1.1.1
retrieving revision 1.4
diff -u -p -r1.1.1.1 -r1.4
--- usr.sbin/pmccontrol/pmccontrol.c	3 Nov 2006 01:43:32 -0000	1.1.1.1
+++ usr.sbin/pmccontrol/pmccontrol.c	29 Nov 2007 22:47:14 -0000	1.4
@@ -207,10 +207,16 @@ pmcc_do_enable_disable(struct pmcc_op_li
 			else if (b == PMCC_OP_DISABLE)
 				error = pmc_disable(i, j);
 
-			if (error < 0)
+			if (error < 0) {
+				if (errno == ENXIO) {
+					/* This cpu wasn't configured. */
+					error = 0;
+					continue;
+				}
 				err(EX_OSERR, "%s of PMC %d on CPU %d failed",
 				    b == PMCC_OP_ENABLE ? "Enable" :
 				    "Disable", j, i);
+			}
 		}
 
 	return error;
@@ -242,9 +248,14 @@ pmcc_do_list_state(void)
 		    (logical_cpus_mask & (1 << cpu)))
 			continue; /* skip P4-style 'logical' cpus */
 #endif
-		if (pmc_pmcinfo(cpu, &pi) < 0)
+		if (pmc_pmcinfo(cpu, &pi) < 0) {
+			if (errno == ENXIO) {
+				/* This cpu wasn't enabled. */
+				continue;
+			}
 			err(EX_OSERR, "Unable to get PMC status for CPU %d",
 			    cpu);
+		}
 
 		printf("#CPU %d:\n", c++);
 		npmc = pmc_npmc(cpu);
Index: usr.sbin/pmcstat/pmcstat.c
===================================================================
RCS file: /cvs/junos-2001/src/usr.sbin/pmcstat/pmcstat.c,v
retrieving revision 1.1.1.1
retrieving revision 1.4
diff -u -p -r1.1.1.1 -r1.4
--- usr.sbin/pmcstat/pmcstat.c	3 Nov 2006 01:43:32 -0000	1.1.1.1
+++ usr.sbin/pmcstat/pmcstat.c	30 Aug 2007 15:03:02 -0000	1.4
@@ -692,6 +692,7 @@ main(int argc, char **argv)
 		if ((args.pa_logparser = pmclog_open(args.pa_logfd)) == NULL)
 			err(EX_OSERR, "ERROR: Cannot create parser");
 		pmcstat_process_log(&args);
+		pmcstat_shutdown_logging();
 		exit(EX_OK);
 	}
 

-- 
-- David  (obrien at FreeBSD.org)
Q: Because it reverses the logical flow of conversation.
A: Why is top-posting (putting a reply at the top of the message) frowned upon?
Let's not play "Jeopardy-style quoting"


More information about the freebsd-arch mailing list