hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/include/linux/vmstat.h
....@@ -8,6 +8,7 @@
88 #include <linux/vm_event_item.h>
99 #include <linux/atomic.h>
1010 #include <linux/static_key.h>
11
+#include <linux/mmdebug.h>
1112
1213 extern int sysctl_stat_interval;
1314
....@@ -16,8 +17,8 @@
1617 #define DISABLE_NUMA_STAT 0
1718 extern int sysctl_vm_numa_stat;
1819 DECLARE_STATIC_KEY_TRUE(vm_numa_stat_key);
19
-extern int sysctl_vm_numa_stat_handler(struct ctl_table *table,
20
- int write, void __user *buffer, size_t *length, loff_t *ppos);
20
+int sysctl_vm_numa_stat_handler(struct ctl_table *table, int write,
21
+ void *buffer, size_t *length, loff_t *ppos);
2122 #endif
2223
2324 struct reclaim_stat {
....@@ -26,9 +27,17 @@
2627 unsigned nr_congested;
2728 unsigned nr_writeback;
2829 unsigned nr_immediate;
29
- unsigned nr_activate;
30
+ unsigned nr_pageout;
31
+ unsigned nr_activate[ANON_AND_FILE];
3032 unsigned nr_ref_keep;
3133 unsigned nr_unmap_fail;
34
+ unsigned nr_lazyfree_fail;
35
+};
36
+
37
+enum writeback_stat_item {
38
+ NR_DIRTY_THRESHOLD,
39
+ NR_DIRTY_BG_THRESHOLD,
40
+ NR_VM_WRITEBACK_STAT_ITEMS,
3241 };
3342
3443 #ifdef CONFIG_VM_EVENT_COUNTERS
....@@ -54,7 +63,9 @@
5463 */
5564 static inline void __count_vm_event(enum vm_event_item item)
5665 {
66
+ preempt_disable_rt();
5767 raw_cpu_inc(vm_event_states.event[item]);
68
+ preempt_enable_rt();
5869 }
5970
6071 static inline void count_vm_event(enum vm_event_item item)
....@@ -64,7 +75,9 @@
6475
6576 static inline void __count_vm_events(enum vm_event_item item, long delta)
6677 {
78
+ preempt_disable_rt();
6779 raw_cpu_add(vm_event_states.event[item], delta);
80
+ preempt_enable_rt();
6881 }
6982
7083 static inline void count_vm_events(enum vm_event_item item, long delta)
....@@ -184,7 +197,8 @@
184197 return x;
185198 }
186199
187
-static inline unsigned long global_node_page_state(enum node_stat_item item)
200
+static inline
201
+unsigned long global_node_page_state_pages(enum node_stat_item item)
188202 {
189203 long x = atomic_long_read(&vm_node_stat[item]);
190204 #ifdef CONFIG_SMP
....@@ -192,6 +206,13 @@
192206 x = 0;
193207 #endif
194208 return x;
209
+}
210
+
211
+static inline unsigned long global_node_page_state(enum node_stat_item item)
212
+{
213
+ VM_WARN_ON_ONCE(vmstat_item_in_bytes(item));
214
+
215
+ return global_node_page_state_pages(item);
195216 }
196217
197218 static inline unsigned long zone_page_state(struct zone *zone,
....@@ -234,15 +255,13 @@
234255 extern unsigned long sum_zone_numa_state(int node, enum numa_stat_item item);
235256 extern unsigned long node_page_state(struct pglist_data *pgdat,
236257 enum node_stat_item item);
258
+extern unsigned long node_page_state_pages(struct pglist_data *pgdat,
259
+ enum node_stat_item item);
237260 #else
238261 #define sum_zone_node_page_state(node, item) global_zone_page_state(item)
239262 #define node_page_state(node, item) global_node_page_state(item)
263
+#define node_page_state_pages(node, item) global_node_page_state_pages(item)
240264 #endif /* CONFIG_NUMA */
241
-
242
-#define add_zone_page_state(__z, __i, __d) mod_zone_page_state(__z, __i, __d)
243
-#define sub_zone_page_state(__z, __i, __d) mod_zone_page_state(__z, __i, -(__d))
244
-#define add_node_page_state(__p, __i, __d) mod_node_page_state(__p, __i, __d)
245
-#define sub_node_page_state(__p, __i, __d) mod_node_page_state(__p, __i, -(__d))
246265
247266 #ifdef CONFIG_SMP
248267 void __mod_zone_page_state(struct zone *, enum zone_stat_item item, long);
....@@ -273,8 +292,8 @@
273292 void refresh_zone_stat_thresholds(void);
274293
275294 struct ctl_table;
276
-int vmstat_refresh(struct ctl_table *, int write,
277
- void __user *buffer, size_t *lenp, loff_t *ppos);
295
+int vmstat_refresh(struct ctl_table *, int write, void *buffer, size_t *lenp,
296
+ loff_t *ppos);
278297
279298 void drain_zonestat(struct zone *zone, struct per_cpu_pageset *);
280299
....@@ -297,6 +316,11 @@
297316 static inline void __mod_node_page_state(struct pglist_data *pgdat,
298317 enum node_stat_item item, int delta)
299318 {
319
+ if (vmstat_item_in_bytes(item)) {
320
+ VM_WARN_ON_ONCE(delta & (PAGE_SIZE - 1));
321
+ delta >>= PAGE_SHIFT;
322
+ }
323
+
300324 node_page_state_add(delta, pgdat, item);
301325 }
302326
....@@ -386,4 +410,48 @@
386410
387411 extern const char * const vmstat_text[];
388412
413
+static inline const char *zone_stat_name(enum zone_stat_item item)
414
+{
415
+ return vmstat_text[item];
416
+}
417
+
418
+#ifdef CONFIG_NUMA
419
+static inline const char *numa_stat_name(enum numa_stat_item item)
420
+{
421
+ return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
422
+ item];
423
+}
424
+#endif /* CONFIG_NUMA */
425
+
426
+static inline const char *node_stat_name(enum node_stat_item item)
427
+{
428
+ return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
429
+ NR_VM_NUMA_STAT_ITEMS +
430
+ item];
431
+}
432
+
433
+static inline const char *lru_list_name(enum lru_list lru)
434
+{
435
+ return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
436
+}
437
+
438
+static inline const char *writeback_stat_name(enum writeback_stat_item item)
439
+{
440
+ return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
441
+ NR_VM_NUMA_STAT_ITEMS +
442
+ NR_VM_NODE_STAT_ITEMS +
443
+ item];
444
+}
445
+
446
+#if defined(CONFIG_VM_EVENT_COUNTERS) || defined(CONFIG_MEMCG)
447
+static inline const char *vm_event_name(enum vm_event_item item)
448
+{
449
+ return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
450
+ NR_VM_NUMA_STAT_ITEMS +
451
+ NR_VM_NODE_STAT_ITEMS +
452
+ NR_VM_WRITEBACK_STAT_ITEMS +
453
+ item];
454
+}
455
+#endif /* CONFIG_VM_EVENT_COUNTERS || CONFIG_MEMCG */
456
+
389457 #endif /* _LINUX_VMSTAT_H */