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. _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"