13 #define KMSG_COMPONENT "dasd"
15 #include <linux/ctype.h>
16 #include <linux/slab.h>
17 #include <linux/string.h>
22 #include <asm/debug.h>
23 #include <asm/uaccess.h>
26 #define PRINTK_HEADER "dasd_proc:"
45 block = device->
block;
47 dasd_put_device(device);
73 switch (device->
state) {
89 if (dasd_check_blocksize(block->
bp_block))
93 "at blocksize: %d, %lld blocks, %lld MB",
102 dasd_put_device(device);
109 static void *dasd_devices_start(
struct seq_file *
m, loff_t *
pos)
113 return (
void *)((
unsigned long) *pos + 1);
116 static void *dasd_devices_next(
struct seq_file *m,
void *
v, loff_t *pos)
119 return dasd_devices_start(m, pos);
122 static void dasd_devices_stop(
struct seq_file *m,
void *
v)
127 .start = dasd_devices_start,
128 .next = dasd_devices_next,
129 .stop = dasd_devices_stop,
130 .show = dasd_devices_show,
135 return seq_open(file, &dasd_devices_seq_ops);
140 .open = dasd_devices_open,
146 #ifdef CONFIG_DASD_PROFILE
147 static int dasd_stats_all_block_on(
void)
159 dasd_put_device(device);
166 static void dasd_stats_all_block_off(
void)
177 dasd_put_device(device);
181 static void dasd_stats_all_block_reset(
void)
192 dasd_put_device(device);
196 static void dasd_statistics_array(
struct seq_file *m,
unsigned int *array,
int factor)
200 for (i = 0; i < 32; i++) {
209 static int dasd_stats_proc_show(
struct seq_file *m,
void *
v)
211 #ifdef CONFIG_DASD_PROFILE
217 seq_printf(m,
"Statistics are off - they might be "
218 "switched on using 'echo set on > "
219 "/proc/dasd/statistics'\n");
225 for (factor = 1; (prof->
dasd_io_reqs / factor) > 9999999;
231 seq_printf(m,
"Scale Factor is %d\n", factor);
233 " __<4 ___8 __16 __32 __64 _128 "
234 " _256 _512 __1k __2k __4k __8k "
235 " _16k _32k _64k 128k\n");
237 " _256 _512 __1M __2M __4M __8M "
238 " _16M _32M _64M 128M 256M 512M "
239 " __1G __2G __4G " " _>4G\n");
241 seq_printf(m,
"Histogram of sizes (512B secs)\n");
243 seq_printf(m,
"Histogram of I/O times (microseconds)\n");
245 seq_printf(m,
"Histogram of I/O times per sector\n");
247 seq_printf(m,
"Histogram of I/O time till ssch\n");
249 seq_printf(m,
"Histogram of I/O time between ssch and irq\n");
251 seq_printf(m,
"Histogram of I/O time between ssch "
252 "and irq per sector\n");
254 seq_printf(m,
"Histogram of I/O time between irq and end\n");
256 seq_printf(m,
"# of req in chanq at enqueuing (1..32) \n");
259 seq_printf(m,
"Statistics are not activated in this kernel\n");
270 const char __user *user_buf,
size_t user_len, loff_t *pos)
272 #ifdef CONFIG_DASD_PROFILE
276 if (user_len > 65536)
280 return PTR_ERR(buffer);
287 if (
strcmp(str,
"on") == 0) {
289 rc = dasd_stats_all_block_on();
291 dasd_stats_all_block_off();
296 pr_info(
"The statistics feature has been switched "
298 }
else if (
strcmp(str,
"off") == 0) {
302 dasd_stats_all_block_off();
303 pr_info(
"The statistics feature has been switched "
306 goto out_parse_error;
307 }
else if (
strncmp(str,
"reset", 5) == 0) {
310 dasd_stats_all_block_reset();
311 pr_info(
"The statistics have been reset\n");
313 goto out_parse_error;
318 pr_warning(
"%s is not a supported value for /proc/dasd/statistics\n",
324 pr_warning(
"/proc/dasd/statistics: is not activated in this kernel\n");
331 .open = dasd_stats_proc_open,
335 .write = dasd_stats_proc_write,
346 if (!dasd_proc_root_entry)
348 dasd_devices_entry = proc_create(
"devices",
350 dasd_proc_root_entry,
351 &dasd_devices_file_ops);
352 if (!dasd_devices_entry)
354 dasd_statistics_entry = proc_create(
"statistics",
356 dasd_proc_root_entry,
357 &dasd_stats_proc_fops);
358 if (!dasd_statistics_entry)
359 goto out_nostatistics;