svn commit: r226514 - in head: lib/libpmc sys/dev/hwpmc sys/sys
usr.sbin/pmcstat
Bjoern A. Zeeb
bzeeb-lists at lists.zabbadoz.net
Tue Oct 18 16:23:52 UTC 2011
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.
More information about the svn-src-all
mailing list