diff options
author | Martin Hicks <mort@sgi.com> | 2005-09-03 18:55:11 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@evo.osdl.org> | 2005-09-05 03:05:49 -0400 |
commit | c07e02db76940c75fc92f2f2c9adcdbb09ed70d0 (patch) | |
tree | 9d777784fd5e3658d8db5b01a965d4fc568ceb93 /drivers/base/node.c | |
parent | e070ad49f31155d872d8e96cab2142840993e3c0 (diff) |
[PATCH] VM: add page_state info to per-node meminfo
Add page_state info to the per-node meminfo file in sysfs. This is mostly
just for informational purposes.
The lack of this information was brought up recently during a discussion
regarding pagecache clearing, and I put this patch together to test out one
of the suggestions.
It seems like interesting info to have, so I'm submitting the patch.
Signed-off-by: Martin Hicks <mort@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/base/node.c')
-rw-r--r-- | drivers/base/node.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/base/node.c b/drivers/base/node.c index 904b27caf697..16c513aa4d48 100644 --- a/drivers/base/node.c +++ b/drivers/base/node.c | |||
@@ -39,13 +39,25 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf) | |||
39 | int n; | 39 | int n; |
40 | int nid = dev->id; | 40 | int nid = dev->id; |
41 | struct sysinfo i; | 41 | struct sysinfo i; |
42 | struct page_state ps; | ||
42 | unsigned long inactive; | 43 | unsigned long inactive; |
43 | unsigned long active; | 44 | unsigned long active; |
44 | unsigned long free; | 45 | unsigned long free; |
45 | 46 | ||
46 | si_meminfo_node(&i, nid); | 47 | si_meminfo_node(&i, nid); |
48 | get_page_state_node(&ps, nid); | ||
47 | __get_zone_counts(&active, &inactive, &free, NODE_DATA(nid)); | 49 | __get_zone_counts(&active, &inactive, &free, NODE_DATA(nid)); |
48 | 50 | ||
51 | /* Check for negative values in these approximate counters */ | ||
52 | if ((long)ps.nr_dirty < 0) | ||
53 | ps.nr_dirty = 0; | ||
54 | if ((long)ps.nr_writeback < 0) | ||
55 | ps.nr_writeback = 0; | ||
56 | if ((long)ps.nr_mapped < 0) | ||
57 | ps.nr_mapped = 0; | ||
58 | if ((long)ps.nr_slab < 0) | ||
59 | ps.nr_slab = 0; | ||
60 | |||
49 | n = sprintf(buf, "\n" | 61 | n = sprintf(buf, "\n" |
50 | "Node %d MemTotal: %8lu kB\n" | 62 | "Node %d MemTotal: %8lu kB\n" |
51 | "Node %d MemFree: %8lu kB\n" | 63 | "Node %d MemFree: %8lu kB\n" |
@@ -55,7 +67,11 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf) | |||
55 | "Node %d HighTotal: %8lu kB\n" | 67 | "Node %d HighTotal: %8lu kB\n" |
56 | "Node %d HighFree: %8lu kB\n" | 68 | "Node %d HighFree: %8lu kB\n" |
57 | "Node %d LowTotal: %8lu kB\n" | 69 | "Node %d LowTotal: %8lu kB\n" |
58 | "Node %d LowFree: %8lu kB\n", | 70 | "Node %d LowFree: %8lu kB\n" |
71 | "Node %d Dirty: %8lu kB\n" | ||
72 | "Node %d Writeback: %8lu kB\n" | ||
73 | "Node %d Mapped: %8lu kB\n" | ||
74 | "Node %d Slab: %8lu kB\n", | ||
59 | nid, K(i.totalram), | 75 | nid, K(i.totalram), |
60 | nid, K(i.freeram), | 76 | nid, K(i.freeram), |
61 | nid, K(i.totalram - i.freeram), | 77 | nid, K(i.totalram - i.freeram), |
@@ -64,7 +80,11 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf) | |||
64 | nid, K(i.totalhigh), | 80 | nid, K(i.totalhigh), |
65 | nid, K(i.freehigh), | 81 | nid, K(i.freehigh), |
66 | nid, K(i.totalram - i.totalhigh), | 82 | nid, K(i.totalram - i.totalhigh), |
67 | nid, K(i.freeram - i.freehigh)); | 83 | nid, K(i.freeram - i.freehigh), |
84 | nid, K(ps.nr_dirty), | ||
85 | nid, K(ps.nr_writeback), | ||
86 | nid, K(ps.nr_mapped), | ||
87 | nid, K(ps.nr_slab)); | ||
68 | n += hugetlb_report_node_meminfo(nid, buf + n); | 88 | n += hugetlb_report_node_meminfo(nid, buf + n); |
69 | return n; | 89 | return n; |
70 | } | 90 | } |