2005-04-17 02:20:36 +04:00
/**
* @ file oprofile_stats . c
*
* @ remark Copyright 2002 OProfile authors
* @ remark Read the file COPYING
*
* @ author John Levon
*/
# include <linux/oprofile.h>
# include <linux/smp.h>
# include <linux/cpumask.h>
# include <linux/threads.h>
2008-10-16 17:01:40 +04:00
2005-04-17 02:20:36 +04:00
# include "oprofile_stats.h"
# include "cpu_buffer.h"
2008-10-16 17:01:40 +04:00
2005-04-17 02:20:36 +04:00
struct oprofile_stat_struct oprofile_stats ;
2008-10-16 17:01:40 +04:00
2005-04-17 02:20:36 +04:00
void oprofile_reset_stats ( void )
{
2008-09-05 19:12:36 +04:00
struct oprofile_cpu_buffer * cpu_buf ;
2005-04-17 02:20:36 +04:00
int i ;
2008-10-16 17:01:40 +04:00
2006-03-28 13:56:38 +04:00
for_each_possible_cpu ( i ) {
2009-10-29 16:34:13 +03:00
cpu_buf = & per_cpu ( op_cpu_buffer , i ) ;
2005-04-17 02:20:36 +04:00
cpu_buf - > sample_received = 0 ;
cpu_buf - > sample_lost_overflow = 0 ;
2007-11-15 03:58:48 +03:00
cpu_buf - > backtrace_aborted = 0 ;
cpu_buf - > sample_invalid_eip = 0 ;
2005-04-17 02:20:36 +04:00
}
2008-10-16 17:01:40 +04:00
2005-04-17 02:20:36 +04:00
atomic_set ( & oprofile_stats . sample_lost_no_mm , 0 ) ;
atomic_set ( & oprofile_stats . sample_lost_no_mapping , 0 ) ;
atomic_set ( & oprofile_stats . event_lost_overflow , 0 ) ;
2009-05-27 19:15:08 +04:00
atomic_set ( & oprofile_stats . bt_lost_no_mapping , 0 ) ;
2009-07-09 16:56:25 +04:00
atomic_set ( & oprofile_stats . multiplex_counter , 0 ) ;
2005-04-17 02:20:36 +04:00
}
2008-09-05 19:12:36 +04:00
void oprofile_create_stats_files ( struct super_block * sb , struct dentry * root )
2005-04-17 02:20:36 +04:00
{
2008-09-05 19:12:36 +04:00
struct oprofile_cpu_buffer * cpu_buf ;
struct dentry * cpudir ;
struct dentry * dir ;
2005-04-17 02:20:36 +04:00
char buf [ 10 ] ;
int i ;
dir = oprofilefs_mkdir ( sb , root , " stats " ) ;
if ( ! dir )
return ;
2006-03-28 13:56:38 +04:00
for_each_possible_cpu ( i ) {
2009-10-29 16:34:13 +03:00
cpu_buf = & per_cpu ( op_cpu_buffer , i ) ;
2005-04-17 02:20:36 +04:00
snprintf ( buf , 10 , " cpu%d " , i ) ;
cpudir = oprofilefs_mkdir ( sb , dir , buf ) ;
2008-10-16 17:01:40 +04:00
2005-04-17 02:20:36 +04:00
/* Strictly speaking access to these ulongs is racy,
* but we can ' t simply lock them , and they are
* informational only .
*/
oprofilefs_create_ro_ulong ( sb , cpudir , " sample_received " ,
& cpu_buf - > sample_received ) ;
oprofilefs_create_ro_ulong ( sb , cpudir , " sample_lost_overflow " ,
& cpu_buf - > sample_lost_overflow ) ;
oprofilefs_create_ro_ulong ( sb , cpudir , " backtrace_aborted " ,
& cpu_buf - > backtrace_aborted ) ;
2007-11-15 03:58:48 +03:00
oprofilefs_create_ro_ulong ( sb , cpudir , " sample_invalid_eip " ,
& cpu_buf - > sample_invalid_eip ) ;
2005-04-17 02:20:36 +04:00
}
2008-10-16 17:01:40 +04:00
2005-04-17 02:20:36 +04:00
oprofilefs_create_ro_atomic ( sb , dir , " sample_lost_no_mm " ,
& oprofile_stats . sample_lost_no_mm ) ;
oprofilefs_create_ro_atomic ( sb , dir , " sample_lost_no_mapping " ,
& oprofile_stats . sample_lost_no_mapping ) ;
oprofilefs_create_ro_atomic ( sb , dir , " event_lost_overflow " ,
& oprofile_stats . event_lost_overflow ) ;
oprofilefs_create_ro_atomic ( sb , dir , " bt_lost_no_mapping " ,
& oprofile_stats . bt_lost_no_mapping ) ;
2009-07-08 15:49:38 +04:00
# ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX
oprofilefs_create_ro_atomic ( sb , dir , " multiplex_counter " ,
2009-07-09 16:56:25 +04:00
& oprofile_stats . multiplex_counter ) ;
2009-07-08 15:49:38 +04:00
# endif
2005-04-17 02:20:36 +04:00
}