1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_VMSTAT_H 3 #define _LINUX_VMSTAT_H 4 5 #include <linux/types.h> 6 #include <linux/percpu.h> 7 #include <linux/mmzone.h> 8 #include <linux/vm_event_item.h> 9 #include <linux/atomic.h> 10 #include <linux/static_key.h> 11 #include <linux/mmdebug.h> 12 13 extern int sysctl_stat_interval; 14 15 #ifdef CONFIG_NUMA 16 #define ENABLE_NUMA_STAT 1 17 #define DISABLE_NUMA_STAT 0 18 extern int sysctl_vm_numa_stat; 19 DECLARE_STATIC_KEY_TRUE(vm_numa_stat_key); 20 int sysctl_vm_numa_stat_handler(const struct ctl_table *table, int write, 21 void *buffer, size_t *length, loff_t *ppos); 22 #endif 23 24 struct reclaim_stat { 25 unsigned nr_dirty; 26 unsigned nr_unqueued_dirty; 27 unsigned nr_congested; 28 unsigned nr_writeback; 29 unsigned nr_immediate; 30 unsigned nr_pageout; 31 unsigned nr_activate[ANON_AND_FILE]; 32 unsigned nr_ref_keep; 33 unsigned nr_unmap_fail; 34 unsigned nr_lazyfree_fail; 35 unsigned nr_demoted; 36 }; 37 38 /* Stat data for system wide items */ 39 enum vm_stat_item { 40 NR_DIRTY_THRESHOLD, 41 NR_DIRTY_BG_THRESHOLD, 42 NR_MEMMAP_PAGES, /* page metadata allocated through buddy allocator */ 43 NR_MEMMAP_BOOT_PAGES, /* page metadata allocated through boot allocator */ 44 NR_VM_STAT_ITEMS, 45 }; 46 47 #ifdef CONFIG_VM_EVENT_COUNTERS 48 /* 49 * Light weight per cpu counter implementation. 50 * 51 * Counters should only be incremented and no critical kernel component 52 * should rely on the counter values. 53 * 54 * Counters are handled completely inline. On many platforms the code 55 * generated will simply be the increment of a global address. 56 */ 57 58 struct vm_event_state { 59 unsigned long event[NR_VM_EVENT_ITEMS]; 60 }; 61 62 DECLARE_PER_CPU(struct vm_event_state, vm_event_states); 63 64 /* 65 * vm counters are allowed to be racy. Use raw_cpu_ops to avoid the 66 * local_irq_disable overhead. 67 */ __count_vm_event(enum vm_event_item item)68 static inline void __count_vm_event(enum vm_event_item item) 69 { 70 raw_cpu_inc(vm_event_states.event[item]); 71 } 72 count_vm_event(enum vm_event_item item)73 static inline void count_vm_event(enum vm_event_item item) 74 { 75 this_cpu_inc(vm_event_states.event[item]); 76 } 77 __count_vm_events(enum vm_event_item item,long delta)78 static inline void __count_vm_events(enum vm_event_item item, long delta) 79 { 80 raw_cpu_add(vm_event_states.event[item], delta); 81 } 82 count_vm_events(enum vm_event_item item,long delta)83 static inline void count_vm_events(enum vm_event_item item, long delta) 84 { 85 this_cpu_add(vm_event_states.event[item], delta); 86 } 87 88 extern void all_vm_events(unsigned long *); 89 90 extern void vm_events_fold_cpu(int cpu); 91 92 #else 93 94 /* Disable counters */ count_vm_event(enum vm_event_item item)95 static inline void count_vm_event(enum vm_event_item item) 96 { 97 } count_vm_events(enum vm_event_item item,long delta)98 static inline void count_vm_events(enum vm_event_item item, long delta) 99 { 100 } __count_vm_event(enum vm_event_item item)101 static inline void __count_vm_event(enum vm_event_item item) 102 { 103 } __count_vm_events(enum vm_event_item item,long delta)104 static inline void __count_vm_events(enum vm_event_item item, long delta) 105 { 106 } all_vm_events(unsigned long * ret)107 static inline void all_vm_events(unsigned long *ret) 108 { 109 } vm_events_fold_cpu(int cpu)110 static inline void vm_events_fold_cpu(int cpu) 111 { 112 } 113 114 #endif /* CONFIG_VM_EVENT_COUNTERS */ 115 116 #ifdef CONFIG_NUMA_BALANCING 117 #define count_vm_numa_event(x) count_vm_event(x) 118 #define count_vm_numa_events(x, y) count_vm_events(x, y) 119 #else 120 #define count_vm_numa_event(x) do {} while (0) 121 #define count_vm_numa_events(x, y) do { (void)(y); } while (0) 122 #endif /* CONFIG_NUMA_BALANCING */ 123 124 #ifdef CONFIG_DEBUG_TLBFLUSH 125 #define count_vm_tlb_event(x) count_vm_event(x) 126 #define count_vm_tlb_events(x, y) count_vm_events(x, y) 127 #else 128 #define count_vm_tlb_event(x) do {} while (0) 129 #define count_vm_tlb_events(x, y) do { (void)(y); } while (0) 130 #endif 131 132 #ifdef CONFIG_PER_VMA_LOCK_STATS 133 #define count_vm_vma_lock_event(x) count_vm_event(x) 134 #else 135 #define count_vm_vma_lock_event(x) do {} while (0) 136 #endif 137 138 #define __count_zid_vm_events(item, zid, delta) \ 139 __count_vm_events(item##_NORMAL - ZONE_NORMAL + zid, delta) 140 141 /* 142 * Zone and node-based page accounting with per cpu differentials. 143 */ 144 extern atomic_long_t vm_zone_stat[NR_VM_ZONE_STAT_ITEMS]; 145 extern atomic_long_t vm_node_stat[NR_VM_NODE_STAT_ITEMS]; 146 extern atomic_long_t vm_numa_event[NR_VM_NUMA_EVENT_ITEMS]; 147 148 #ifdef CONFIG_NUMA zone_numa_event_add(long x,struct zone * zone,enum numa_stat_item item)149 static inline void zone_numa_event_add(long x, struct zone *zone, 150 enum numa_stat_item item) 151 { 152 atomic_long_add(x, &zone->vm_numa_event[item]); 153 atomic_long_add(x, &vm_numa_event[item]); 154 } 155 zone_numa_event_state(struct zone * zone,enum numa_stat_item item)156 static inline unsigned long zone_numa_event_state(struct zone *zone, 157 enum numa_stat_item item) 158 { 159 return atomic_long_read(&zone->vm_numa_event[item]); 160 } 161 162 static inline unsigned long global_numa_event_state(enum numa_stat_item item)163 global_numa_event_state(enum numa_stat_item item) 164 { 165 return atomic_long_read(&vm_numa_event[item]); 166 } 167 #endif /* CONFIG_NUMA */ 168 zone_page_state_add(long x,struct zone * zone,enum zone_stat_item item)169 static inline void zone_page_state_add(long x, struct zone *zone, 170 enum zone_stat_item item) 171 { 172 atomic_long_add(x, &zone->vm_stat[item]); 173 atomic_long_add(x, &vm_zone_stat[item]); 174 } 175 node_page_state_add(long x,struct pglist_data * pgdat,enum node_stat_item item)176 static inline void node_page_state_add(long x, struct pglist_data *pgdat, 177 enum node_stat_item item) 178 { 179 atomic_long_add(x, &pgdat->vm_stat[item]); 180 atomic_long_add(x, &vm_node_stat[item]); 181 } 182 global_zone_page_state(enum zone_stat_item item)183 static inline unsigned long global_zone_page_state(enum zone_stat_item item) 184 { 185 long x = atomic_long_read(&vm_zone_stat[item]); 186 #ifdef CONFIG_SMP 187 if (x < 0) 188 x = 0; 189 #endif 190 return x; 191 } 192 193 static inline global_node_page_state_pages(enum node_stat_item item)194 unsigned long global_node_page_state_pages(enum node_stat_item item) 195 { 196 long x = atomic_long_read(&vm_node_stat[item]); 197 #ifdef CONFIG_SMP 198 if (x < 0) 199 x = 0; 200 #endif 201 return x; 202 } 203 global_node_page_state(enum node_stat_item item)204 static inline unsigned long global_node_page_state(enum node_stat_item item) 205 { 206 VM_WARN_ON_ONCE(vmstat_item_in_bytes(item)); 207 208 return global_node_page_state_pages(item); 209 } 210 zone_page_state(struct zone * zone,enum zone_stat_item item)211 static inline unsigned long zone_page_state(struct zone *zone, 212 enum zone_stat_item item) 213 { 214 long x = atomic_long_read(&zone->vm_stat[item]); 215 #ifdef CONFIG_SMP 216 if (x < 0) 217 x = 0; 218 #endif 219 return x; 220 } 221 222 /* 223 * More accurate version that also considers the currently pending 224 * deltas. For that we need to loop over all cpus to find the current 225 * deltas. There is no synchronization so the result cannot be 226 * exactly accurate either. 227 */ zone_page_state_snapshot(struct zone * zone,enum zone_stat_item item)228 static inline unsigned long zone_page_state_snapshot(struct zone *zone, 229 enum zone_stat_item item) 230 { 231 long x = atomic_long_read(&zone->vm_stat[item]); 232 233 #ifdef CONFIG_SMP 234 int cpu; 235 for_each_online_cpu(cpu) 236 x += per_cpu_ptr(zone->per_cpu_zonestats, cpu)->vm_stat_diff[item]; 237 238 if (x < 0) 239 x = 0; 240 #endif 241 return x; 242 } 243 244 #ifdef CONFIG_NUMA 245 /* See __count_vm_event comment on why raw_cpu_inc is used. */ 246 static inline void __count_numa_event(struct zone * zone,enum numa_stat_item item)247 __count_numa_event(struct zone *zone, enum numa_stat_item item) 248 { 249 struct per_cpu_zonestat __percpu *pzstats = zone->per_cpu_zonestats; 250 251 raw_cpu_inc(pzstats->vm_numa_event[item]); 252 } 253 254 static inline void __count_numa_events(struct zone * zone,enum numa_stat_item item,long delta)255 __count_numa_events(struct zone *zone, enum numa_stat_item item, long delta) 256 { 257 struct per_cpu_zonestat __percpu *pzstats = zone->per_cpu_zonestats; 258 259 raw_cpu_add(pzstats->vm_numa_event[item], delta); 260 } 261 262 extern unsigned long sum_zone_node_page_state(int node, 263 enum zone_stat_item item); 264 extern unsigned long sum_zone_numa_event_state(int node, enum numa_stat_item item); 265 extern unsigned long node_page_state(struct pglist_data *pgdat, 266 enum node_stat_item item); 267 extern unsigned long node_page_state_pages(struct pglist_data *pgdat, 268 enum node_stat_item item); 269 extern void fold_vm_numa_events(void); 270 #else 271 #define sum_zone_node_page_state(node, item) global_zone_page_state(item) 272 #define node_page_state(node, item) global_node_page_state(item) 273 #define node_page_state_pages(node, item) global_node_page_state_pages(item) fold_vm_numa_events(void)274 static inline void fold_vm_numa_events(void) 275 { 276 } 277 #endif /* CONFIG_NUMA */ 278 279 #ifdef CONFIG_SMP 280 void __mod_zone_page_state(struct zone *, enum zone_stat_item item, long); 281 void __inc_zone_page_state(struct page *, enum zone_stat_item); 282 void __dec_zone_page_state(struct page *, enum zone_stat_item); 283 284 void __mod_node_page_state(struct pglist_data *, enum node_stat_item item, long); 285 void __inc_node_page_state(struct page *, enum node_stat_item); 286 void __dec_node_page_state(struct page *, enum node_stat_item); 287 288 void mod_zone_page_state(struct zone *, enum zone_stat_item, long); 289 void inc_zone_page_state(struct page *, enum zone_stat_item); 290 void dec_zone_page_state(struct page *, enum zone_stat_item); 291 292 void mod_node_page_state(struct pglist_data *, enum node_stat_item, long); 293 void inc_node_page_state(struct page *, enum node_stat_item); 294 void dec_node_page_state(struct page *, enum node_stat_item); 295 296 extern void inc_node_state(struct pglist_data *, enum node_stat_item); 297 extern void __inc_zone_state(struct zone *, enum zone_stat_item); 298 extern void __inc_node_state(struct pglist_data *, enum node_stat_item); 299 extern void dec_zone_state(struct zone *, enum zone_stat_item); 300 extern void __dec_zone_state(struct zone *, enum zone_stat_item); 301 extern void __dec_node_state(struct pglist_data *, enum node_stat_item); 302 303 void quiet_vmstat(void); 304 void cpu_vm_stats_fold(int cpu); 305 void refresh_zone_stat_thresholds(void); 306 307 struct ctl_table; 308 int vmstat_refresh(const struct ctl_table *, int write, void *buffer, size_t *lenp, 309 loff_t *ppos); 310 311 void drain_zonestat(struct zone *zone, struct per_cpu_zonestat *); 312 313 int calculate_pressure_threshold(struct zone *zone); 314 int calculate_normal_threshold(struct zone *zone); 315 void set_pgdat_percpu_threshold(pg_data_t *pgdat, 316 int (*calculate_pressure)(struct zone *)); 317 #else /* CONFIG_SMP */ 318 319 /* 320 * We do not maintain differentials in a single processor configuration. 321 * The functions directly modify the zone and global counters. 322 */ __mod_zone_page_state(struct zone * zone,enum zone_stat_item item,long delta)323 static inline void __mod_zone_page_state(struct zone *zone, 324 enum zone_stat_item item, long delta) 325 { 326 zone_page_state_add(delta, zone, item); 327 } 328 __mod_node_page_state(struct pglist_data * pgdat,enum node_stat_item item,int delta)329 static inline void __mod_node_page_state(struct pglist_data *pgdat, 330 enum node_stat_item item, int delta) 331 { 332 if (vmstat_item_in_bytes(item)) { 333 /* 334 * Only cgroups use subpage accounting right now; at 335 * the global level, these items still change in 336 * multiples of whole pages. Store them as pages 337 * internally to keep the per-cpu counters compact. 338 */ 339 VM_WARN_ON_ONCE(delta & (PAGE_SIZE - 1)); 340 delta >>= PAGE_SHIFT; 341 } 342 343 node_page_state_add(delta, pgdat, item); 344 } 345 __inc_zone_state(struct zone * zone,enum zone_stat_item item)346 static inline void __inc_zone_state(struct zone *zone, enum zone_stat_item item) 347 { 348 atomic_long_inc(&zone->vm_stat[item]); 349 atomic_long_inc(&vm_zone_stat[item]); 350 } 351 __inc_node_state(struct pglist_data * pgdat,enum node_stat_item item)352 static inline void __inc_node_state(struct pglist_data *pgdat, enum node_stat_item item) 353 { 354 atomic_long_inc(&pgdat->vm_stat[item]); 355 atomic_long_inc(&vm_node_stat[item]); 356 } 357 __dec_zone_state(struct zone * zone,enum zone_stat_item item)358 static inline void __dec_zone_state(struct zone *zone, enum zone_stat_item item) 359 { 360 atomic_long_dec(&zone->vm_stat[item]); 361 atomic_long_dec(&vm_zone_stat[item]); 362 } 363 __dec_node_state(struct pglist_data * pgdat,enum node_stat_item item)364 static inline void __dec_node_state(struct pglist_data *pgdat, enum node_stat_item item) 365 { 366 atomic_long_dec(&pgdat->vm_stat[item]); 367 atomic_long_dec(&vm_node_stat[item]); 368 } 369 __inc_zone_page_state(struct page * page,enum zone_stat_item item)370 static inline void __inc_zone_page_state(struct page *page, 371 enum zone_stat_item item) 372 { 373 __inc_zone_state(page_zone(page), item); 374 } 375 __inc_node_page_state(struct page * page,enum node_stat_item item)376 static inline void __inc_node_page_state(struct page *page, 377 enum node_stat_item item) 378 { 379 __inc_node_state(page_pgdat(page), item); 380 } 381 382 __dec_zone_page_state(struct page * page,enum zone_stat_item item)383 static inline void __dec_zone_page_state(struct page *page, 384 enum zone_stat_item item) 385 { 386 __dec_zone_state(page_zone(page), item); 387 } 388 __dec_node_page_state(struct page * page,enum node_stat_item item)389 static inline void __dec_node_page_state(struct page *page, 390 enum node_stat_item item) 391 { 392 __dec_node_state(page_pgdat(page), item); 393 } 394 395 396 /* 397 * We only use atomic operations to update counters. So there is no need to 398 * disable interrupts. 399 */ 400 #define inc_zone_page_state __inc_zone_page_state 401 #define dec_zone_page_state __dec_zone_page_state 402 #define mod_zone_page_state __mod_zone_page_state 403 404 #define inc_node_page_state __inc_node_page_state 405 #define dec_node_page_state __dec_node_page_state 406 #define mod_node_page_state __mod_node_page_state 407 408 #define inc_zone_state __inc_zone_state 409 #define inc_node_state __inc_node_state 410 #define dec_zone_state __dec_zone_state 411 412 #define set_pgdat_percpu_threshold(pgdat, callback) { } 413 refresh_zone_stat_thresholds(void)414 static inline void refresh_zone_stat_thresholds(void) { } cpu_vm_stats_fold(int cpu)415 static inline void cpu_vm_stats_fold(int cpu) { } quiet_vmstat(void)416 static inline void quiet_vmstat(void) { } 417 drain_zonestat(struct zone * zone,struct per_cpu_zonestat * pzstats)418 static inline void drain_zonestat(struct zone *zone, 419 struct per_cpu_zonestat *pzstats) { } 420 #endif /* CONFIG_SMP */ 421 __zone_stat_mod_folio(struct folio * folio,enum zone_stat_item item,long nr)422 static inline void __zone_stat_mod_folio(struct folio *folio, 423 enum zone_stat_item item, long nr) 424 { 425 __mod_zone_page_state(folio_zone(folio), item, nr); 426 } 427 __zone_stat_add_folio(struct folio * folio,enum zone_stat_item item)428 static inline void __zone_stat_add_folio(struct folio *folio, 429 enum zone_stat_item item) 430 { 431 __mod_zone_page_state(folio_zone(folio), item, folio_nr_pages(folio)); 432 } 433 __zone_stat_sub_folio(struct folio * folio,enum zone_stat_item item)434 static inline void __zone_stat_sub_folio(struct folio *folio, 435 enum zone_stat_item item) 436 { 437 __mod_zone_page_state(folio_zone(folio), item, -folio_nr_pages(folio)); 438 } 439 zone_stat_mod_folio(struct folio * folio,enum zone_stat_item item,long nr)440 static inline void zone_stat_mod_folio(struct folio *folio, 441 enum zone_stat_item item, long nr) 442 { 443 mod_zone_page_state(folio_zone(folio), item, nr); 444 } 445 zone_stat_add_folio(struct folio * folio,enum zone_stat_item item)446 static inline void zone_stat_add_folio(struct folio *folio, 447 enum zone_stat_item item) 448 { 449 mod_zone_page_state(folio_zone(folio), item, folio_nr_pages(folio)); 450 } 451 zone_stat_sub_folio(struct folio * folio,enum zone_stat_item item)452 static inline void zone_stat_sub_folio(struct folio *folio, 453 enum zone_stat_item item) 454 { 455 mod_zone_page_state(folio_zone(folio), item, -folio_nr_pages(folio)); 456 } 457 __node_stat_mod_folio(struct folio * folio,enum node_stat_item item,long nr)458 static inline void __node_stat_mod_folio(struct folio *folio, 459 enum node_stat_item item, long nr) 460 { 461 __mod_node_page_state(folio_pgdat(folio), item, nr); 462 } 463 __node_stat_add_folio(struct folio * folio,enum node_stat_item item)464 static inline void __node_stat_add_folio(struct folio *folio, 465 enum node_stat_item item) 466 { 467 __mod_node_page_state(folio_pgdat(folio), item, folio_nr_pages(folio)); 468 } 469 __node_stat_sub_folio(struct folio * folio,enum node_stat_item item)470 static inline void __node_stat_sub_folio(struct folio *folio, 471 enum node_stat_item item) 472 { 473 __mod_node_page_state(folio_pgdat(folio), item, -folio_nr_pages(folio)); 474 } 475 node_stat_mod_folio(struct folio * folio,enum node_stat_item item,long nr)476 static inline void node_stat_mod_folio(struct folio *folio, 477 enum node_stat_item item, long nr) 478 { 479 mod_node_page_state(folio_pgdat(folio), item, nr); 480 } 481 node_stat_add_folio(struct folio * folio,enum node_stat_item item)482 static inline void node_stat_add_folio(struct folio *folio, 483 enum node_stat_item item) 484 { 485 mod_node_page_state(folio_pgdat(folio), item, folio_nr_pages(folio)); 486 } 487 node_stat_sub_folio(struct folio * folio,enum node_stat_item item)488 static inline void node_stat_sub_folio(struct folio *folio, 489 enum node_stat_item item) 490 { 491 mod_node_page_state(folio_pgdat(folio), item, -folio_nr_pages(folio)); 492 } 493 494 extern const char * const vmstat_text[]; 495 zone_stat_name(enum zone_stat_item item)496 static inline const char *zone_stat_name(enum zone_stat_item item) 497 { 498 return vmstat_text[item]; 499 } 500 501 #ifdef CONFIG_NUMA numa_stat_name(enum numa_stat_item item)502 static inline const char *numa_stat_name(enum numa_stat_item item) 503 { 504 return vmstat_text[NR_VM_ZONE_STAT_ITEMS + 505 item]; 506 } 507 #endif /* CONFIG_NUMA */ 508 node_stat_name(enum node_stat_item item)509 static inline const char *node_stat_name(enum node_stat_item item) 510 { 511 return vmstat_text[NR_VM_ZONE_STAT_ITEMS + 512 NR_VM_NUMA_EVENT_ITEMS + 513 item]; 514 } 515 lru_list_name(enum lru_list lru)516 static inline const char *lru_list_name(enum lru_list lru) 517 { 518 return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_" 519 } 520 521 #if defined(CONFIG_VM_EVENT_COUNTERS) || defined(CONFIG_MEMCG) vm_event_name(enum vm_event_item item)522 static inline const char *vm_event_name(enum vm_event_item item) 523 { 524 return vmstat_text[NR_VM_ZONE_STAT_ITEMS + 525 NR_VM_NUMA_EVENT_ITEMS + 526 NR_VM_NODE_STAT_ITEMS + 527 NR_VM_STAT_ITEMS + 528 item]; 529 } 530 #endif /* CONFIG_VM_EVENT_COUNTERS || CONFIG_MEMCG */ 531 532 #ifdef CONFIG_MEMCG 533 534 void __mod_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx, 535 int val); 536 mod_lruvec_state(struct lruvec * lruvec,enum node_stat_item idx,int val)537 static inline void mod_lruvec_state(struct lruvec *lruvec, 538 enum node_stat_item idx, int val) 539 { 540 unsigned long flags; 541 542 local_irq_save(flags); 543 __mod_lruvec_state(lruvec, idx, val); 544 local_irq_restore(flags); 545 } 546 547 void __lruvec_stat_mod_folio(struct folio *folio, 548 enum node_stat_item idx, int val); 549 lruvec_stat_mod_folio(struct folio * folio,enum node_stat_item idx,int val)550 static inline void lruvec_stat_mod_folio(struct folio *folio, 551 enum node_stat_item idx, int val) 552 { 553 unsigned long flags; 554 555 local_irq_save(flags); 556 __lruvec_stat_mod_folio(folio, idx, val); 557 local_irq_restore(flags); 558 } 559 mod_lruvec_page_state(struct page * page,enum node_stat_item idx,int val)560 static inline void mod_lruvec_page_state(struct page *page, 561 enum node_stat_item idx, int val) 562 { 563 lruvec_stat_mod_folio(page_folio(page), idx, val); 564 } 565 566 #else 567 __mod_lruvec_state(struct lruvec * lruvec,enum node_stat_item idx,int val)568 static inline void __mod_lruvec_state(struct lruvec *lruvec, 569 enum node_stat_item idx, int val) 570 { 571 __mod_node_page_state(lruvec_pgdat(lruvec), idx, val); 572 } 573 mod_lruvec_state(struct lruvec * lruvec,enum node_stat_item idx,int val)574 static inline void mod_lruvec_state(struct lruvec *lruvec, 575 enum node_stat_item idx, int val) 576 { 577 mod_node_page_state(lruvec_pgdat(lruvec), idx, val); 578 } 579 __lruvec_stat_mod_folio(struct folio * folio,enum node_stat_item idx,int val)580 static inline void __lruvec_stat_mod_folio(struct folio *folio, 581 enum node_stat_item idx, int val) 582 { 583 __mod_node_page_state(folio_pgdat(folio), idx, val); 584 } 585 lruvec_stat_mod_folio(struct folio * folio,enum node_stat_item idx,int val)586 static inline void lruvec_stat_mod_folio(struct folio *folio, 587 enum node_stat_item idx, int val) 588 { 589 mod_node_page_state(folio_pgdat(folio), idx, val); 590 } 591 mod_lruvec_page_state(struct page * page,enum node_stat_item idx,int val)592 static inline void mod_lruvec_page_state(struct page *page, 593 enum node_stat_item idx, int val) 594 { 595 mod_node_page_state(page_pgdat(page), idx, val); 596 } 597 598 #endif /* CONFIG_MEMCG */ 599 __lruvec_stat_add_folio(struct folio * folio,enum node_stat_item idx)600 static inline void __lruvec_stat_add_folio(struct folio *folio, 601 enum node_stat_item idx) 602 { 603 __lruvec_stat_mod_folio(folio, idx, folio_nr_pages(folio)); 604 } 605 __lruvec_stat_sub_folio(struct folio * folio,enum node_stat_item idx)606 static inline void __lruvec_stat_sub_folio(struct folio *folio, 607 enum node_stat_item idx) 608 { 609 __lruvec_stat_mod_folio(folio, idx, -folio_nr_pages(folio)); 610 } 611 lruvec_stat_add_folio(struct folio * folio,enum node_stat_item idx)612 static inline void lruvec_stat_add_folio(struct folio *folio, 613 enum node_stat_item idx) 614 { 615 lruvec_stat_mod_folio(folio, idx, folio_nr_pages(folio)); 616 } 617 lruvec_stat_sub_folio(struct folio * folio,enum node_stat_item idx)618 static inline void lruvec_stat_sub_folio(struct folio *folio, 619 enum node_stat_item idx) 620 { 621 lruvec_stat_mod_folio(folio, idx, -folio_nr_pages(folio)); 622 } 623 624 void memmap_boot_pages_add(long delta); 625 void memmap_pages_add(long delta); 626 #endif /* _LINUX_VMSTAT_H */ 627