void oprofile_create_stats_files(struct super_block * sb, struct dentry * root) { struct oprofile_cpu_buffer * cpu_buf; struct dentry * cpudir; struct dentry * dir; char buf[10]; int i; dir = oprofilefs_mkdir(sb, root, "stats"); if (!dir) return; for_each_cpu(i) { cpu_buf = &cpu_buffer[i]; snprintf(buf, 10, "cpu%d", i); cpudir = oprofilefs_mkdir(sb, dir, buf); /* 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_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); }
static int oprofile_create_hwsampling_files(struct super_block *sb, struct dentry *root) { struct dentry *hw_dir; /* reinitialize default values */ hwsampler_file = 1; hw_dir = oprofilefs_mkdir(sb, root, "hwsampling"); if (!hw_dir) return -EINVAL; oprofilefs_create_file(sb, hw_dir, "hwsampler", &hwsampler_fops); oprofilefs_create_ulong(sb, hw_dir, "hw_interval", &oprofile_hw_interval); oprofilefs_create_ro_ulong(sb, hw_dir, "hw_min_interval", &oprofile_min_interval); oprofilefs_create_ro_ulong(sb, hw_dir, "hw_max_interval", &oprofile_max_interval); oprofilefs_create_ulong(sb, hw_dir, "hw_sdbt_blocks", &oprofile_sdbt_blocks); return 0; }
static int oprofile_create_hwsampling_files(struct dentry *root) { struct dentry *dir; dir = oprofilefs_mkdir(root, "timer"); if (!dir) return -EINVAL; oprofilefs_create_file(dir, "enabled", &timer_enabled_fops); if (!hwsampler_available) return 0; /* reinitialize default values */ hwsampler_enabled = 1; counter_config.kernel = 1; counter_config.user = 1; if (!force_cpu_type) { /* * Create the counter file system. A single virtual * counter is created which can be used to * enable/disable hardware sampling dynamically from * user space. The user space will configure a single * counter with a single event. The value of 'event' * and 'unit_mask' are not evaluated by the kernel code * and can only be set to 0. */ dir = oprofilefs_mkdir(root, "0"); if (!dir) return -EINVAL; oprofilefs_create_file(dir, "enabled", &hwsampler_fops); oprofilefs_create_file(dir, "event", &zero_fops); oprofilefs_create_file(dir, "count", &hw_interval_fops); oprofilefs_create_file(dir, "unit_mask", &zero_fops); oprofilefs_create_file(dir, "kernel", &kernel_fops); oprofilefs_create_file(dir, "user", &user_fops); oprofilefs_create_ulong(dir, "hw_sdbt_blocks", &oprofile_sdbt_blocks); } else { /* * Hardware sampling can be used but the cpu_type is * forced to timer in order to deal with legacy user * space tools. The /dev/oprofile/hwsampling fs is * provided in that case. */ dir = oprofilefs_mkdir(root, "hwsampling"); if (!dir) return -EINVAL; oprofilefs_create_file(dir, "hwsampler", &hwsampler_fops); oprofilefs_create_file(dir, "hw_interval", &hw_interval_fops); oprofilefs_create_ro_ulong(dir, "hw_min_interval", &oprofile_min_interval); oprofilefs_create_ro_ulong(dir, "hw_max_interval", &oprofile_max_interval); oprofilefs_create_ulong(dir, "hw_sdbt_blocks", &oprofile_sdbt_blocks); } return 0; }