diff options
author | Alexey Dobriyan <adobriyan@gmail.com> | 2008-10-02 18:21:47 -0400 |
---|---|---|
committer | Alexey Dobriyan <adobriyan@gmail.com> | 2008-10-23 05:45:28 -0400 |
commit | 5b3acc8de8b2bc459afae6e09ada45c7e5b11bbf (patch) | |
tree | 295a8d4401fb63e7c0f32090f1fafce1835765d6 /fs | |
parent | 6c2f91e077f1b60e7f83b7ee044f965f469cfdb3 (diff) |
proc: switch /proc/loadavg to seq_file
and move it to fs/proc/loadavg.c while I'm at it.
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/proc/Makefile | 2 | ||||
-rw-r--r-- | fs/proc/loadavg.c | 51 | ||||
-rw-r--r-- | fs/proc/proc_misc.c | 26 |
3 files changed, 52 insertions, 27 deletions
diff --git a/fs/proc/Makefile b/fs/proc/Makefile index ebaba0213546..bf2ab4df4a8c 100644 --- a/fs/proc/Makefile +++ b/fs/proc/Makefile | |||
@@ -9,7 +9,7 @@ proc-$(CONFIG_MMU) := mmu.o task_mmu.o | |||
9 | 9 | ||
10 | proc-y += inode.o root.o base.o generic.o array.o \ | 10 | proc-y += inode.o root.o base.o generic.o array.o \ |
11 | proc_tty.o proc_misc.o | 11 | proc_tty.o proc_misc.o |
12 | 12 | proc-y += loadavg.o | |
13 | proc-$(CONFIG_PROC_SYSCTL) += proc_sysctl.o | 13 | proc-$(CONFIG_PROC_SYSCTL) += proc_sysctl.o |
14 | proc-$(CONFIG_NET) += proc_net.o | 14 | proc-$(CONFIG_NET) += proc_net.o |
15 | proc-$(CONFIG_PROC_KCORE) += kcore.o | 15 | proc-$(CONFIG_PROC_KCORE) += kcore.o |
diff --git a/fs/proc/loadavg.c b/fs/proc/loadavg.c new file mode 100644 index 000000000000..9bca39cf99ee --- /dev/null +++ b/fs/proc/loadavg.c | |||
@@ -0,0 +1,51 @@ | |||
1 | #include <linux/fs.h> | ||
2 | #include <linux/init.h> | ||
3 | #include <linux/pid_namespace.h> | ||
4 | #include <linux/proc_fs.h> | ||
5 | #include <linux/sched.h> | ||
6 | #include <linux/seq_file.h> | ||
7 | #include <linux/seqlock.h> | ||
8 | #include <linux/time.h> | ||
9 | |||
10 | #define LOAD_INT(x) ((x) >> FSHIFT) | ||
11 | #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100) | ||
12 | |||
13 | static int loadavg_proc_show(struct seq_file *m, void *v) | ||
14 | { | ||
15 | int a, b, c; | ||
16 | unsigned long seq; | ||
17 | |||
18 | do { | ||
19 | seq = read_seqbegin(&xtime_lock); | ||
20 | a = avenrun[0] + (FIXED_1/200); | ||
21 | b = avenrun[1] + (FIXED_1/200); | ||
22 | c = avenrun[2] + (FIXED_1/200); | ||
23 | } while (read_seqretry(&xtime_lock, seq)); | ||
24 | |||
25 | seq_printf(m, "%d.%02d %d.%02d %d.%02d %ld/%d %d\n", | ||
26 | LOAD_INT(a), LOAD_FRAC(a), | ||
27 | LOAD_INT(b), LOAD_FRAC(b), | ||
28 | LOAD_INT(c), LOAD_FRAC(c), | ||
29 | nr_running(), nr_threads, | ||
30 | task_active_pid_ns(current)->last_pid); | ||
31 | return 0; | ||
32 | } | ||
33 | |||
34 | static int loadavg_proc_open(struct inode *inode, struct file *file) | ||
35 | { | ||
36 | return single_open(file, loadavg_proc_show, NULL); | ||
37 | } | ||
38 | |||
39 | static const struct file_operations loadavg_proc_fops = { | ||
40 | .open = loadavg_proc_open, | ||
41 | .read = seq_read, | ||
42 | .llseek = seq_lseek, | ||
43 | .release = single_release, | ||
44 | }; | ||
45 | |||
46 | static int __init proc_loadavg_init(void) | ||
47 | { | ||
48 | proc_create("loadavg", 0, NULL, &loadavg_proc_fops); | ||
49 | return 0; | ||
50 | } | ||
51 | module_init(proc_loadavg_init); | ||
diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c index 7ea52c79b2da..ff42206c8aed 100644 --- a/fs/proc/proc_misc.c +++ b/fs/proc/proc_misc.c | |||
@@ -57,8 +57,6 @@ | |||
57 | #include <asm/div64.h> | 57 | #include <asm/div64.h> |
58 | #include "internal.h" | 58 | #include "internal.h" |
59 | 59 | ||
60 | #define LOAD_INT(x) ((x) >> FSHIFT) | ||
61 | #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100) | ||
62 | /* | 60 | /* |
63 | * Warning: stuff below (imported functions) assumes that its output will fit | 61 | * Warning: stuff below (imported functions) assumes that its output will fit |
64 | * into one page. For some of those functions it may be wrong. Moreover, we | 62 | * into one page. For some of those functions it may be wrong. Moreover, we |
@@ -80,29 +78,6 @@ static int proc_calc_metrics(char *page, char **start, off_t off, | |||
80 | return len; | 78 | return len; |
81 | } | 79 | } |
82 | 80 | ||
83 | static int loadavg_read_proc(char *page, char **start, off_t off, | ||
84 | int count, int *eof, void *data) | ||
85 | { | ||
86 | int a, b, c; | ||
87 | int len; | ||
88 | unsigned long seq; | ||
89 | |||
90 | do { | ||
91 | seq = read_seqbegin(&xtime_lock); | ||
92 | a = avenrun[0] + (FIXED_1/200); | ||
93 | b = avenrun[1] + (FIXED_1/200); | ||
94 | c = avenrun[2] + (FIXED_1/200); | ||
95 | } while (read_seqretry(&xtime_lock, seq)); | ||
96 | |||
97 | len = sprintf(page,"%d.%02d %d.%02d %d.%02d %ld/%d %d\n", | ||
98 | LOAD_INT(a), LOAD_FRAC(a), | ||
99 | LOAD_INT(b), LOAD_FRAC(b), | ||
100 | LOAD_INT(c), LOAD_FRAC(c), | ||
101 | nr_running(), nr_threads, | ||
102 | task_active_pid_ns(current)->last_pid); | ||
103 | return proc_calc_metrics(page, start, off, count, eof, len); | ||
104 | } | ||
105 | |||
106 | static int uptime_read_proc(char *page, char **start, off_t off, | 81 | static int uptime_read_proc(char *page, char **start, off_t off, |
107 | int count, int *eof, void *data) | 82 | int count, int *eof, void *data) |
108 | { | 83 | { |
@@ -861,7 +836,6 @@ void __init proc_misc_init(void) | |||
861 | char *name; | 836 | char *name; |
862 | int (*read_proc)(char*,char**,off_t,int,int*,void*); | 837 | int (*read_proc)(char*,char**,off_t,int,int*,void*); |
863 | } *p, simple_ones[] = { | 838 | } *p, simple_ones[] = { |
864 | {"loadavg", loadavg_read_proc}, | ||
865 | {"uptime", uptime_read_proc}, | 839 | {"uptime", uptime_read_proc}, |
866 | {"meminfo", meminfo_read_proc}, | 840 | {"meminfo", meminfo_read_proc}, |
867 | {"version", version_read_proc}, | 841 | {"version", version_read_proc}, |