Commit b465fc74 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] convert /proc/stat to seq_file

From: "Randy.Dunlap" <rddunlap@osdl.org>

Anton needs this for ppc64.  Things overflow with a huge number of CPUs.
parent ad1ee2b1
...@@ -356,10 +356,9 @@ static struct file_operations proc_slabinfo_operations = { ...@@ -356,10 +356,9 @@ static struct file_operations proc_slabinfo_operations = {
.release = seq_release, .release = seq_release,
}; };
static int kstat_read_proc(char *page, char **start, off_t off, int show_stat(struct seq_file *p, void *v)
int count, int *eof, void *data)
{ {
int i, len; int i;
extern unsigned long total_forks; extern unsigned long total_forks;
u64 jif; u64 jif;
unsigned int sum = 0, user = 0, nice = 0, system = 0, idle = 0, iowait = 0, irq = 0, softirq = 0; unsigned int sum = 0, user = 0, nice = 0, system = 0, idle = 0, iowait = 0, irq = 0, softirq = 0;
...@@ -379,10 +378,10 @@ static int kstat_read_proc(char *page, char **start, off_t off, ...@@ -379,10 +378,10 @@ static int kstat_read_proc(char *page, char **start, off_t off,
jif = ((u64)now.tv_sec * HZ) + (now.tv_usec/(1000000/HZ)) - jif; jif = ((u64)now.tv_sec * HZ) + (now.tv_usec/(1000000/HZ)) - jif;
do_div(jif, HZ); do_div(jif, HZ);
for (i = 0 ; i < NR_CPUS; i++) { for (i = 0; i < NR_CPUS; i++) {
int j; int j;
if(!cpu_online(i)) continue; if (!cpu_online(i)) continue;
user += kstat_cpu(i).cpustat.user; user += kstat_cpu(i).cpustat.user;
nice += kstat_cpu(i).cpustat.nice; nice += kstat_cpu(i).cpustat.nice;
system += kstat_cpu(i).cpustat.system; system += kstat_cpu(i).cpustat.system;
...@@ -394,7 +393,7 @@ static int kstat_read_proc(char *page, char **start, off_t off, ...@@ -394,7 +393,7 @@ static int kstat_read_proc(char *page, char **start, off_t off,
sum += kstat_cpu(i).irqs[j]; sum += kstat_cpu(i).irqs[j];
} }
len = sprintf(page, "cpu %u %u %u %u %u %u %u\n", seq_printf(p, "cpu %u %u %u %u %u %u %u\n",
jiffies_to_clock_t(user), jiffies_to_clock_t(user),
jiffies_to_clock_t(nice), jiffies_to_clock_t(nice),
jiffies_to_clock_t(system), jiffies_to_clock_t(system),
...@@ -402,9 +401,9 @@ static int kstat_read_proc(char *page, char **start, off_t off, ...@@ -402,9 +401,9 @@ static int kstat_read_proc(char *page, char **start, off_t off,
jiffies_to_clock_t(iowait), jiffies_to_clock_t(iowait),
jiffies_to_clock_t(irq), jiffies_to_clock_t(irq),
jiffies_to_clock_t(softirq)); jiffies_to_clock_t(softirq));
for (i = 0 ; i < NR_CPUS; i++){ for (i = 0; i < NR_CPUS; i++){
if (!cpu_online(i)) continue; if (!cpu_online(i)) continue;
len += sprintf(page + len, "cpu%d %u %u %u %u %u %u %u\n", seq_printf(p, "cpu%d %u %u %u %u %u %u %u\n",
i, i,
jiffies_to_clock_t(kstat_cpu(i).cpustat.user), jiffies_to_clock_t(kstat_cpu(i).cpustat.user),
jiffies_to_clock_t(kstat_cpu(i).cpustat.nice), jiffies_to_clock_t(kstat_cpu(i).cpustat.nice),
...@@ -414,14 +413,25 @@ static int kstat_read_proc(char *page, char **start, off_t off, ...@@ -414,14 +413,25 @@ static int kstat_read_proc(char *page, char **start, off_t off,
jiffies_to_clock_t(kstat_cpu(i).cpustat.irq), jiffies_to_clock_t(kstat_cpu(i).cpustat.irq),
jiffies_to_clock_t(kstat_cpu(i).cpustat.softirq)); jiffies_to_clock_t(kstat_cpu(i).cpustat.softirq));
} }
len += sprintf(page + len, "intr %u", sum); seq_printf(p, "intr %u", sum);
#if !defined(CONFIG_PPC64) && !defined(CONFIG_ALPHA) #if !defined(CONFIG_PPC64) && !defined(CONFIG_ALPHA)
for (i = 0 ; i < NR_IRQS ; i++) {
len += sprintf(page + len, " %u", kstat_irqs(i)); static int last_irq = 0;
for (i = last_irq; i < NR_IRQS; i++) {
if (irq_desc[i].action) {
if (i > last_irq)
last_irq = i;
}
}
for (i = 0; i <= last_irq; i++)
seq_printf(p, " %u", kstat_irqs(i));
}
#endif #endif
len += sprintf(page + len, seq_printf(p,
"\nctxt %lu\n" "\nctxt %lu\n"
"btime %lu\n" "btime %lu\n"
"processes %lu\n" "processes %lu\n"
...@@ -433,8 +443,38 @@ static int kstat_read_proc(char *page, char **start, off_t off, ...@@ -433,8 +443,38 @@ static int kstat_read_proc(char *page, char **start, off_t off,
nr_running(), nr_running(),
nr_iowait()); nr_iowait());
return proc_calc_metrics(page, start, off, count, eof, len); return 0;
}
static int stat_open(struct inode *inode, struct file *file)
{
unsigned size = 4096 * (1 + num_online_cpus() / 32);
char *buf;
struct seq_file *m;
int res;
/* don't ask for more than the kmalloc() max size, currently 128 KB */
if (size > 128 * 1024)
size = 128 * 1024;
buf = kmalloc(size, GFP_KERNEL);
if (!buf)
return -ENOMEM;
res = single_open(file, show_stat, NULL);
if (!res) {
m = file->private_data;
m->buf = buf;
m->size = size;
} else
kfree(buf);
return res;
} }
static struct file_operations proc_stat_operations = {
.open = stat_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
static int devices_read_proc(char *page, char **start, off_t off, static int devices_read_proc(char *page, char **start, off_t off,
int count, int *eof, void *data) int count, int *eof, void *data)
...@@ -626,7 +666,6 @@ void __init proc_misc_init(void) ...@@ -626,7 +666,6 @@ void __init proc_misc_init(void)
#ifdef CONFIG_STRAM_PROC #ifdef CONFIG_STRAM_PROC
{"stram", stram_read_proc}, {"stram", stram_read_proc},
#endif #endif
{"stat", kstat_read_proc},
{"devices", devices_read_proc}, {"devices", devices_read_proc},
{"filesystems", filesystems_read_proc}, {"filesystems", filesystems_read_proc},
{"cmdline", cmdline_read_proc}, {"cmdline", cmdline_read_proc},
...@@ -648,6 +687,7 @@ void __init proc_misc_init(void) ...@@ -648,6 +687,7 @@ void __init proc_misc_init(void)
entry->proc_fops = &proc_kmsg_operations; entry->proc_fops = &proc_kmsg_operations;
create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations); create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations);
create_seq_entry("partitions", 0, &proc_partitions_operations); create_seq_entry("partitions", 0, &proc_partitions_operations);
create_seq_entry("stat", 0, &proc_stat_operations);
create_seq_entry("interrupts", 0, &proc_interrupts_operations); create_seq_entry("interrupts", 0, &proc_interrupts_operations);
create_seq_entry("slabinfo",S_IWUSR|S_IRUGO,&proc_slabinfo_operations); create_seq_entry("slabinfo",S_IWUSR|S_IRUGO,&proc_slabinfo_operations);
create_seq_entry("buddyinfo",S_IRUGO, &fragmentation_file_operations); create_seq_entry("buddyinfo",S_IRUGO, &fragmentation_file_operations);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment