1
2#ifndef _LINUX_MMZONE_H
3#define _LINUX_MMZONE_H
4
5#ifndef __ASSEMBLY__
6#ifndef __GENERATING_BOUNDS_H
7
8#include <linux/spinlock.h>
9#include <linux/list.h>
10#include <linux/wait.h>
11#include <linux/bitops.h>
12#include <linux/cache.h>
13#include <linux/threads.h>
14#include <linux/numa.h>
15#include <linux/init.h>
16#include <linux/seqlock.h>
17#include <linux/nodemask.h>
18#include <linux/pageblock-flags.h>
19#include <linux/page-flags-layout.h>
20#include <linux/atomic.h>
21#include <linux/mm_types.h>
22#include <linux/page-flags.h>
23#include <linux/local_lock.h>
24#include <asm/page.h>
25
26
27#ifndef CONFIG_FORCE_MAX_ZONEORDER
28#define MAX_ORDER 11
29#else
30#define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER
31#endif
32#define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))
33
34
35
36
37
38
39
40#define PAGE_ALLOC_COSTLY_ORDER 3
41
42enum migratetype {
43 MIGRATE_UNMOVABLE,
44 MIGRATE_MOVABLE,
45 MIGRATE_RECLAIMABLE,
46 MIGRATE_PCPTYPES,
47 MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES,
48#ifdef CONFIG_CMA
49
50
51
52
53
54
55
56
57
58
59 MIGRATE_CMA,
60#endif
61#ifdef CONFIG_MEMORY_ISOLATION
62 MIGRATE_ISOLATE,
63#endif
64 MIGRATE_TYPES
65};
66
67
68extern const char * const migratetype_names[MIGRATE_TYPES];
69
70#ifdef CONFIG_CMA
71# define is_migrate_cma(migratetype) unlikely((migratetype) == MIGRATE_CMA)
72# define is_migrate_cma_page(_page) (get_pageblock_migratetype(_page) == MIGRATE_CMA)
73#else
74# define is_migrate_cma(migratetype) false
75# define is_migrate_cma_page(_page) false
76#endif
77
78static inline bool is_migrate_movable(int mt)
79{
80 return is_migrate_cma(mt) || mt == MIGRATE_MOVABLE;
81}
82
83
84
85
86
87
88
89static inline bool migratetype_is_mergeable(int mt)
90{
91 return mt < MIGRATE_PCPTYPES;
92}
93
94#define for_each_migratetype_order(order, type) \
95 for (order = 0; order < MAX_ORDER; order++) \
96 for (type = 0; type < MIGRATE_TYPES; type++)
97
98extern int page_group_by_mobility_disabled;
99
100#define MIGRATETYPE_MASK ((1UL << PB_migratetype_bits) - 1)
101
102#define get_pageblock_migratetype(page) \
103 get_pfnblock_flags_mask(page, page_to_pfn(page), MIGRATETYPE_MASK)
104
105struct free_area {
106 struct list_head free_list[MIGRATE_TYPES];
107 unsigned long nr_free;
108};
109
110static inline struct page *get_page_from_free_area(struct free_area *area,
111 int migratetype)
112{
113 return list_first_entry_or_null(&area->free_list[migratetype],
114 struct page, lru);
115}
116
117static inline bool free_area_empty(struct free_area *area, int migratetype)
118{
119 return list_empty(&area->free_list[migratetype]);
120}
121
122struct pglist_data;
123
124
125
126
127
128
129#if defined(CONFIG_SMP)
130struct zone_padding {
131 char x[0];
132} ____cacheline_internodealigned_in_smp;
133#define ZONE_PADDING(name) struct zone_padding name;
134#else
135#define ZONE_PADDING(name)
136#endif
137
138#ifdef CONFIG_NUMA
139enum numa_stat_item {
140 NUMA_HIT,
141 NUMA_MISS,
142 NUMA_FOREIGN,
143 NUMA_INTERLEAVE_HIT,
144 NUMA_LOCAL,
145 NUMA_OTHER,
146 NR_VM_NUMA_EVENT_ITEMS
147};
148#else
149#define NR_VM_NUMA_EVENT_ITEMS 0
150#endif
151
152enum zone_stat_item {
153
154 NR_FREE_PAGES,
155 NR_ZONE_LRU_BASE,
156 NR_ZONE_INACTIVE_ANON = NR_ZONE_LRU_BASE,
157 NR_ZONE_ACTIVE_ANON,
158 NR_ZONE_INACTIVE_FILE,
159 NR_ZONE_ACTIVE_FILE,
160 NR_ZONE_UNEVICTABLE,
161 NR_ZONE_WRITE_PENDING,
162 NR_MLOCK,
163
164 NR_BOUNCE,
165#if IS_ENABLED(CONFIG_ZSMALLOC)
166 NR_ZSPAGES,
167#endif
168 NR_FREE_CMA_PAGES,
169 NR_VM_ZONE_STAT_ITEMS };
170
171enum node_stat_item {
172 NR_LRU_BASE,
173 NR_INACTIVE_ANON = NR_LRU_BASE,
174 NR_ACTIVE_ANON,
175 NR_INACTIVE_FILE,
176 NR_ACTIVE_FILE,
177 NR_UNEVICTABLE,
178 NR_SLAB_RECLAIMABLE_B,
179 NR_SLAB_UNRECLAIMABLE_B,
180 NR_ISOLATED_ANON,
181 NR_ISOLATED_FILE,
182 WORKINGSET_NODES,
183 WORKINGSET_REFAULT_BASE,
184 WORKINGSET_REFAULT_ANON = WORKINGSET_REFAULT_BASE,
185 WORKINGSET_REFAULT_FILE,
186 WORKINGSET_ACTIVATE_BASE,
187 WORKINGSET_ACTIVATE_ANON = WORKINGSET_ACTIVATE_BASE,
188 WORKINGSET_ACTIVATE_FILE,
189 WORKINGSET_RESTORE_BASE,
190 WORKINGSET_RESTORE_ANON = WORKINGSET_RESTORE_BASE,
191 WORKINGSET_RESTORE_FILE,
192 WORKINGSET_NODERECLAIM,
193 NR_ANON_MAPPED,
194 NR_FILE_MAPPED,
195
196 NR_FILE_PAGES,
197 NR_FILE_DIRTY,
198 NR_WRITEBACK,
199 NR_WRITEBACK_TEMP,
200 NR_SHMEM,
201 NR_SHMEM_THPS,
202 NR_SHMEM_PMDMAPPED,
203 NR_FILE_THPS,
204 NR_FILE_PMDMAPPED,
205 NR_ANON_THPS,
206 NR_VMSCAN_WRITE,
207 NR_VMSCAN_IMMEDIATE,
208 NR_DIRTIED,
209 NR_WRITTEN,
210 NR_THROTTLED_WRITTEN,
211 NR_KERNEL_MISC_RECLAIMABLE,
212 NR_FOLL_PIN_ACQUIRED,
213 NR_FOLL_PIN_RELEASED,
214 NR_KERNEL_STACK_KB,
215#if IS_ENABLED(CONFIG_SHADOW_CALL_STACK)
216 NR_KERNEL_SCS_KB,
217#endif
218 NR_PAGETABLE,
219#ifdef CONFIG_SWAP
220 NR_SWAPCACHE,
221#endif
222#ifdef CONFIG_NUMA_BALANCING
223 PGPROMOTE_SUCCESS,
224#endif
225 NR_VM_NODE_STAT_ITEMS
226};
227
228
229
230
231
232
233static __always_inline bool vmstat_item_print_in_thp(enum node_stat_item item)
234{
235 if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE))
236 return false;
237
238 return item == NR_ANON_THPS ||
239 item == NR_FILE_THPS ||
240 item == NR_SHMEM_THPS ||
241 item == NR_SHMEM_PMDMAPPED ||
242 item == NR_FILE_PMDMAPPED;
243}
244
245
246
247
248
249
250static __always_inline bool vmstat_item_in_bytes(int idx)
251{
252
253
254
255
256
257
258
259
260
261 return (idx == NR_SLAB_RECLAIMABLE_B ||
262 idx == NR_SLAB_UNRECLAIMABLE_B);
263}
264
265
266
267
268
269
270
271
272
273
274#define LRU_BASE 0
275#define LRU_ACTIVE 1
276#define LRU_FILE 2
277
278enum lru_list {
279 LRU_INACTIVE_ANON = LRU_BASE,
280 LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,
281 LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,
282 LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
283 LRU_UNEVICTABLE,
284 NR_LRU_LISTS
285};
286
287enum vmscan_throttle_state {
288 VMSCAN_THROTTLE_WRITEBACK,
289 VMSCAN_THROTTLE_ISOLATED,
290 VMSCAN_THROTTLE_NOPROGRESS,
291 VMSCAN_THROTTLE_CONGESTED,
292 NR_VMSCAN_THROTTLE,
293};
294
295#define for_each_lru(lru) for (lru = 0; lru < NR_LRU_LISTS; lru++)
296
297#define for_each_evictable_lru(lru) for (lru = 0; lru <= LRU_ACTIVE_FILE; lru++)
298
299static inline bool is_file_lru(enum lru_list lru)
300{
301 return (lru == LRU_INACTIVE_FILE || lru == LRU_ACTIVE_FILE);
302}
303
304static inline bool is_active_lru(enum lru_list lru)
305{
306 return (lru == LRU_ACTIVE_ANON || lru == LRU_ACTIVE_FILE);
307}
308
309#define ANON_AND_FILE 2
310
311enum lruvec_flags {
312 LRUVEC_CONGESTED,
313
314
315};
316
317struct lruvec {
318 struct list_head lists[NR_LRU_LISTS];
319
320 spinlock_t lru_lock;
321
322
323
324
325
326 unsigned long anon_cost;
327 unsigned long file_cost;
328
329 atomic_long_t nonresident_age;
330
331 unsigned long refaults[ANON_AND_FILE];
332
333 unsigned long flags;
334#ifdef CONFIG_MEMCG
335 struct pglist_data *pgdat;
336#endif
337};
338
339
340#define ISOLATE_UNMAPPED ((__force isolate_mode_t)0x2)
341
342#define ISOLATE_ASYNC_MIGRATE ((__force isolate_mode_t)0x4)
343
344#define ISOLATE_UNEVICTABLE ((__force isolate_mode_t)0x8)
345
346
347typedef unsigned __bitwise isolate_mode_t;
348
349enum zone_watermarks {
350 WMARK_MIN,
351 WMARK_LOW,
352 WMARK_HIGH,
353 WMARK_PROMO,
354 NR_WMARK
355};
356
357
358
359
360
361#ifdef CONFIG_TRANSPARENT_HUGEPAGE
362#define NR_PCP_THP 1
363#else
364#define NR_PCP_THP 0
365#endif
366#define NR_PCP_LISTS (MIGRATE_PCPTYPES * (PAGE_ALLOC_COSTLY_ORDER + 1 + NR_PCP_THP))
367
368
369
370
371
372#define NR_PCP_ORDER_WIDTH 8
373#define NR_PCP_ORDER_MASK ((1<<NR_PCP_ORDER_WIDTH) - 1)
374
375#define min_wmark_pages(z) (z->_watermark[WMARK_MIN] + z->watermark_boost)
376#define low_wmark_pages(z) (z->_watermark[WMARK_LOW] + z->watermark_boost)
377#define high_wmark_pages(z) (z->_watermark[WMARK_HIGH] + z->watermark_boost)
378#define wmark_pages(z, i) (z->_watermark[i] + z->watermark_boost)
379
380
381struct per_cpu_pages {
382 int count;
383 int high;
384 int batch;
385 short free_factor;
386#ifdef CONFIG_NUMA
387 short expire;
388#endif
389
390
391 struct list_head lists[NR_PCP_LISTS];
392};
393
394struct per_cpu_zonestat {
395#ifdef CONFIG_SMP
396 s8 vm_stat_diff[NR_VM_ZONE_STAT_ITEMS];
397 s8 stat_threshold;
398#endif
399#ifdef CONFIG_NUMA
400
401
402
403
404
405 unsigned long vm_numa_event[NR_VM_NUMA_EVENT_ITEMS];
406#endif
407};
408
409struct per_cpu_nodestat {
410 s8 stat_threshold;
411 s8 vm_node_stat_diff[NR_VM_NODE_STAT_ITEMS];
412};
413
414#endif
415
416enum zone_type {
417
418
419
420
421
422
423
424
425
426
427#ifdef CONFIG_ZONE_DMA
428 ZONE_DMA,
429#endif
430#ifdef CONFIG_ZONE_DMA32
431 ZONE_DMA32,
432#endif
433
434
435
436
437
438 ZONE_NORMAL,
439#ifdef CONFIG_HIGHMEM
440
441
442
443
444
445
446
447
448 ZONE_HIGHMEM,
449#endif
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499 ZONE_MOVABLE,
500#ifdef CONFIG_ZONE_DEVICE
501 ZONE_DEVICE,
502#endif
503 __MAX_NR_ZONES
504
505};
506
507#ifndef __GENERATING_BOUNDS_H
508
509#define ASYNC_AND_SYNC 2
510
511struct zone {
512
513
514
515 unsigned long _watermark[NR_WMARK];
516 unsigned long watermark_boost;
517
518 unsigned long nr_reserved_highatomic;
519
520
521
522
523
524
525
526
527
528
529 long lowmem_reserve[MAX_NR_ZONES];
530
531#ifdef CONFIG_NUMA
532 int node;
533#endif
534 struct pglist_data *zone_pgdat;
535 struct per_cpu_pages __percpu *per_cpu_pageset;
536 struct per_cpu_zonestat __percpu *per_cpu_zonestats;
537
538
539
540
541 int pageset_high;
542 int pageset_batch;
543
544#ifndef CONFIG_SPARSEMEM
545
546
547
548
549 unsigned long *pageblock_flags;
550#endif
551
552
553 unsigned long zone_start_pfn;
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597 atomic_long_t managed_pages;
598 unsigned long spanned_pages;
599 unsigned long present_pages;
600#if defined(CONFIG_MEMORY_HOTPLUG)
601 unsigned long present_early_pages;
602#endif
603#ifdef CONFIG_CMA
604 unsigned long cma_pages;
605#endif
606
607 const char *name;
608
609#ifdef CONFIG_MEMORY_ISOLATION
610
611
612
613
614
615 unsigned long nr_isolate_pageblock;
616#endif
617
618#ifdef CONFIG_MEMORY_HOTPLUG
619
620 seqlock_t span_seqlock;
621#endif
622
623 int initialized;
624
625
626 ZONE_PADDING(_pad1_)
627
628
629 struct free_area free_area[MAX_ORDER];
630
631
632 unsigned long flags;
633
634
635 spinlock_t lock;
636
637
638 ZONE_PADDING(_pad2_)
639
640
641
642
643
644
645 unsigned long percpu_drift_mark;
646
647#if defined CONFIG_COMPACTION || defined CONFIG_CMA
648
649 unsigned long compact_cached_free_pfn;
650
651 unsigned long compact_cached_migrate_pfn[ASYNC_AND_SYNC];
652 unsigned long compact_init_migrate_pfn;
653 unsigned long compact_init_free_pfn;
654#endif
655
656#ifdef CONFIG_COMPACTION
657
658
659
660
661
662
663 unsigned int compact_considered;
664 unsigned int compact_defer_shift;
665 int compact_order_failed;
666#endif
667
668#if defined CONFIG_COMPACTION || defined CONFIG_CMA
669
670 bool compact_blockskip_flush;
671#endif
672
673 bool contiguous;
674
675 ZONE_PADDING(_pad3_)
676
677 atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS];
678 atomic_long_t vm_numa_event[NR_VM_NUMA_EVENT_ITEMS];
679} ____cacheline_internodealigned_in_smp;
680
681enum pgdat_flags {
682 PGDAT_DIRTY,
683
684
685
686 PGDAT_WRITEBACK,
687
688
689 PGDAT_RECLAIM_LOCKED,
690};
691
692enum zone_flags {
693 ZONE_BOOSTED_WATERMARK,
694
695
696 ZONE_RECLAIM_ACTIVE,
697};
698
699static inline unsigned long zone_managed_pages(struct zone *zone)
700{
701 return (unsigned long)atomic_long_read(&zone->managed_pages);
702}
703
704static inline unsigned long zone_cma_pages(struct zone *zone)
705{
706#ifdef CONFIG_CMA
707 return zone->cma_pages;
708#else
709 return 0;
710#endif
711}
712
713static inline unsigned long zone_end_pfn(const struct zone *zone)
714{
715 return zone->zone_start_pfn + zone->spanned_pages;
716}
717
718static inline bool zone_spans_pfn(const struct zone *zone, unsigned long pfn)
719{
720 return zone->zone_start_pfn <= pfn && pfn < zone_end_pfn(zone);
721}
722
723static inline bool zone_is_initialized(struct zone *zone)
724{
725 return zone->initialized;
726}
727
728static inline bool zone_is_empty(struct zone *zone)
729{
730 return zone->spanned_pages == 0;
731}
732
733
734
735
736
737static inline bool zone_intersects(struct zone *zone,
738 unsigned long start_pfn, unsigned long nr_pages)
739{
740 if (zone_is_empty(zone))
741 return false;
742 if (start_pfn >= zone_end_pfn(zone) ||
743 start_pfn + nr_pages <= zone->zone_start_pfn)
744 return false;
745
746 return true;
747}
748
749
750
751
752
753
754#define DEF_PRIORITY 12
755
756
757#define MAX_ZONES_PER_ZONELIST (MAX_NUMNODES * MAX_NR_ZONES)
758
759enum {
760 ZONELIST_FALLBACK,
761#ifdef CONFIG_NUMA
762
763
764
765
766 ZONELIST_NOFALLBACK,
767#endif
768 MAX_ZONELISTS
769};
770
771
772
773
774
775struct zoneref {
776 struct zone *zone;
777 int zone_idx;
778};
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794struct zonelist {
795 struct zoneref _zonerefs[MAX_ZONES_PER_ZONELIST + 1];
796};
797
798
799
800
801
802
803extern struct page *mem_map;
804
805#ifdef CONFIG_TRANSPARENT_HUGEPAGE
806struct deferred_split {
807 spinlock_t split_queue_lock;
808 struct list_head split_queue;
809 unsigned long split_queue_len;
810};
811#endif
812
813
814
815
816
817
818
819
820
821typedef struct pglist_data {
822
823
824
825
826
827 struct zone node_zones[MAX_NR_ZONES];
828
829
830
831
832
833
834 struct zonelist node_zonelists[MAX_ZONELISTS];
835
836 int nr_zones;
837#ifdef CONFIG_FLATMEM
838 struct page *node_mem_map;
839#ifdef CONFIG_PAGE_EXTENSION
840 struct page_ext *node_page_ext;
841#endif
842#endif
843#if defined(CONFIG_MEMORY_HOTPLUG) || defined(CONFIG_DEFERRED_STRUCT_PAGE_INIT)
844
845
846
847
848
849
850
851
852
853
854
855
856 spinlock_t node_size_lock;
857#endif
858 unsigned long node_start_pfn;
859 unsigned long node_present_pages;
860 unsigned long node_spanned_pages;
861
862 int node_id;
863 wait_queue_head_t kswapd_wait;
864 wait_queue_head_t pfmemalloc_wait;
865
866
867 wait_queue_head_t reclaim_wait[NR_VMSCAN_THROTTLE];
868
869 atomic_t nr_writeback_throttled;
870 unsigned long nr_reclaim_start;
871
872 struct task_struct *kswapd;
873
874 int kswapd_order;
875 enum zone_type kswapd_highest_zoneidx;
876
877 int kswapd_failures;
878
879#ifdef CONFIG_COMPACTION
880 int kcompactd_max_order;
881 enum zone_type kcompactd_highest_zoneidx;
882 wait_queue_head_t kcompactd_wait;
883 struct task_struct *kcompactd;
884 bool proactive_compact_trigger;
885#endif
886
887
888
889
890 unsigned long totalreserve_pages;
891
892#ifdef CONFIG_NUMA
893
894
895
896 unsigned long min_unmapped_pages;
897 unsigned long min_slab_pages;
898#endif
899
900
901 ZONE_PADDING(_pad1_)
902
903#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
904
905
906
907
908 unsigned long first_deferred_pfn;
909#endif
910
911#ifdef CONFIG_TRANSPARENT_HUGEPAGE
912 struct deferred_split deferred_split_queue;
913#endif
914
915
916
917
918
919
920
921
922 struct lruvec __lruvec;
923
924 unsigned long flags;
925
926 ZONE_PADDING(_pad2_)
927
928
929 struct per_cpu_nodestat __percpu *per_cpu_nodestats;
930 atomic_long_t vm_stat[NR_VM_NODE_STAT_ITEMS];
931} pg_data_t;
932
933#define node_present_pages(nid) (NODE_DATA(nid)->node_present_pages)
934#define node_spanned_pages(nid) (NODE_DATA(nid)->node_spanned_pages)
935
936#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
937#define node_end_pfn(nid) pgdat_end_pfn(NODE_DATA(nid))
938
939static inline unsigned long pgdat_end_pfn(pg_data_t *pgdat)
940{
941 return pgdat->node_start_pfn + pgdat->node_spanned_pages;
942}
943
944static inline bool pgdat_is_empty(pg_data_t *pgdat)
945{
946 return !pgdat->node_start_pfn && !pgdat->node_spanned_pages;
947}
948
949#include <linux/memory_hotplug.h>
950
951void build_all_zonelists(pg_data_t *pgdat);
952void wakeup_kswapd(struct zone *zone, gfp_t gfp_mask, int order,
953 enum zone_type highest_zoneidx);
954bool __zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark,
955 int highest_zoneidx, unsigned int alloc_flags,
956 long free_pages);
957bool zone_watermark_ok(struct zone *z, unsigned int order,
958 unsigned long mark, int highest_zoneidx,
959 unsigned int alloc_flags);
960bool zone_watermark_ok_safe(struct zone *z, unsigned int order,
961 unsigned long mark, int highest_zoneidx);
962
963
964
965
966enum meminit_context {
967 MEMINIT_EARLY,
968 MEMINIT_HOTPLUG,
969};
970
971extern void init_currently_empty_zone(struct zone *zone, unsigned long start_pfn,
972 unsigned long size);
973
974extern void lruvec_init(struct lruvec *lruvec);
975
976static inline struct pglist_data *lruvec_pgdat(struct lruvec *lruvec)
977{
978#ifdef CONFIG_MEMCG
979 return lruvec->pgdat;
980#else
981 return container_of(lruvec, struct pglist_data, __lruvec);
982#endif
983}
984
985#ifdef CONFIG_HAVE_MEMORYLESS_NODES
986int local_memory_node(int node_id);
987#else
988static inline int local_memory_node(int node_id) { return node_id; };
989#endif
990
991
992
993
994#define zone_idx(zone) ((zone) - (zone)->zone_pgdat->node_zones)
995
996#ifdef CONFIG_ZONE_DEVICE
997static inline bool zone_is_zone_device(struct zone *zone)
998{
999 return zone_idx(zone) == ZONE_DEVICE;
1000}
1001#else
1002static inline bool zone_is_zone_device(struct zone *zone)
1003{
1004 return false;
1005}
1006#endif
1007
1008
1009
1010
1011
1012
1013
1014static inline bool managed_zone(struct zone *zone)
1015{
1016 return zone_managed_pages(zone);
1017}
1018
1019
1020static inline bool populated_zone(struct zone *zone)
1021{
1022 return zone->present_pages;
1023}
1024
1025#ifdef CONFIG_NUMA
1026static inline int zone_to_nid(struct zone *zone)
1027{
1028 return zone->node;
1029}
1030
1031static inline void zone_set_nid(struct zone *zone, int nid)
1032{
1033 zone->node = nid;
1034}
1035#else
1036static inline int zone_to_nid(struct zone *zone)
1037{
1038 return 0;
1039}
1040
1041static inline void zone_set_nid(struct zone *zone, int nid) {}
1042#endif
1043
1044extern int movable_zone;
1045
1046static inline int is_highmem_idx(enum zone_type idx)
1047{
1048#ifdef CONFIG_HIGHMEM
1049 return (idx == ZONE_HIGHMEM ||
1050 (idx == ZONE_MOVABLE && movable_zone == ZONE_HIGHMEM));
1051#else
1052 return 0;
1053#endif
1054}
1055
1056#ifdef CONFIG_ZONE_DMA
1057bool has_managed_dma(void);
1058#else
1059static inline bool has_managed_dma(void)
1060{
1061 return false;
1062}
1063#endif
1064
1065
1066
1067
1068
1069
1070
1071
1072static inline int is_highmem(struct zone *zone)
1073{
1074#ifdef CONFIG_HIGHMEM
1075 return is_highmem_idx(zone_idx(zone));
1076#else
1077 return 0;
1078#endif
1079}
1080
1081
1082struct ctl_table;
1083
1084int min_free_kbytes_sysctl_handler(struct ctl_table *, int, void *, size_t *,
1085 loff_t *);
1086int watermark_scale_factor_sysctl_handler(struct ctl_table *, int, void *,
1087 size_t *, loff_t *);
1088extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES];
1089int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int, void *,
1090 size_t *, loff_t *);
1091int percpu_pagelist_high_fraction_sysctl_handler(struct ctl_table *, int,
1092 void *, size_t *, loff_t *);
1093int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *, int,
1094 void *, size_t *, loff_t *);
1095int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *, int,
1096 void *, size_t *, loff_t *);
1097int numa_zonelist_order_handler(struct ctl_table *, int,
1098 void *, size_t *, loff_t *);
1099extern int percpu_pagelist_high_fraction;
1100extern char numa_zonelist_order[];
1101#define NUMA_ZONELIST_ORDER_LEN 16
1102
1103#ifndef CONFIG_NUMA
1104
1105extern struct pglist_data contig_page_data;
1106static inline struct pglist_data *NODE_DATA(int nid)
1107{
1108 return &contig_page_data;
1109}
1110
1111#else
1112
1113#include <asm/mmzone.h>
1114
1115#endif
1116
1117extern struct pglist_data *first_online_pgdat(void);
1118extern struct pglist_data *next_online_pgdat(struct pglist_data *pgdat);
1119extern struct zone *next_zone(struct zone *zone);
1120
1121
1122
1123
1124
1125#define for_each_online_pgdat(pgdat) \
1126 for (pgdat = first_online_pgdat(); \
1127 pgdat; \
1128 pgdat = next_online_pgdat(pgdat))
1129
1130
1131
1132
1133
1134
1135
1136#define for_each_zone(zone) \
1137 for (zone = (first_online_pgdat())->node_zones; \
1138 zone; \
1139 zone = next_zone(zone))
1140
1141#define for_each_populated_zone(zone) \
1142 for (zone = (first_online_pgdat())->node_zones; \
1143 zone; \
1144 zone = next_zone(zone)) \
1145 if (!populated_zone(zone)) \
1146 ; \
1147 else
1148
1149static inline struct zone *zonelist_zone(struct zoneref *zoneref)
1150{
1151 return zoneref->zone;
1152}
1153
1154static inline int zonelist_zone_idx(struct zoneref *zoneref)
1155{
1156 return zoneref->zone_idx;
1157}
1158
1159static inline int zonelist_node_idx(struct zoneref *zoneref)
1160{
1161 return zone_to_nid(zoneref->zone);
1162}
1163
1164struct zoneref *__next_zones_zonelist(struct zoneref *z,
1165 enum zone_type highest_zoneidx,
1166 nodemask_t *nodes);
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183static __always_inline struct zoneref *next_zones_zonelist(struct zoneref *z,
1184 enum zone_type highest_zoneidx,
1185 nodemask_t *nodes)
1186{
1187 if (likely(!nodes && zonelist_zone_idx(z) <= highest_zoneidx))
1188 return z;
1189 return __next_zones_zonelist(z, highest_zoneidx, nodes);
1190}
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209static inline struct zoneref *first_zones_zonelist(struct zonelist *zonelist,
1210 enum zone_type highest_zoneidx,
1211 nodemask_t *nodes)
1212{
1213 return next_zones_zonelist(zonelist->_zonerefs,
1214 highest_zoneidx, nodes);
1215}
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228#define for_each_zone_zonelist_nodemask(zone, z, zlist, highidx, nodemask) \
1229 for (z = first_zones_zonelist(zlist, highidx, nodemask), zone = zonelist_zone(z); \
1230 zone; \
1231 z = next_zones_zonelist(++z, highidx, nodemask), \
1232 zone = zonelist_zone(z))
1233
1234#define for_next_zone_zonelist_nodemask(zone, z, highidx, nodemask) \
1235 for (zone = z->zone; \
1236 zone; \
1237 z = next_zones_zonelist(++z, highidx, nodemask), \
1238 zone = zonelist_zone(z))
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250#define for_each_zone_zonelist(zone, z, zlist, highidx) \
1251 for_each_zone_zonelist_nodemask(zone, z, zlist, highidx, NULL)
1252
1253
1254static inline bool movable_only_nodes(nodemask_t *nodes)
1255{
1256 struct zonelist *zonelist;
1257 struct zoneref *z;
1258 int nid;
1259
1260 if (nodes_empty(*nodes))
1261 return false;
1262
1263
1264
1265
1266
1267
1268 nid = first_node(*nodes);
1269 zonelist = &NODE_DATA(nid)->node_zonelists[ZONELIST_FALLBACK];
1270 z = first_zones_zonelist(zonelist, ZONE_NORMAL, nodes);
1271 return (!z->zone) ? true : false;
1272}
1273
1274
1275#ifdef CONFIG_SPARSEMEM
1276#include <asm/sparsemem.h>
1277#endif
1278
1279#ifdef CONFIG_FLATMEM
1280#define pfn_to_nid(pfn) (0)
1281#endif
1282
1283#ifdef CONFIG_SPARSEMEM
1284
1285
1286
1287
1288
1289#define PA_SECTION_SHIFT (SECTION_SIZE_BITS)
1290#define PFN_SECTION_SHIFT (SECTION_SIZE_BITS - PAGE_SHIFT)
1291
1292#define NR_MEM_SECTIONS (1UL << SECTIONS_SHIFT)
1293
1294#define PAGES_PER_SECTION (1UL << PFN_SECTION_SHIFT)
1295#define PAGE_SECTION_MASK (~(PAGES_PER_SECTION-1))
1296
1297#define SECTION_BLOCKFLAGS_BITS \
1298 ((1UL << (PFN_SECTION_SHIFT - pageblock_order)) * NR_PAGEBLOCK_BITS)
1299
1300#if (MAX_ORDER - 1 + PAGE_SHIFT) > SECTION_SIZE_BITS
1301#error Allocator MAX_ORDER exceeds SECTION_SIZE
1302#endif
1303
1304static inline unsigned long pfn_to_section_nr(unsigned long pfn)
1305{
1306 return pfn >> PFN_SECTION_SHIFT;
1307}
1308static inline unsigned long section_nr_to_pfn(unsigned long sec)
1309{
1310 return sec << PFN_SECTION_SHIFT;
1311}
1312
1313#define SECTION_ALIGN_UP(pfn) (((pfn) + PAGES_PER_SECTION - 1) & PAGE_SECTION_MASK)
1314#define SECTION_ALIGN_DOWN(pfn) ((pfn) & PAGE_SECTION_MASK)
1315
1316#define SUBSECTION_SHIFT 21
1317#define SUBSECTION_SIZE (1UL << SUBSECTION_SHIFT)
1318
1319#define PFN_SUBSECTION_SHIFT (SUBSECTION_SHIFT - PAGE_SHIFT)
1320#define PAGES_PER_SUBSECTION (1UL << PFN_SUBSECTION_SHIFT)
1321#define PAGE_SUBSECTION_MASK (~(PAGES_PER_SUBSECTION-1))
1322
1323#if SUBSECTION_SHIFT > SECTION_SIZE_BITS
1324#error Subsection size exceeds section size
1325#else
1326#define SUBSECTIONS_PER_SECTION (1UL << (SECTION_SIZE_BITS - SUBSECTION_SHIFT))
1327#endif
1328
1329#define SUBSECTION_ALIGN_UP(pfn) ALIGN((pfn), PAGES_PER_SUBSECTION)
1330#define SUBSECTION_ALIGN_DOWN(pfn) ((pfn) & PAGE_SUBSECTION_MASK)
1331
1332struct mem_section_usage {
1333#ifdef CONFIG_SPARSEMEM_VMEMMAP
1334 DECLARE_BITMAP(subsection_map, SUBSECTIONS_PER_SECTION);
1335#endif
1336
1337 unsigned long pageblock_flags[0];
1338};
1339
1340void subsection_map_init(unsigned long pfn, unsigned long nr_pages);
1341
1342struct page;
1343struct page_ext;
1344struct mem_section {
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357 unsigned long section_mem_map;
1358
1359 struct mem_section_usage *usage;
1360#ifdef CONFIG_PAGE_EXTENSION
1361
1362
1363
1364
1365 struct page_ext *page_ext;
1366 unsigned long pad;
1367#endif
1368
1369
1370
1371
1372};
1373
1374#ifdef CONFIG_SPARSEMEM_EXTREME
1375#define SECTIONS_PER_ROOT (PAGE_SIZE / sizeof (struct mem_section))
1376#else
1377#define SECTIONS_PER_ROOT 1
1378#endif
1379
1380#define SECTION_NR_TO_ROOT(sec) ((sec) / SECTIONS_PER_ROOT)
1381#define NR_SECTION_ROOTS DIV_ROUND_UP(NR_MEM_SECTIONS, SECTIONS_PER_ROOT)
1382#define SECTION_ROOT_MASK (SECTIONS_PER_ROOT - 1)
1383
1384#ifdef CONFIG_SPARSEMEM_EXTREME
1385extern struct mem_section **mem_section;
1386#else
1387extern struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT];
1388#endif
1389
1390static inline unsigned long *section_to_usemap(struct mem_section *ms)
1391{
1392 return ms->usage->pageblock_flags;
1393}
1394
1395static inline struct mem_section *__nr_to_section(unsigned long nr)
1396{
1397 unsigned long root = SECTION_NR_TO_ROOT(nr);
1398
1399 if (unlikely(root >= NR_SECTION_ROOTS))
1400 return NULL;
1401
1402#ifdef CONFIG_SPARSEMEM_EXTREME
1403 if (!mem_section || !mem_section[root])
1404 return NULL;
1405#endif
1406 return &mem_section[root][nr & SECTION_ROOT_MASK];
1407}
1408extern size_t mem_section_usage_size(void);
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423#define SECTION_MARKED_PRESENT (1UL<<0)
1424#define SECTION_HAS_MEM_MAP (1UL<<1)
1425#define SECTION_IS_ONLINE (1UL<<2)
1426#define SECTION_IS_EARLY (1UL<<3)
1427#define SECTION_TAINT_ZONE_DEVICE (1UL<<4)
1428#define SECTION_MAP_LAST_BIT (1UL<<5)
1429#define SECTION_MAP_MASK (~(SECTION_MAP_LAST_BIT-1))
1430#define SECTION_NID_SHIFT 6
1431
1432static inline struct page *__section_mem_map_addr(struct mem_section *section)
1433{
1434 unsigned long map = section->section_mem_map;
1435 map &= SECTION_MAP_MASK;
1436 return (struct page *)map;
1437}
1438
1439static inline int present_section(struct mem_section *section)
1440{
1441 return (section && (section->section_mem_map & SECTION_MARKED_PRESENT));
1442}
1443
1444static inline int present_section_nr(unsigned long nr)
1445{
1446 return present_section(__nr_to_section(nr));
1447}
1448
1449static inline int valid_section(struct mem_section *section)
1450{
1451 return (section && (section->section_mem_map & SECTION_HAS_MEM_MAP));
1452}
1453
1454static inline int early_section(struct mem_section *section)
1455{
1456 return (section && (section->section_mem_map & SECTION_IS_EARLY));
1457}
1458
1459static inline int valid_section_nr(unsigned long nr)
1460{
1461 return valid_section(__nr_to_section(nr));
1462}
1463
1464static inline int online_section(struct mem_section *section)
1465{
1466 return (section && (section->section_mem_map & SECTION_IS_ONLINE));
1467}
1468
1469static inline int online_device_section(struct mem_section *section)
1470{
1471 unsigned long flags = SECTION_IS_ONLINE | SECTION_TAINT_ZONE_DEVICE;
1472
1473 return section && ((section->section_mem_map & flags) == flags);
1474}
1475
1476static inline int online_section_nr(unsigned long nr)
1477{
1478 return online_section(__nr_to_section(nr));
1479}
1480
1481#ifdef CONFIG_MEMORY_HOTPLUG
1482void online_mem_sections(unsigned long start_pfn, unsigned long end_pfn);
1483void offline_mem_sections(unsigned long start_pfn, unsigned long end_pfn);
1484#endif
1485
1486static inline struct mem_section *__pfn_to_section(unsigned long pfn)
1487{
1488 return __nr_to_section(pfn_to_section_nr(pfn));
1489}
1490
1491extern unsigned long __highest_present_section_nr;
1492
1493static inline int subsection_map_index(unsigned long pfn)
1494{
1495 return (pfn & ~(PAGE_SECTION_MASK)) / PAGES_PER_SUBSECTION;
1496}
1497
1498#ifdef CONFIG_SPARSEMEM_VMEMMAP
1499static inline int pfn_section_valid(struct mem_section *ms, unsigned long pfn)
1500{
1501 int idx = subsection_map_index(pfn);
1502
1503 return test_bit(idx, ms->usage->subsection_map);
1504}
1505#else
1506static inline int pfn_section_valid(struct mem_section *ms, unsigned long pfn)
1507{
1508 return 1;
1509}
1510#endif
1511
1512#ifndef CONFIG_HAVE_ARCH_PFN_VALID
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524static inline int pfn_valid(unsigned long pfn)
1525{
1526 struct mem_section *ms;
1527
1528
1529
1530
1531
1532
1533
1534 if (PHYS_PFN(PFN_PHYS(pfn)) != pfn)
1535 return 0;
1536
1537 if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
1538 return 0;
1539 ms = __pfn_to_section(pfn);
1540 if (!valid_section(ms))
1541 return 0;
1542
1543
1544
1545
1546 return early_section(ms) || pfn_section_valid(ms, pfn);
1547}
1548#endif
1549
1550static inline int pfn_in_present_section(unsigned long pfn)
1551{
1552 if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
1553 return 0;
1554 return present_section(__pfn_to_section(pfn));
1555}
1556
1557static inline unsigned long next_present_section_nr(unsigned long section_nr)
1558{
1559 while (++section_nr <= __highest_present_section_nr) {
1560 if (present_section_nr(section_nr))
1561 return section_nr;
1562 }
1563
1564 return -1;
1565}
1566
1567
1568
1569
1570
1571
1572#ifdef CONFIG_NUMA
1573#define pfn_to_nid(pfn) \
1574({ \
1575 unsigned long __pfn_to_nid_pfn = (pfn); \
1576 page_to_nid(pfn_to_page(__pfn_to_nid_pfn)); \
1577})
1578#else
1579#define pfn_to_nid(pfn) (0)
1580#endif
1581
1582void sparse_init(void);
1583#else
1584#define sparse_init() do {} while (0)
1585#define sparse_index_init(_sec, _nid) do {} while (0)
1586#define pfn_in_present_section pfn_valid
1587#define subsection_map_init(_pfn, _nr_pages) do {} while (0)
1588#endif
1589
1590#endif
1591#endif
1592#endif
1593