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-head mailing list