History

[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.

Martin Hicks committed 21 years ago

Commit c07e02d1 parent e070ad43 files · +43 −7Browse files

Unified · Split

3 files
  1. drivers/base/node.c +22 −2
  2. include/linux/page-flags.h +1 −0
  3. mm/page_alloc.c +20 −5
drivers/base/node.c+22−2
@@ -39,13 +39,25 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf) · 38 unmodified lines
3939 int n;
4040 int nid = dev->id;
4141 struct sysinfo i;
42+ struct page_state ps;
4243 unsigned long inactive;
4344 unsigned long active;
4445 unsigned long free;
4546
4647 si_meminfo_node(&i, nid);
48+ get_page_state_node(&ps, nid);
4749 __get_zone_counts(&active, &inactive, &free, NODE_DATA(nid));
4850
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+
4961 n = sprintf(buf, "\n"
5062 "Node %d MemTotal: %8lu kB\n"
5163 "Node %d MemFree: %8lu kB\n"
@@ -55,7 +67,11 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf) · 3 unmodified lines
5567 "Node %d HighTotal: %8lu kB\n"
5668 "Node %d HighFree: %8lu kB\n"
5769 "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",
5975 nid, K(i.totalram),
6076 nid, K(i.freeram),
6177 nid, K(i.totalram - i.freeram),
@@ -64,7 +80,11 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf) · 2 unmodified lines
6480 nid, K(i.totalhigh),
6581 nid, K(i.freehigh),
6682 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));
6888 n += hugetlb_report_node_meminfo(nid, buf + n);
6989 return n;
7090 }
include/linux/page-flags.h+1−0
@@ -134,6 +134,7 @@ struct page_state { · 133 unmodified lines
134134 };
135135
136136 extern void get_page_state(struct page_state *ret);
137+extern void get_page_state_node(struct page_state *ret, int node);
137138 extern void get_full_page_state(struct page_state *ret);
138139 extern unsigned long __read_page_state(unsigned long offset);
139140 extern void __mod_page_state(unsigned long offset, unsigned long delta);
mm/page_alloc.c+20−5
@@ -1130,19 +1130,20 @@ EXPORT_SYMBOL(nr_pagecache); · 1129 unmodified lines
11301130 DEFINE_PER_CPU(long, nr_pagecache_local) = 0;
11311131 #endif
11321132
1133−void __get_page_state(struct page_state *ret, int nr)
1133+void __get_page_state(struct page_state *ret, int nr, cpumask_t *cpumask)
11341134 {
11351135 int cpu = 0;
11361136
11371137 memset(ret, 0, sizeof(*ret));
1138+ cpus_and(*cpumask, *cpumask, cpu_online_map);
11381139
1139− cpu = first_cpu(cpu_online_map);
1140+ cpu = first_cpu(*cpumask);
11401141 while (cpu < NR_CPUS) {
11411142 unsigned long *in, *out, off;
11421143
11431144 in = (unsigned long *)&per_cpu(page_states, cpu);
11441145
1145− cpu = next_cpu(cpu, cpu_online_map);
1146+ cpu = next_cpu(cpu, *cpumask);
11461147
11471148 if (cpu < NR_CPUS)
11481149 prefetch(&per_cpu(page_states, cpu));
@@ -1153,19 +1154,33 @@ void __get_page_state(struct page_state *ret, int nr) · 4 unmodified lines
11531154 }
11541155 }
11551156
1157+void get_page_state_node(struct page_state *ret, int node)
1158+{
1159+ int nr;
1160+ cpumask_t mask = node_to_cpumask(node);
1161+
1162+ nr = offsetof(struct page_state, GET_PAGE_STATE_LAST);
1163+ nr /= sizeof(unsigned long);
1164+
1165+ __get_page_state(ret, nr+1, &mask);
1166+}
1167+
11561168 void get_page_state(struct page_state *ret)
11571169 {
11581170 int nr;
1171+ cpumask_t mask = CPU_MASK_ALL;
11591172
11601173 nr = offsetof(struct page_state, GET_PAGE_STATE_LAST);
11611174 nr /= sizeof(unsigned long);
11621175
1163− __get_page_state(ret, nr + 1);
1176+ __get_page_state(ret, nr + 1, &mask);
11641177 }
11651178
11661179 void get_full_page_state(struct page_state *ret)
11671180 {
1168− __get_page_state(ret, sizeof(*ret) / sizeof(unsigned long));
1181+ cpumask_t mask = CPU_MASK_ALL;
1182+
1183+ __get_page_state(ret, sizeof(*ret) / sizeof(unsigned long), &mask);
11691184 }
11701185
11711186 unsigned long __read_page_state(unsigned long offset)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t