static int nmi_create_files(struct dentry *root) { unsigned int i; for (i = 0; i < model->num_virt_counters; ++i) { struct dentry *dir; char buf[4]; /* quick little hack to _not_ expose a counter if it is not * available for use. This should protect userspace app. * NOTE: assumes 1:1 mapping here (that counters are organized * sequentially in their struct assignment). */ if (!avail_to_resrv_perfctr_nmi_bit(op_x86_virt_to_phys(i))) continue; snprintf(buf, sizeof(buf), "%d", i); dir = oprofilefs_mkdir(root, buf); oprofilefs_create_ulong(dir, "enabled", &counter_config[i].enabled); oprofilefs_create_ulong(dir, "event", &counter_config[i].event); oprofilefs_create_ulong(dir, "count", &counter_config[i].count); oprofilefs_create_ulong(dir, "unit_mask", &counter_config[i].unit_mask); oprofilefs_create_ulong(dir, "kernel", &counter_config[i].kernel); oprofilefs_create_ulong(dir, "user", &counter_config[i].user); oprofilefs_create_ulong(dir, "extra", &counter_config[i].extra); } return 0; }
void oprofile_create_files(struct super_block * sb, struct dentry * root) { oprofilefs_create_file(sb, root, "enable", &enable_fops); oprofilefs_create_file_perm(sb, root, "dump", &dump_fops, 0666); #ifdef CONFIG_XEN oprofilefs_create_file(sb, root, "active_domains", &active_domain_ops); #endif oprofilefs_create_file(sb, root, "buffer", &event_buffer_fops); oprofilefs_create_ulong(sb, root, "buffer_size", &fs_buffer_size); oprofilefs_create_ulong(sb, root, "buffer_watershed", &fs_buffer_watershed); oprofilefs_create_ulong(sb, root, "cpu_buffer_size", &fs_cpu_buffer_size); oprofilefs_create_file(sb, root, "cpu_type", &cpu_type_fops); oprofilefs_create_file(sb, root, "backtrace_depth", &depth_fops); oprofilefs_create_file(sb, root, "pointer_size", &pointer_size_fops); oprofile_create_stats_files(sb, root); if (oprofile_ops.create_files) oprofile_ops.create_files(sb, root); }
static int op_sh_create_files(struct super_block *sb, struct dentry *root) { int i, ret = 0; for (i = 0; i < model->num_counters; i++) { struct dentry *dir; char buf[4]; snprintf(buf, sizeof(buf), "%d", i); dir = oprofilefs_mkdir(sb, root, buf); ret |= oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); ret |= oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); ret |= oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); ret |= oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); if (model->create_files) ret |= model->create_files(sb, dir); else ret |= oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); /* Dummy entries */ ret |= oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); } return ret; }
static int xenoprof_create_files(struct super_block * sb, struct dentry * root) { unsigned int i; for (i = 0; i < num_events; ++i) { struct dentry * dir; char buf[2]; snprintf(buf, 2, "%d", i); dir = oprofilefs_mkdir(sb, root, buf); oprofilefs_create_ulong(sb, dir, "enabled", &counter_config[i].enabled); oprofilefs_create_ulong(sb, dir, "event", &counter_config[i].event); oprofilefs_create_ulong(sb, dir, "count", &counter_config[i].count); oprofilefs_create_ulong(sb, dir, "unit_mask", &counter_config[i].unit_mask); oprofilefs_create_ulong(sb, dir, "kernel", &counter_config[i].kernel); oprofilefs_create_ulong(sb, dir, "user", &counter_config[i].user); } return 0; }
static int op_bfin_create_files(struct super_block *sb, struct dentry *root) { int i; for (i = 0; i < model->num_counters; ++i) { struct dentry *dir; char buf[3]; printk(KERN_INFO "Oprofile: creating files... \n"); snprintf(buf, sizeof buf, "%d", i); dir = oprofilefs_mkdir(sb, root, buf); oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); /* * We dont support per counter user/kernel selection, but * we leave the entries because userspace expects them */ oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); } return 0; }
static int sh7750_perf_counter_create_files(struct super_block *sb, struct dentry *root) { int i; for (i = 0; i < NR_CNTRS; i++) { struct dentry *dir; char buf[4]; snprintf(buf, sizeof(buf), "%d", i); dir = oprofilefs_mkdir(sb, root, buf); oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); oprofilefs_create_file(sb, dir, "count", &count_fops); /* Dummy entries */ oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); } return 0; }
void oprofile_create_files(struct super_block *sb, struct dentry *root) { oprofile_buffer_size = BUFFER_SIZE_DEFAULT; oprofile_cpu_buffer_size = CPU_BUFFER_SIZE_DEFAULT; oprofile_buffer_watershed = BUFFER_WATERSHED_DEFAULT; oprofile_time_slice = msecs_to_jiffies(TIME_SLICE_DEFAULT); oprofilefs_create_file(sb, root, "enable", &enable_fops); oprofilefs_create_file_perm(sb, root, "dump", &dump_fops, 0666); oprofilefs_create_file(sb, root, "buffer", &event_buffer_fops); oprofilefs_create_ulong(sb, root, "buffer_size", &oprofile_buffer_size); oprofilefs_create_ulong(sb, root, "buffer_watershed", &oprofile_buffer_watershed); oprofilefs_create_ulong(sb, root, "cpu_buffer_size", &oprofile_cpu_buffer_size); oprofilefs_create_file(sb, root, "cpu_type", &cpu_type_fops); oprofilefs_create_file(sb, root, "backtrace_depth", &depth_fops); oprofilefs_create_file(sb, root, "pointer_size", &pointer_size_fops); #ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX oprofilefs_create_file(sb, root, "time_slice", &timeout_fops); #endif oprofile_create_stats_files(sb, root); if (oprofile_ops.create_files) oprofile_ops.create_files(sb, root); }
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 op_mips_create_files(struct super_block *sb, struct dentry *root) { int i; for (i = 0; i < model->num_counters; ++i) { struct dentry *dir; char buf[4]; snprintf(buf, sizeof buf, "%d", i); dir = oprofilefs_mkdir(sb, root, buf); oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); oprofilefs_create_ulong(sb, dir, "exl", &ctr[i].exl); /* Dummy. */ oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); } return 0; }
static int op_arm_create_files(struct super_block *sb, struct dentry *root) { unsigned int i; for (i = 0; i < op_arm_model->num_counters; i++) { struct dentry *dir; char buf[4]; snprintf(buf, sizeof buf, "%d", i); dir = oprofilefs_mkdir(sb, root, buf); oprofilefs_create_ulong(sb, dir, "enabled", &counter_config[i].enabled); oprofilefs_create_ulong(sb, dir, "event", &counter_config[i].event); oprofilefs_create_ulong(sb, dir, "count", &counter_config[i].count); oprofilefs_create_ulong(sb, dir, "unit_mask", &counter_config[i].unit_mask); oprofilefs_create_ulong(sb, dir, "kernel", &counter_config[i].kernel); oprofilefs_create_ulong(sb, dir, "user", &counter_config[i].user); } return 0; }
static int nmi_create_files(struct super_block *sb, struct dentry *root) { unsigned int i; for (i = 0; i < model->num_virt_counters; ++i) { struct dentry *dir; char buf[4]; if (!avail_to_resrv_perfctr_nmi_bit(op_x86_virt_to_phys(i))) continue; snprintf(buf, sizeof(buf), "%d", i); dir = oprofilefs_mkdir(sb, root, buf); oprofilefs_create_ulong(sb, dir, "enabled", &counter_config[i].enabled); oprofilefs_create_ulong(sb, dir, "event", &counter_config[i].event); oprofilefs_create_ulong(sb, dir, "count", &counter_config[i].count); oprofilefs_create_ulong(sb, dir, "unit_mask", &counter_config[i].unit_mask); oprofilefs_create_ulong(sb, dir, "kernel", &counter_config[i].kernel); oprofilefs_create_ulong(sb, dir, "user", &counter_config[i].user); oprofilefs_create_ulong(sb, dir, "extra", &counter_config[i].extra); } return 0; }
static int op_powerpc_create_files(struct super_block *sb, struct dentry *root) { int i; #ifdef CONFIG_PPC64 /* * There is one mmcr0, mmcr1 and mmcra for setting the events for * all of the counters. */ oprofilefs_create_ulong(sb, root, "mmcr0", &sys.mmcr0); oprofilefs_create_ulong(sb, root, "mmcr1", &sys.mmcr1); oprofilefs_create_ulong(sb, root, "mmcra", &sys.mmcra); #ifdef CONFIG_OPROFILE_CELL /* create a file the user tool can check to see what level of profiling * support exits with this kernel. Initialize bit mask to indicate * what support the kernel has: * bit 0 - Supports SPU event profiling in addition to PPU * event and cycles; and SPU cycle profiling * bits 1-31 - Currently unused. * * If the file does not exist, then the kernel only supports SPU * cycle profiling, PPU event and cycle profiling. */ oprofilefs_create_ulong(sb, root, "cell_support", &sys.cell_support); sys.cell_support = 0x1; /* Note, the user OProfile tool must check * that this bit is set before attempting to * user SPU event profiling. Older kernels * will not have this file, hence the user * tool is not allowed to do SPU event * profiling on older kernels. Older kernels * will accept SPU events but collected data * is garbage. */ #endif #endif for (i = 0; i < model->num_counters; ++i) { struct dentry *dir; char buf[4]; snprintf(buf, sizeof buf, "%d", i); dir = oprofilefs_mkdir(sb, root, buf); oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); /* * Classic PowerPC doesn't support per-counter * control like this, but the options are * expected, so they remain. For Freescale * Book-E style performance monitors, we do * support them. */ oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); } oprofilefs_create_ulong(sb, root, "enable_kernel", &sys.enable_kernel); oprofilefs_create_ulong(sb, root, "enable_user", &sys.enable_user); /* Default to tracing both kernel and user */ sys.enable_kernel = 1; sys.enable_user = 1; 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; }
static int op_powerpc_create_files(struct super_block *sb, struct dentry *root) { int i; #ifdef CONFIG_PPC64 oprofilefs_create_ulong(sb, root, "mmcr0", &sys.mmcr0); oprofilefs_create_ulong(sb, root, "mmcr1", &sys.mmcr1); oprofilefs_create_ulong(sb, root, "mmcra", &sys.mmcra); #ifdef CONFIG_OPROFILE_CELL oprofilefs_create_ulong(sb, root, "cell_support", &sys.cell_support); sys.cell_support = 0x1; #endif #endif for (i = 0; i < model->num_counters; ++i) { struct dentry *dir; char buf[4]; snprintf(buf, sizeof buf, "%d", i); dir = oprofilefs_mkdir(sb, root, buf); oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); } oprofilefs_create_ulong(sb, root, "enable_kernel", &sys.enable_kernel); oprofilefs_create_ulong(sb, root, "enable_user", &sys.enable_user); sys.enable_kernel = 1; sys.enable_user = 1; return 0; }
static int op_powerpc_create_files(struct super_block *sb, struct dentry *root) { int i; #ifdef CONFIG_PPC64 /* * There is one mmcr0, mmcr1 and mmcra for setting the events for * all of the counters. */ oprofilefs_create_ulong(sb, root, "mmcr0", &sys.mmcr0); oprofilefs_create_ulong(sb, root, "mmcr1", &sys.mmcr1); oprofilefs_create_ulong(sb, root, "mmcra", &sys.mmcra); #endif for (i = 0; i < model->num_counters; ++i) { struct dentry *dir; char buf[4]; snprintf(buf, sizeof buf, "%d", i); dir = oprofilefs_mkdir(sb, root, buf); oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); /* * Classic PowerPC doesn't support per-counter * control like this, but the options are * expected, so they remain. For Freescale * Book-E style performance monitors, we do * support them. */ oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); } oprofilefs_create_ulong(sb, root, "enable_kernel", &sys.enable_kernel); oprofilefs_create_ulong(sb, root, "enable_user", &sys.enable_user); /* Default to tracing both kernel and user */ sys.enable_kernel = 1; sys.enable_user = 1; return 0; }