1/** 2 * @file oprofile_stats.c 3 * 4 * @remark Copyright 2002 OProfile authors 5 * @remark Read the file COPYING 6 * 7 * @author John Levon 8 */ 9 10#include <linux/oprofile.h> 11#include <linux/smp.h> 12#include <linux/cpumask.h> 13#include <linux/threads.h> 14 15#include "oprofile_stats.h" 16#include "cpu_buffer.h" 17 18struct oprofile_stat_struct oprofile_stats; 19 20void oprofile_reset_stats(void) 21{ 22 struct oprofile_cpu_buffer *cpu_buf; 23 int i; 24 25 for_each_possible_cpu(i) { 26 cpu_buf = &per_cpu(op_cpu_buffer, i); 27 cpu_buf->sample_received = 0; 28 cpu_buf->sample_lost_overflow = 0; 29 cpu_buf->backtrace_aborted = 0; 30 cpu_buf->sample_invalid_eip = 0; 31 } 32 33 atomic_set(&oprofile_stats.sample_lost_no_mm, 0); 34 atomic_set(&oprofile_stats.sample_lost_no_mapping, 0); 35 atomic_set(&oprofile_stats.event_lost_overflow, 0); 36 atomic_set(&oprofile_stats.bt_lost_no_mapping, 0); 37 atomic_set(&oprofile_stats.multiplex_counter, 0); 38} 39 40 41void oprofile_create_stats_files(struct dentry *root) 42{ 43 struct oprofile_cpu_buffer *cpu_buf; 44 struct dentry *cpudir; 45 struct dentry *dir; 46 char buf[10]; 47 int i; 48 49 dir = oprofilefs_mkdir(root, "stats"); 50 if (!dir) 51 return; 52 53 for_each_possible_cpu(i) { 54 cpu_buf = &per_cpu(op_cpu_buffer, i); 55 snprintf(buf, 10, "cpu%d", i); 56 cpudir = oprofilefs_mkdir(dir, buf); 57 58 /* Strictly speaking access to these ulongs is racy, 59 * but we can't simply lock them, and they are 60 * informational only. 61 */ 62 oprofilefs_create_ro_ulong(cpudir, "sample_received", 63 &cpu_buf->sample_received); 64 oprofilefs_create_ro_ulong(cpudir, "sample_lost_overflow", 65 &cpu_buf->sample_lost_overflow); 66 oprofilefs_create_ro_ulong(cpudir, "backtrace_aborted", 67 &cpu_buf->backtrace_aborted); 68 oprofilefs_create_ro_ulong(cpudir, "sample_invalid_eip", 69 &cpu_buf->sample_invalid_eip); 70 } 71 72 oprofilefs_create_ro_atomic(dir, "sample_lost_no_mm", 73 &oprofile_stats.sample_lost_no_mm); 74 oprofilefs_create_ro_atomic(dir, "sample_lost_no_mapping", 75 &oprofile_stats.sample_lost_no_mapping); 76 oprofilefs_create_ro_atomic(dir, "event_lost_overflow", 77 &oprofile_stats.event_lost_overflow); 78 oprofilefs_create_ro_atomic(dir, "bt_lost_no_mapping", 79 &oprofile_stats.bt_lost_no_mapping); 80#ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX 81 oprofilefs_create_ro_atomic(dir, "multiplex_counter", 82 &oprofile_stats.multiplex_counter); 83#endif 84} 85