[PATCH] hwpmc(4) changes to use 'mp_maxid' instead of
'mp_ncpus'.
John Baldwin
jhb at FreeBSD.org
Thu Mar 13 19:16:54 UTC 2008
On Thursday 13 March 2008 02:08:05 pm David O'Brien wrote:
> 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.
This is correct, but you need to handle CPUs that are absent. It might be
sufficient to update pmc_cpu_is_disabled() in kern_pmc.c to check
CPU_ABSENT(cpu) and claim the CPU is disabled if it is absent, but I'm not
sure that will catch everything as that seems aimed at handling having a
non-absent CPU halted (such as disabling HTT on i386).
> --
> -- 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"
> _______________________________________________
> freebsd-arch at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-arch
> To unsubscribe, send any mail to "freebsd-arch-unsubscribe at freebsd.org"
>
--
John Baldwin
More information about the freebsd-arch
mailing list