18c2ecf20Sopenharmony_ci/** 28c2ecf20Sopenharmony_ci * @file oprofile_stats.c 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * @remark Copyright 2002 OProfile authors 58c2ecf20Sopenharmony_ci * @remark Read the file COPYING 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * @author John Levon 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/oprofile.h> 118c2ecf20Sopenharmony_ci#include <linux/smp.h> 128c2ecf20Sopenharmony_ci#include <linux/cpumask.h> 138c2ecf20Sopenharmony_ci#include <linux/threads.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#include "oprofile_stats.h" 168c2ecf20Sopenharmony_ci#include "cpu_buffer.h" 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cistruct oprofile_stat_struct oprofile_stats; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_civoid oprofile_reset_stats(void) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci struct oprofile_cpu_buffer *cpu_buf; 238c2ecf20Sopenharmony_ci int i; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci for_each_possible_cpu(i) { 268c2ecf20Sopenharmony_ci cpu_buf = &per_cpu(op_cpu_buffer, i); 278c2ecf20Sopenharmony_ci cpu_buf->sample_received = 0; 288c2ecf20Sopenharmony_ci cpu_buf->sample_lost_overflow = 0; 298c2ecf20Sopenharmony_ci cpu_buf->backtrace_aborted = 0; 308c2ecf20Sopenharmony_ci cpu_buf->sample_invalid_eip = 0; 318c2ecf20Sopenharmony_ci } 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci atomic_set(&oprofile_stats.sample_lost_no_mm, 0); 348c2ecf20Sopenharmony_ci atomic_set(&oprofile_stats.sample_lost_no_mapping, 0); 358c2ecf20Sopenharmony_ci atomic_set(&oprofile_stats.event_lost_overflow, 0); 368c2ecf20Sopenharmony_ci atomic_set(&oprofile_stats.bt_lost_no_mapping, 0); 378c2ecf20Sopenharmony_ci atomic_set(&oprofile_stats.multiplex_counter, 0); 388c2ecf20Sopenharmony_ci} 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_civoid oprofile_create_stats_files(struct dentry *root) 428c2ecf20Sopenharmony_ci{ 438c2ecf20Sopenharmony_ci struct oprofile_cpu_buffer *cpu_buf; 448c2ecf20Sopenharmony_ci struct dentry *cpudir; 458c2ecf20Sopenharmony_ci struct dentry *dir; 468c2ecf20Sopenharmony_ci char buf[10]; 478c2ecf20Sopenharmony_ci int i; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci dir = oprofilefs_mkdir(root, "stats"); 508c2ecf20Sopenharmony_ci if (!dir) 518c2ecf20Sopenharmony_ci return; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci for_each_possible_cpu(i) { 548c2ecf20Sopenharmony_ci cpu_buf = &per_cpu(op_cpu_buffer, i); 558c2ecf20Sopenharmony_ci snprintf(buf, 10, "cpu%d", i); 568c2ecf20Sopenharmony_ci cpudir = oprofilefs_mkdir(dir, buf); 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci /* Strictly speaking access to these ulongs is racy, 598c2ecf20Sopenharmony_ci * but we can't simply lock them, and they are 608c2ecf20Sopenharmony_ci * informational only. 618c2ecf20Sopenharmony_ci */ 628c2ecf20Sopenharmony_ci oprofilefs_create_ro_ulong(cpudir, "sample_received", 638c2ecf20Sopenharmony_ci &cpu_buf->sample_received); 648c2ecf20Sopenharmony_ci oprofilefs_create_ro_ulong(cpudir, "sample_lost_overflow", 658c2ecf20Sopenharmony_ci &cpu_buf->sample_lost_overflow); 668c2ecf20Sopenharmony_ci oprofilefs_create_ro_ulong(cpudir, "backtrace_aborted", 678c2ecf20Sopenharmony_ci &cpu_buf->backtrace_aborted); 688c2ecf20Sopenharmony_ci oprofilefs_create_ro_ulong(cpudir, "sample_invalid_eip", 698c2ecf20Sopenharmony_ci &cpu_buf->sample_invalid_eip); 708c2ecf20Sopenharmony_ci } 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci oprofilefs_create_ro_atomic(dir, "sample_lost_no_mm", 738c2ecf20Sopenharmony_ci &oprofile_stats.sample_lost_no_mm); 748c2ecf20Sopenharmony_ci oprofilefs_create_ro_atomic(dir, "sample_lost_no_mapping", 758c2ecf20Sopenharmony_ci &oprofile_stats.sample_lost_no_mapping); 768c2ecf20Sopenharmony_ci oprofilefs_create_ro_atomic(dir, "event_lost_overflow", 778c2ecf20Sopenharmony_ci &oprofile_stats.event_lost_overflow); 788c2ecf20Sopenharmony_ci oprofilefs_create_ro_atomic(dir, "bt_lost_no_mapping", 798c2ecf20Sopenharmony_ci &oprofile_stats.bt_lost_no_mapping); 808c2ecf20Sopenharmony_ci#ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX 818c2ecf20Sopenharmony_ci oprofilefs_create_ro_atomic(dir, "multiplex_counter", 828c2ecf20Sopenharmony_ci &oprofile_stats.multiplex_counter); 838c2ecf20Sopenharmony_ci#endif 848c2ecf20Sopenharmony_ci} 85