svn commit: r226514 - in head: lib/libpmc sys/dev/hwpmc sys/sys
usr.sbin/pmcstat
Bjoern A. Zeeb
bzeeb-lists at lists.zabbadoz.net
Wed Oct 19 08:58:13 UTC 2011
On 19. Oct 2011, at 07:17 , Fabien Thomas wrote:
> Badly merged my patchset...
> Corrected with r226526.
>
Thanks!
> On Oct 18, 2011, at 6:23 PM, Bjoern A. Zeeb wrote:
>
>>
>> On 18. Oct 2011, at 15:25 , Fabien Thomas wrote:
>>
>>> Author: fabient
>>> Date: Tue Oct 18 15:25:43 2011
>>> New Revision: 226514
>>> URL: http://svn.freebsd.org/changeset/base/226514
>>>
>>> Log:
>>> Add a flush of the current PMC log buffer before displaying the next top.
>>>
>>> As the underlying block is 4KB if the PMC throughput is low the measurement
>>> will be reported on the next tick. pmcstat(8) use the modified flush API to
>>> reclaim current buffer before displaying next top.
>>>
>>
>> I get this for every LINT kernel at minimum:
>>
>> /scratch/tmp/bz/head.universe/sys/modules/hwpmc/../../dev/hwpmc/hwpmc_logging.c: In function 'pmclog_close':
>> /scratch/tmp/bz/head.universe/sys/modules/hwpmc/../../dev/hwpmc/hwpmc_logging.c:738: error: 'PMC_DEBUG_MIN_CLO' undeclared (first use in this function)
>> /scratch/tmp/bz/head.universe/sys/modules/hwpmc/../../dev/hwpmc/hwpmc_logging.c:738: error: (Each undeclared identifier is reported only once
>> /scratch/tmp/bz/head.universe/sys/modules/hwpmc/../../dev/hwpmc/hwpmc_logging.c:738: error: for each function it appears in.)
>>
>>
>>
>>> MFC after: 1 month
>>>
>>> Modified:
>>> head/lib/libpmc/libpmc.c
>>> head/lib/libpmc/pmc.3
>>> head/lib/libpmc/pmc.h
>>> head/lib/libpmc/pmc_configure_logfile.3
>>> head/sys/dev/hwpmc/hwpmc_logging.c
>>> head/sys/dev/hwpmc/hwpmc_mod.c
>>> head/sys/sys/pmc.h
>>> head/sys/sys/pmclog.h
>>> head/usr.sbin/pmcstat/pmcstat.c
>>> head/usr.sbin/pmcstat/pmcstat_log.c
>>>
>>> Modified: head/lib/libpmc/libpmc.c
>>> ==============================================================================
>>> --- head/lib/libpmc/libpmc.c Tue Oct 18 14:05:18 2011 (r226513)
>>> +++ head/lib/libpmc/libpmc.c Tue Oct 18 15:25:43 2011 (r226514)
>>> @@ -2596,6 +2596,12 @@ pmc_flush_logfile(void)
>>> }
>>>
>>> int
>>> +pmc_close_logfile(void)
>>> +{
>>> + return (PMC_CALL(CLOSELOG,0));
>>> +}
>>> +
>>> +int
>>> pmc_get_driver_stats(struct pmc_driverstats *ds)
>>> {
>>> struct pmc_op_getdriverstats gms;
>>>
>>> Modified: head/lib/libpmc/pmc.3
>>> ==============================================================================
>>> --- head/lib/libpmc/pmc.3 Tue Oct 18 14:05:18 2011 (r226513)
>>> +++ head/lib/libpmc/pmc.3 Tue Oct 18 15:25:43 2011 (r226514)
>>> @@ -322,6 +322,10 @@ to write logged events to.
>>> Flush all pending log data in
>>> .Xr hwpmc 4 Ns Ap s
>>> buffers.
>>> +.It Fn pmc_close_logfile
>>> +Flush all pending log data and close
>>> +.Xr hwpmc 4 Ns Ap s
>>> +side of the stream.
>>> .It Fn pmc_writelog
>>> Append arbitrary user data to the current log file.
>>> .El
>>>
>>> Modified: head/lib/libpmc/pmc.h
>>> ==============================================================================
>>> --- head/lib/libpmc/pmc.h Tue Oct 18 14:05:18 2011 (r226513)
>>> +++ head/lib/libpmc/pmc.h Tue Oct 18 15:25:43 2011 (r226514)
>>> @@ -76,6 +76,7 @@ int pmc_attach(pmc_id_t _pmcid, pid_t _p
>>> int pmc_capabilities(pmc_id_t _pmc, uint32_t *_caps);
>>> int pmc_configure_logfile(int _fd);
>>> int pmc_flush_logfile(void);
>>> +int pmc_close_logfile(void);
>>> int pmc_detach(pmc_id_t _pmcid, pid_t _pid);
>>> int pmc_disable(int _cpu, int _pmc);
>>> int pmc_enable(int _cpu, int _pmc);
>>>
>>> Modified: head/lib/libpmc/pmc_configure_logfile.3
>>> ==============================================================================
>>> --- head/lib/libpmc/pmc_configure_logfile.3 Tue Oct 18 14:05:18 2011 (r226513)
>>> +++ head/lib/libpmc/pmc_configure_logfile.3 Tue Oct 18 15:25:43 2011 (r226514)
>>> @@ -29,7 +29,8 @@
>>> .Sh NAME
>>> .Nm pmc_configure_logfile ,
>>> .Nm pmc_flush_logfile ,
>>> -.Nm pmc_writelog
>>> +.Nm pmc_writelog ,
>>> +.Nm pmc_close_logfile
>>> .Nd log file management
>>> .Sh LIBRARY
>>> .Lb libpmc
>>> @@ -41,6 +42,8 @@
>>> .Fn pmc_flush_logfile void
>>> .Ft int
>>> .Fn pmc_writelog "uint32_t userdata"
>>> +.Ft int
>>> +.Fn pmc_close_logfile void
>>> .Sh DESCRIPTION
>>> The functions manage logging of
>>> .Xr hwpmc 4
>>> @@ -72,6 +75,12 @@ Function
>>> will append a log entry containing the value of argument
>>> .Fa userdata
>>> to the log file.
>>> +.Pp
>>> +Function
>>> +.Fn pmc_close_logfile
>>> +will flush all pending log data and close
>>> +.Xr hwpmc 4 Ns Ap s
>>> +side of the stream.
>>> .Sh RETURN VALUES
>>> .Rv -std
>>> .Sh ERRORS
>>>
>>> Modified: head/sys/dev/hwpmc/hwpmc_logging.c
>>> ==============================================================================
>>> --- head/sys/dev/hwpmc/hwpmc_logging.c Tue Oct 18 14:05:18 2011 (r226513)
>>> +++ head/sys/dev/hwpmc/hwpmc_logging.c Tue Oct 18 15:25:43 2011 (r226514)
>>> @@ -238,7 +238,7 @@ pmclog_get_buffer(struct pmc_owner *po)
>>> static void
>>> pmclog_loop(void *arg)
>>> {
>>> - int error, last_buffer;
>>> + int error;
>>> struct pmc_owner *po;
>>> struct pmclog_buffer *lb;
>>> struct proc *p;
>>> @@ -253,7 +253,6 @@ pmclog_loop(void *arg)
>>> p = po->po_owner;
>>> td = curthread;
>>> mycred = td->td_ucred;
>>> - last_buffer = 0;
>>>
>>> PROC_LOCK(p);
>>> ownercred = crhold(p->p_ucred);
>>> @@ -286,14 +285,22 @@ pmclog_loop(void *arg)
>>> if ((lb = TAILQ_FIRST(&po->po_logbuffers)) == NULL) {
>>> mtx_unlock_spin(&po->po_mtx);
>>>
>>> + if (po->po_flags & PMC_PO_SHUTDOWN) {
>>> + mtx_unlock(&pmc_kthread_mtx);
>>> + /*
>>> + * Close the file to get PMCLOG_EOF
>>> + * error in pmclog(3).
>>> + */
>>> + fo_close(po->po_file, curthread);
>>> + mtx_lock(&pmc_kthread_mtx);
>>> + }
>>> +
>>> (void) msleep(po, &pmc_kthread_mtx, PWAIT,
>>> "pmcloop", 0);
>>> continue;
>>> }
>>>
>>> TAILQ_REMOVE(&po->po_logbuffers, lb, plb_next);
>>> - if (po->po_flags & PMC_PO_SHUTDOWN)
>>> - last_buffer = TAILQ_EMPTY(&po->po_logbuffers);
>>> mtx_unlock_spin(&po->po_mtx);
>>> }
>>>
>>> @@ -336,14 +343,6 @@ pmclog_loop(void *arg)
>>> break;
>>> }
>>>
>>> - if (last_buffer) {
>>> - /*
>>> - * Close the file to get PMCLOG_EOF error
>>> - * in pmclog(3).
>>> - */
>>> - fo_close(po->po_file, curthread);
>>> - }
>>> -
>>> mtx_lock(&pmc_kthread_mtx);
>>>
>>> /* put the used buffer back into the global pool */
>>> @@ -693,6 +692,7 @@ int
>>> pmclog_flush(struct pmc_owner *po)
>>> {
>>> int error;
>>> + struct pmclog_buffer *lb;
>>>
>>> PMCDBG(LOG,FLS,1, "po=%p", po);
>>>
>>> @@ -715,11 +715,38 @@ pmclog_flush(struct pmc_owner *po)
>>> }
>>>
>>> /*
>>> - * Schedule the current buffer if any.
>>> + * Schedule the current buffer if any and not empty.
>>> + */
>>> + mtx_lock_spin(&po->po_mtx);
>>> + lb = po->po_curbuf;
>>> + if (lb && lb->plb_ptr != lb->plb_base) {
>>> + pmclog_schedule_io(po);
>>> + } else
>>> + error = ENOBUFS;
>>> + mtx_unlock_spin(&po->po_mtx);
>>> +
>>> + error:
>>> + mtx_unlock(&pmc_kthread_mtx);
>>> +
>>> + return (error);
>>> +}
>>> +
>>> +int
>>> +pmclog_close(struct pmc_owner *po)
>>> +{
>>> +
>>> + PMCDBG(LOG,CLO,1, "po=%p", po);
>>> +
>>> + mtx_lock(&pmc_kthread_mtx);
>>> +
>>> + /*
>>> + * Schedule the current buffer.
>>> */
>>> mtx_lock_spin(&po->po_mtx);
>>> if (po->po_curbuf)
>>> pmclog_schedule_io(po);
>>> + else
>>> + wakeup_one(po);
>>> mtx_unlock_spin(&po->po_mtx);
>>>
>>> /*
>>> @@ -728,13 +755,11 @@ pmclog_flush(struct pmc_owner *po)
>>> */
>>> po->po_flags |= PMC_PO_SHUTDOWN;
>>>
>>> - error:
>>> mtx_unlock(&pmc_kthread_mtx);
>>>
>>> - return (error);
>>> + return (0);
>>> }
>>>
>>> -
>>> void
>>> pmclog_process_callchain(struct pmc *pm, struct pmc_sample *ps)
>>> {
>>>
>>> Modified: head/sys/dev/hwpmc/hwpmc_mod.c
>>> ==============================================================================
>>> --- head/sys/dev/hwpmc/hwpmc_mod.c Tue Oct 18 14:05:18 2011 (r226513)
>>> +++ head/sys/dev/hwpmc/hwpmc_mod.c Tue Oct 18 15:25:43 2011 (r226514)
>>> @@ -2891,7 +2891,7 @@ pmc_syscall_handler(struct thread *td, v
>>> error = pmclog_configure_log(md, po, cl.pm_logfd);
>>> } else if (po->po_flags & PMC_PO_OWNS_LOGFILE) {
>>> pmclog_process_closelog(po);
>>> - error = pmclog_flush(po);
>>> + error = pmclog_close(po);
>>> if (error == 0) {
>>> LIST_FOREACH(pm, &po->po_pmcs, pm_next)
>>> if (pm->pm_flags & PMC_F_NEEDS_LOGFILE &&
>>> @@ -2907,7 +2907,6 @@ pmc_syscall_handler(struct thread *td, v
>>> }
>>> break;
>>>
>>> -
>>> /*
>>> * Flush a log file.
>>> */
>>> @@ -2928,6 +2927,25 @@ pmc_syscall_handler(struct thread *td, v
>>> break;
>>>
>>> /*
>>> + * Close a log file.
>>> + */
>>> +
>>> + case PMC_OP_CLOSELOG:
>>> + {
>>> + struct pmc_owner *po;
>>> +
>>> + sx_assert(&pmc_sx, SX_XLOCKED);
>>> +
>>> + if ((po = pmc_find_owner_descriptor(td->td_proc)) == NULL) {
>>> + error = EINVAL;
>>> + break;
>>> + }
>>> +
>>> + error = pmclog_close(po);
>>> + }
>>> + break;
>>> +
>>> + /*
>>> * Retrieve hardware configuration.
>>> */
>>>
>>>
>>> Modified: head/sys/sys/pmc.h
>>> ==============================================================================
>>> --- head/sys/sys/pmc.h Tue Oct 18 14:05:18 2011 (r226513)
>>> +++ head/sys/sys/pmc.h Tue Oct 18 15:25:43 2011 (r226514)
>>> @@ -302,7 +302,8 @@ enum pmc_event {
>>> __PMC_OP(PMCSETCOUNT, "Set initial count/sampling rate") \
>>> __PMC_OP(PMCSTART, "Start a PMC") \
>>> __PMC_OP(PMCSTOP, "Stop a PMC") \
>>> - __PMC_OP(WRITELOG, "Write a cookie to the log file")
>>> + __PMC_OP(WRITELOG, "Write a cookie to the log file") \
>>> + __PMC_OP(CLOSELOG, "Close log file")
>>>
>>>
>>> enum pmc_ops {
>>>
>>> Modified: head/sys/sys/pmclog.h
>>> ==============================================================================
>>> --- head/sys/sys/pmclog.h Tue Oct 18 14:05:18 2011 (r226513)
>>> +++ head/sys/sys/pmclog.h Tue Oct 18 15:25:43 2011 (r226514)
>>> @@ -243,6 +243,7 @@ int pmclog_configure_log(struct pmc_mdep
>>> int _logfd);
>>> int pmclog_deconfigure_log(struct pmc_owner *_po);
>>> int pmclog_flush(struct pmc_owner *_po);
>>> +int pmclog_close(struct pmc_owner *_po);
>>> void pmclog_initialize(void);
>>> void pmclog_process_callchain(struct pmc *_pm, struct pmc_sample *_ps);
>>> void pmclog_process_closelog(struct pmc_owner *po);
>>>
>>> Modified: head/usr.sbin/pmcstat/pmcstat.c
>>> ==============================================================================
>>> --- head/usr.sbin/pmcstat/pmcstat.c Tue Oct 18 14:05:18 2011 (r226513)
>>> +++ head/usr.sbin/pmcstat/pmcstat.c Tue Oct 18 15:25:43 2011 (r226514)
>>> @@ -552,7 +552,7 @@ main(int argc, char **argv)
>>> int hcpu, option, npmc, ncpu;
>>> int c, check_driver_stats, current_cpu, current_sampling_count;
>>> int do_callchain, do_descendants, do_logproccsw, do_logprocexit;
>>> - int do_print;
>>> + int do_print, do_read;
>>> size_t dummy;
>>> int graphdepth;
>>> int pipefd[2], rfd;
>>> @@ -1328,7 +1328,7 @@ main(int argc, char **argv)
>>> * are killed by a SIGINT.
>>> */
>>> runstate = PMCSTAT_RUNNING;
>>> - do_print = 0;
>>> + do_print = do_read = 0;
>>> do {
>>> if ((c = kevent(pmcstat_kq, NULL, 0, &kev, 1, NULL)) <= 0) {
>>> if (errno != EINTR)
>>> @@ -1351,8 +1351,10 @@ main(int argc, char **argv)
>>> (args.pa_flags & FLAG_DO_TOP)) {
>>> if (pmcstat_keypress_log())
>>> runstate = pmcstat_close_log();
>>> - } else
>>> + } else {
>>> + do_read = 0;
>>> runstate = pmcstat_process_log();
>>> + }
>>> break;
>>>
>>> case EVFILT_SIGNAL:
>>> @@ -1377,9 +1379,6 @@ main(int argc, char **argv)
>>> /* Kill the child process if we started it */
>>> if (args.pa_flags & FLAG_HAS_COMMANDLINE)
>>> pmcstat_kill_process();
>>> - /* Close the pipe to self, if present. */
>>> - if (args.pa_flags & FLAG_HAS_PIPE)
>>> - (void) close(pipefd[READPIPEFD]);
>>> runstate = pmcstat_close_log();
>>> } else if (kev.ident == SIGWINCH) {
>>> if (ioctl(fileno(args.pa_printfile),
>>> @@ -1394,12 +1393,15 @@ main(int argc, char **argv)
>>> break;
>>>
>>> case EVFILT_TIMER: /* print out counting PMCs */
>>> + if ((args.pa_flags & FLAG_DO_TOP) &&
>>> + pmc_flush_logfile() != ENOBUFS)
>>> + do_read = 1;
>>> do_print = 1;
>>> break;
>>>
>>> }
>>>
>>> - if (do_print) {
>>> + if (do_print && !do_read) {
>>> if ((args.pa_required & FLAG_HAS_OUTPUT_LOGFILE) == 0) {
>>> pmcstat_print_pmcs();
>>> if (runstate == PMCSTAT_FINISHED && /* final newline */
>>> @@ -1420,7 +1422,7 @@ main(int argc, char **argv)
>>>
>>> /* flush any pending log entries */
>>> if (args.pa_flags & (FLAG_HAS_OUTPUT_LOGFILE | FLAG_HAS_PIPE))
>>> - pmc_flush_logfile();
>>> + pmc_close_logfile();
>>>
>>> pmcstat_cleanup();
>>>
>>>
>>> Modified: head/usr.sbin/pmcstat/pmcstat_log.c
>>> ==============================================================================
>>> --- head/usr.sbin/pmcstat/pmcstat_log.c Tue Oct 18 14:05:18 2011 (r226513)
>>> +++ head/usr.sbin/pmcstat/pmcstat_log.c Tue Oct 18 15:25:43 2011 (r226514)
>>> @@ -1702,7 +1702,7 @@ pmcstat_close_log(void)
>>> * so keep the status to EXITING.
>>> */
>>> if (args.pa_logfd != -1) {
>>> - if (pmc_flush_logfile() < 0)
>>> + if (pmc_close_logfile() < 0)
>>> err(EX_OSERR, "ERROR: logging failed");
>>> }
>>>
>>
>> --
>> Bjoern A. Zeeb You have to have visions!
>> Stop bit received. Insert coin for new address family.
>>
>
> --
> Fabien Thomas
>
>
>
>
--
Bjoern A. Zeeb You have to have visions!
Stop bit received. Insert coin for new address family.
More information about the svn-src-head
mailing list