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 | |
| 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>
| -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}, |
