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"

Reply via email to