1#ifndef _LINUX_MMZONE_H
2#define _LINUX_MMZONE_H
3
4#ifndef __ASSEMBLY__
5#ifndef __GENERATING_BOUNDS_H
6
7#include <linux/spinlock.h>
8#include <linux/list.h>
9#include <linux/wait.h>
10#include <linux/bitops.h>
11#include <linux/cache.h>
12#include <linux/threads.h>
13#include <linux/numa.h>
14#include <linux/init.h>
15#include <linux/seqlock.h>
16#include <linux/nodemask.h>
17#include <linux/pageblock-flags.h>
18#include <generated/bounds.h>
19#include <linux/atomic.h>
20#include <asm/page.h>
21
22
23#ifndef CONFIG_FORCE_MAX_ZONEORDER
24#define MAX_ORDER 11
25#else
26#define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER
27#endif
28#define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))
29
30
31
32
33
34
35
36#define PAGE_ALLOC_COSTLY_ORDER 3
37
38enum {
39 MIGRATE_UNMOVABLE,
40 MIGRATE_RECLAIMABLE,
41 MIGRATE_MOVABLE,
42 MIGRATE_PCPTYPES,
43 MIGRATE_RESERVE = MIGRATE_PCPTYPES,
44#ifdef CONFIG_CMA
45
46
47
48
49
50
51
52
53
54
55
56
57
58 MIGRATE_CMA,
59#endif
60 MIGRATE_ISOLATE,
61 MIGRATE_TYPES
62};
63
64#ifdef CONFIG_CMA
65# define is_migrate_cma(migratetype) unlikely((migratetype) == MIGRATE_CMA)
66# define cma_wmark_pages(zone) zone->min_cma_pages
67#else
68# define is_migrate_cma(migratetype) false
69# define cma_wmark_pages(zone) 0
70#endif
71
72#define for_each_migratetype_order(order, type) \
73 for (order = 0; order < MAX_ORDER; order++) \
74 for (type = 0; type < MIGRATE_TYPES; type++)
75
76extern int page_group_by_mobility_disabled;
77
78static inline int get_pageblock_migratetype(struct page *page)
79{
80 return get_pageblock_flags_group(page, PB_migrate, PB_migrate_end);
81}
82
83struct free_area {
84 struct list_head free_list[MIGRATE_TYPES];
85 unsigned long nr_free;
86};
87
88struct pglist_data;
89
90
91
92
93
94
95
96#if defined(CONFIG_SMP)
97struct zone_padding {
98 char x[0];
99} ____cacheline_internodealigned_in_smp;
100#define ZONE_PADDING(name) struct zone_padding name;
101#else
102#define ZONE_PADDING(name)
103#endif
104
105enum zone_stat_item {
106
107 NR_FREE_PAGES,
108 NR_LRU_BASE,
109 NR_INACTIVE_ANON = NR_LRU_BASE,
110 NR_ACTIVE_ANON,
111 NR_INACTIVE_FILE,
112 NR_ACTIVE_FILE,
113 NR_UNEVICTABLE,
114 NR_MLOCK,
115 NR_ANON_PAGES,
116 NR_FILE_MAPPED,
117
118 NR_FILE_PAGES,
119 NR_FILE_DIRTY,
120 NR_WRITEBACK,
121 NR_SLAB_RECLAIMABLE,
122 NR_SLAB_UNRECLAIMABLE,
123 NR_PAGETABLE,
124 NR_KERNEL_STACK,
125
126 NR_UNSTABLE_NFS,
127 NR_BOUNCE,
128 NR_VMSCAN_WRITE,
129 NR_VMSCAN_IMMEDIATE,
130 NR_WRITEBACK_TEMP,
131 NR_ISOLATED_ANON,
132 NR_ISOLATED_FILE,
133 NR_SHMEM,
134 NR_DIRTIED,
135 NR_WRITTEN,
136#ifdef CONFIG_NUMA
137 NUMA_HIT,
138 NUMA_MISS,
139 NUMA_FOREIGN,
140 NUMA_INTERLEAVE_HIT,
141 NUMA_LOCAL,
142 NUMA_OTHER,
143#endif
144 NR_ANON_TRANSPARENT_HUGEPAGES,
145 NR_VM_ZONE_STAT_ITEMS };
146
147
148
149
150
151
152
153
154
155
156#define LRU_BASE 0
157#define LRU_ACTIVE 1
158#define LRU_FILE 2
159
160enum lru_list {
161 LRU_INACTIVE_ANON = LRU_BASE,
162 LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,
163 LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,
164 LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
165 LRU_UNEVICTABLE,
166 NR_LRU_LISTS
167};
168
169#define for_each_lru(lru) for (lru = 0; lru < NR_LRU_LISTS; lru++)
170
171#define for_each_evictable_lru(lru) for (lru = 0; lru <= LRU_ACTIVE_FILE; lru++)
172
173static inline int is_file_lru(enum lru_list lru)
174{
175 return (lru == LRU_INACTIVE_FILE || lru == LRU_ACTIVE_FILE);
176}
177
178static inline int is_active_lru(enum lru_list lru)
179{
180 return (lru == LRU_ACTIVE_ANON || lru == LRU_ACTIVE_FILE);
181}
182
183static inline int is_unevictable_lru(enum lru_list lru)
184{
185 return (lru == LRU_UNEVICTABLE);
186}
187
188struct zone_reclaim_stat {
189
190
191
192
193
194
195
196
197 unsigned long recent_rotated[2];
198 unsigned long recent_scanned[2];
199};
200
201struct lruvec {
202 struct list_head lists[NR_LRU_LISTS];
203 struct zone_reclaim_stat reclaim_stat;
204#ifdef CONFIG_MEMCG
205 struct zone *zone;
206#endif
207};
208
209
210#define LRU_ALL_FILE (BIT(LRU_INACTIVE_FILE) | BIT(LRU_ACTIVE_FILE))
211#define LRU_ALL_ANON (BIT(LRU_INACTIVE_ANON) | BIT(LRU_ACTIVE_ANON))
212#define LRU_ALL ((1 << NR_LRU_LISTS) - 1)
213
214
215#define ISOLATE_CLEAN ((__force isolate_mode_t)0x1)
216
217#define ISOLATE_UNMAPPED ((__force isolate_mode_t)0x2)
218
219#define ISOLATE_ASYNC_MIGRATE ((__force isolate_mode_t)0x4)
220
221
222typedef unsigned __bitwise__ isolate_mode_t;
223
224enum zone_watermarks {
225 WMARK_MIN,
226 WMARK_LOW,
227 WMARK_HIGH,
228 NR_WMARK
229};
230
231#define min_wmark_pages(z) (z->watermark[WMARK_MIN])
232#define low_wmark_pages(z) (z->watermark[WMARK_LOW])
233#define high_wmark_pages(z) (z->watermark[WMARK_HIGH])
234
235struct per_cpu_pages {
236 int count;
237 int high;
238 int batch;
239
240
241 struct list_head lists[MIGRATE_PCPTYPES];
242};
243
244struct per_cpu_pageset {
245 struct per_cpu_pages pcp;
246#ifdef CONFIG_NUMA
247 s8 expire;
248#endif
249#ifdef CONFIG_SMP
250 s8 stat_threshold;
251 s8 vm_stat_diff[NR_VM_ZONE_STAT_ITEMS];
252#endif
253};
254
255#endif
256
257enum zone_type {
258#ifdef CONFIG_ZONE_DMA
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277 ZONE_DMA,
278#endif
279#ifdef CONFIG_ZONE_DMA32
280
281
282
283
284
285 ZONE_DMA32,
286#endif
287
288
289
290
291
292 ZONE_NORMAL,
293#ifdef CONFIG_HIGHMEM
294
295
296
297
298
299
300
301
302 ZONE_HIGHMEM,
303#endif
304 ZONE_MOVABLE,
305 __MAX_NR_ZONES
306};
307
308#ifndef __GENERATING_BOUNDS_H
309
310
311
312
313
314
315
316
317
318#if MAX_NR_ZONES < 2
319#define ZONES_SHIFT 0
320#elif MAX_NR_ZONES <= 2
321#define ZONES_SHIFT 1
322#elif MAX_NR_ZONES <= 4
323#define ZONES_SHIFT 2
324#else
325#error ZONES_SHIFT -- too many zones configured adjust calculation
326#endif
327
328struct zone {
329
330
331
332 unsigned long watermark[NR_WMARK];
333
334
335
336
337
338
339 unsigned long percpu_drift_mark;
340
341
342
343
344
345
346
347
348
349 unsigned long lowmem_reserve[MAX_NR_ZONES];
350
351
352
353
354
355 unsigned long dirty_balance_reserve;
356
357#ifdef CONFIG_NUMA
358 int node;
359
360
361
362 unsigned long min_unmapped_pages;
363 unsigned long min_slab_pages;
364#endif
365 struct per_cpu_pageset __percpu *pageset;
366
367
368
369 spinlock_t lock;
370 int all_unreclaimable;
371#if defined CONFIG_COMPACTION || defined CONFIG_CMA
372
373 unsigned long compact_cached_free_pfn;
374#endif
375#ifdef CONFIG_MEMORY_HOTPLUG
376
377 seqlock_t span_seqlock;
378#endif
379#ifdef CONFIG_CMA
380
381
382
383
384 unsigned long min_cma_pages;
385#endif
386 struct free_area free_area[MAX_ORDER];
387
388#ifndef CONFIG_SPARSEMEM
389
390
391
392
393 unsigned long *pageblock_flags;
394#endif
395
396#ifdef CONFIG_COMPACTION
397
398
399
400
401
402 unsigned int compact_considered;
403 unsigned int compact_defer_shift;
404 int compact_order_failed;
405#endif
406
407 ZONE_PADDING(_pad1_)
408
409
410 spinlock_t lru_lock;
411 struct lruvec lruvec;
412
413 unsigned long pages_scanned;
414 unsigned long flags;
415
416
417 atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS];
418
419
420
421
422
423 unsigned int inactive_ratio;
424
425
426 ZONE_PADDING(_pad2_)
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453 wait_queue_head_t * wait_table;
454 unsigned long wait_table_hash_nr_entries;
455 unsigned long wait_table_bits;
456
457
458
459
460 struct pglist_data *zone_pgdat;
461
462 unsigned long zone_start_pfn;
463
464
465
466
467
468
469
470
471
472
473
474 unsigned long spanned_pages;
475 unsigned long present_pages;
476
477
478
479
480 const char *name;
481#ifdef CONFIG_MEMORY_ISOLATION
482
483
484
485
486
487 int nr_pageblock_isolate;
488#endif
489} ____cacheline_internodealigned_in_smp;
490
491typedef enum {
492 ZONE_RECLAIM_LOCKED,
493 ZONE_OOM_LOCKED,
494 ZONE_CONGESTED,
495
496
497} zone_flags_t;
498
499static inline void zone_set_flag(struct zone *zone, zone_flags_t flag)
500{
501 set_bit(flag, &zone->flags);
502}
503
504static inline int zone_test_and_set_flag(struct zone *zone, zone_flags_t flag)
505{
506 return test_and_set_bit(flag, &zone->flags);
507}
508
509static inline void zone_clear_flag(struct zone *zone, zone_flags_t flag)
510{
511 clear_bit(flag, &zone->flags);
512}
513
514static inline int zone_is_reclaim_congested(const struct zone *zone)
515{
516 return test_bit(ZONE_CONGESTED, &zone->flags);
517}
518
519static inline int zone_is_reclaim_locked(const struct zone *zone)
520{
521 return test_bit(ZONE_RECLAIM_LOCKED, &zone->flags);
522}
523
524static inline int zone_is_oom_locked(const struct zone *zone)
525{
526 return test_bit(ZONE_OOM_LOCKED, &zone->flags);
527}
528
529
530
531
532
533
534#define DEF_PRIORITY 12
535
536
537#define MAX_ZONES_PER_ZONELIST (MAX_NUMNODES * MAX_NR_ZONES)
538
539#ifdef CONFIG_NUMA
540
541
542
543
544
545
546
547
548#define MAX_ZONELISTS 2
549
550
551
552
553
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
598
599
600
601
602
603
604
605
606
607
608
609
610struct zonelist_cache {
611 unsigned short z_to_n[MAX_ZONES_PER_ZONELIST];
612 DECLARE_BITMAP(fullzones, MAX_ZONES_PER_ZONELIST);
613 unsigned long last_full_zap;
614};
615#else
616#define MAX_ZONELISTS 1
617struct zonelist_cache;
618#endif
619
620
621
622
623
624struct zoneref {
625 struct zone *zone;
626 int zone_idx;
627};
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646struct zonelist {
647 struct zonelist_cache *zlcache_ptr;
648 struct zoneref _zonerefs[MAX_ZONES_PER_ZONELIST + 1];
649#ifdef CONFIG_NUMA
650 struct zonelist_cache zlcache;
651#endif
652};
653
654#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
655struct node_active_region {
656 unsigned long start_pfn;
657 unsigned long end_pfn;
658 int nid;
659};
660#endif
661
662#ifndef CONFIG_DISCONTIGMEM
663
664extern struct page *mem_map;
665#endif
666
667
668
669
670
671
672
673
674
675
676
677
678struct bootmem_data;
679typedef struct pglist_data {
680 struct zone node_zones[MAX_NR_ZONES];
681 struct zonelist node_zonelists[MAX_ZONELISTS];
682 int nr_zones;
683#ifdef CONFIG_FLAT_NODE_MEM_MAP
684 struct page *node_mem_map;
685#ifdef CONFIG_MEMCG
686 struct page_cgroup *node_page_cgroup;
687#endif
688#endif
689#ifndef CONFIG_NO_BOOTMEM
690 struct bootmem_data *bdata;
691#endif
692#ifdef CONFIG_MEMORY_HOTPLUG
693
694
695
696
697
698
699
700 spinlock_t node_size_lock;
701#endif
702 unsigned long node_start_pfn;
703 unsigned long node_present_pages;
704 unsigned long node_spanned_pages;
705
706 int node_id;
707 wait_queue_head_t kswapd_wait;
708 wait_queue_head_t pfmemalloc_wait;
709 struct task_struct *kswapd;
710 int kswapd_max_order;
711 enum zone_type classzone_idx;
712} pg_data_t;
713
714#define node_present_pages(nid) (NODE_DATA(nid)->node_present_pages)
715#define node_spanned_pages(nid) (NODE_DATA(nid)->node_spanned_pages)
716#ifdef CONFIG_FLAT_NODE_MEM_MAP
717#define pgdat_page_nr(pgdat, pagenr) ((pgdat)->node_mem_map + (pagenr))
718#else
719#define pgdat_page_nr(pgdat, pagenr) pfn_to_page((pgdat)->node_start_pfn + (pagenr))
720#endif
721#define nid_page_nr(nid, pagenr) pgdat_page_nr(NODE_DATA(nid),(pagenr))
722
723#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
724
725#define node_end_pfn(nid) ({\
726 pg_data_t *__pgdat = NODE_DATA(nid);\
727 __pgdat->node_start_pfn + __pgdat->node_spanned_pages;\
728})
729
730#include <linux/memory_hotplug.h>
731
732extern struct mutex zonelists_mutex;
733void build_all_zonelists(pg_data_t *pgdat, struct zone *zone);
734void wakeup_kswapd(struct zone *zone, int order, enum zone_type classzone_idx);
735bool zone_watermark_ok(struct zone *z, int order, unsigned long mark,
736 int classzone_idx, int alloc_flags);
737bool zone_watermark_ok_safe(struct zone *z, int order, unsigned long mark,
738 int classzone_idx, int alloc_flags);
739enum memmap_context {
740 MEMMAP_EARLY,
741 MEMMAP_HOTPLUG,
742};
743extern int init_currently_empty_zone(struct zone *zone, unsigned long start_pfn,
744 unsigned long size,
745 enum memmap_context context);
746
747extern void lruvec_init(struct lruvec *lruvec, struct zone *zone);
748
749static inline struct zone *lruvec_zone(struct lruvec *lruvec)
750{
751#ifdef CONFIG_MEMCG
752 return lruvec->zone;
753#else
754 return container_of(lruvec, struct zone, lruvec);
755#endif
756}
757
758#ifdef CONFIG_HAVE_MEMORY_PRESENT
759void memory_present(int nid, unsigned long start, unsigned long end);
760#else
761static inline void memory_present(int nid, unsigned long start, unsigned long end) {}
762#endif
763
764#ifdef CONFIG_HAVE_MEMORYLESS_NODES
765int local_memory_node(int node_id);
766#else
767static inline int local_memory_node(int node_id) { return node_id; };
768#endif
769
770#ifdef CONFIG_NEED_NODE_MEMMAP_SIZE
771unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);
772#endif
773
774
775
776
777#define zone_idx(zone) ((zone) - (zone)->zone_pgdat->node_zones)
778
779static inline int populated_zone(struct zone *zone)
780{
781 return (!!zone->present_pages);
782}
783
784extern int movable_zone;
785
786static inline int zone_movable_is_highmem(void)
787{
788#if defined(CONFIG_HIGHMEM) && defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP)
789 return movable_zone == ZONE_HIGHMEM;
790#else
791 return 0;
792#endif
793}
794
795static inline int is_highmem_idx(enum zone_type idx)
796{
797#ifdef CONFIG_HIGHMEM
798 return (idx == ZONE_HIGHMEM ||
799 (idx == ZONE_MOVABLE && zone_movable_is_highmem()));
800#else
801 return 0;
802#endif
803}
804
805static inline int is_normal_idx(enum zone_type idx)
806{
807 return (idx == ZONE_NORMAL);
808}
809
810
811
812
813
814
815
816static inline int is_highmem(struct zone *zone)
817{
818#ifdef CONFIG_HIGHMEM
819 int zone_off = (char *)zone - (char *)zone->zone_pgdat->node_zones;
820 return zone_off == ZONE_HIGHMEM * sizeof(*zone) ||
821 (zone_off == ZONE_MOVABLE * sizeof(*zone) &&
822 zone_movable_is_highmem());
823#else
824 return 0;
825#endif
826}
827
828static inline int is_normal(struct zone *zone)
829{
830 return zone == zone->zone_pgdat->node_zones + ZONE_NORMAL;
831}
832
833static inline int is_dma32(struct zone *zone)
834{
835#ifdef CONFIG_ZONE_DMA32
836 return zone == zone->zone_pgdat->node_zones + ZONE_DMA32;
837#else
838 return 0;
839#endif
840}
841
842static inline int is_dma(struct zone *zone)
843{
844#ifdef CONFIG_ZONE_DMA
845 return zone == zone->zone_pgdat->node_zones + ZONE_DMA;
846#else
847 return 0;
848#endif
849}
850
851
852struct ctl_table;
853int min_free_kbytes_sysctl_handler(struct ctl_table *, int,
854 void __user *, size_t *, loff_t *);
855extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1];
856int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int,
857 void __user *, size_t *, loff_t *);
858int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *, int,
859 void __user *, size_t *, loff_t *);
860int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *, int,
861 void __user *, size_t *, loff_t *);
862int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *, int,
863 void __user *, size_t *, loff_t *);
864
865extern int numa_zonelist_order_handler(struct ctl_table *, int,
866 void __user *, size_t *, loff_t *);
867extern char numa_zonelist_order[];
868#define NUMA_ZONELIST_ORDER_LEN 16
869
870#ifndef CONFIG_NEED_MULTIPLE_NODES
871
872extern struct pglist_data contig_page_data;
873#define NODE_DATA(nid) (&contig_page_data)
874#define NODE_MEM_MAP(nid) mem_map
875
876#else
877
878#include <asm/mmzone.h>
879
880#endif
881
882extern struct pglist_data *first_online_pgdat(void);
883extern struct pglist_data *next_online_pgdat(struct pglist_data *pgdat);
884extern struct zone *next_zone(struct zone *zone);
885
886
887
888
889
890#define for_each_online_pgdat(pgdat) \
891 for (pgdat = first_online_pgdat(); \
892 pgdat; \
893 pgdat = next_online_pgdat(pgdat))
894
895
896
897
898
899
900
901#define for_each_zone(zone) \
902 for (zone = (first_online_pgdat())->node_zones; \
903 zone; \
904 zone = next_zone(zone))
905
906#define for_each_populated_zone(zone) \
907 for (zone = (first_online_pgdat())->node_zones; \
908 zone; \
909 zone = next_zone(zone)) \
910 if (!populated_zone(zone)) \
911 ; \
912 else
913
914static inline struct zone *zonelist_zone(struct zoneref *zoneref)
915{
916 return zoneref->zone;
917}
918
919static inline int zonelist_zone_idx(struct zoneref *zoneref)
920{
921 return zoneref->zone_idx;
922}
923
924static inline int zonelist_node_idx(struct zoneref *zoneref)
925{
926#ifdef CONFIG_NUMA
927
928 return zoneref->zone->node;
929#else
930 return 0;
931#endif
932}
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947struct zoneref *next_zones_zonelist(struct zoneref *z,
948 enum zone_type highest_zoneidx,
949 nodemask_t *nodes,
950 struct zone **zone);
951
952
953
954
955
956
957
958
959
960
961
962
963
964static inline struct zoneref *first_zones_zonelist(struct zonelist *zonelist,
965 enum zone_type highest_zoneidx,
966 nodemask_t *nodes,
967 struct zone **zone)
968{
969 return next_zones_zonelist(zonelist->_zonerefs, highest_zoneidx, nodes,
970 zone);
971}
972
973
974
975
976
977
978
979
980
981
982
983
984#define for_each_zone_zonelist_nodemask(zone, z, zlist, highidx, nodemask) \
985 for (z = first_zones_zonelist(zlist, highidx, nodemask, &zone); \
986 zone; \
987 z = next_zones_zonelist(++z, highidx, nodemask, &zone)) \
988
989
990
991
992
993
994
995
996
997
998#define for_each_zone_zonelist(zone, z, zlist, highidx) \
999 for_each_zone_zonelist_nodemask(zone, z, zlist, highidx, NULL)
1000
1001#ifdef CONFIG_SPARSEMEM
1002#include <asm/sparsemem.h>
1003#endif
1004
1005#if !defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID) && \
1006 !defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP)
1007static inline unsigned long early_pfn_to_nid(unsigned long pfn)
1008{
1009 return 0;
1010}
1011#endif
1012
1013#ifdef CONFIG_FLATMEM
1014#define pfn_to_nid(pfn) (0)
1015#endif
1016
1017#ifdef CONFIG_SPARSEMEM
1018
1019
1020
1021
1022
1023
1024
1025#define SECTIONS_SHIFT (MAX_PHYSMEM_BITS - SECTION_SIZE_BITS)
1026
1027#define PA_SECTION_SHIFT (SECTION_SIZE_BITS)
1028#define PFN_SECTION_SHIFT (SECTION_SIZE_BITS - PAGE_SHIFT)
1029
1030#define NR_MEM_SECTIONS (1UL << SECTIONS_SHIFT)
1031
1032#define PAGES_PER_SECTION (1UL << PFN_SECTION_SHIFT)
1033#define PAGE_SECTION_MASK (~(PAGES_PER_SECTION-1))
1034
1035#define SECTION_BLOCKFLAGS_BITS \
1036 ((1UL << (PFN_SECTION_SHIFT - pageblock_order)) * NR_PAGEBLOCK_BITS)
1037
1038#if (MAX_ORDER - 1 + PAGE_SHIFT) > SECTION_SIZE_BITS
1039#error Allocator MAX_ORDER exceeds SECTION_SIZE
1040#endif
1041
1042#define pfn_to_section_nr(pfn) ((pfn) >> PFN_SECTION_SHIFT)
1043#define section_nr_to_pfn(sec) ((sec) << PFN_SECTION_SHIFT)
1044
1045#define SECTION_ALIGN_UP(pfn) (((pfn) + PAGES_PER_SECTION - 1) & PAGE_SECTION_MASK)
1046#define SECTION_ALIGN_DOWN(pfn) ((pfn) & PAGE_SECTION_MASK)
1047
1048struct page;
1049struct page_cgroup;
1050struct mem_section {
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063 unsigned long section_mem_map;
1064
1065
1066 unsigned long *pageblock_flags;
1067#ifdef CONFIG_MEMCG
1068
1069
1070
1071
1072 struct page_cgroup *page_cgroup;
1073 unsigned long pad;
1074#endif
1075};
1076
1077#ifdef CONFIG_SPARSEMEM_EXTREME
1078#define SECTIONS_PER_ROOT (PAGE_SIZE / sizeof (struct mem_section))
1079#else
1080#define SECTIONS_PER_ROOT 1
1081#endif
1082
1083#define SECTION_NR_TO_ROOT(sec) ((sec) / SECTIONS_PER_ROOT)
1084#define NR_SECTION_ROOTS DIV_ROUND_UP(NR_MEM_SECTIONS, SECTIONS_PER_ROOT)
1085#define SECTION_ROOT_MASK (SECTIONS_PER_ROOT - 1)
1086
1087#ifdef CONFIG_SPARSEMEM_EXTREME
1088extern struct mem_section *mem_section[NR_SECTION_ROOTS];
1089#else
1090extern struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT];
1091#endif
1092
1093static inline struct mem_section *__nr_to_section(unsigned long nr)
1094{
1095 if (!mem_section[SECTION_NR_TO_ROOT(nr)])
1096 return NULL;
1097 return &mem_section[SECTION_NR_TO_ROOT(nr)][nr & SECTION_ROOT_MASK];
1098}
1099extern int __section_nr(struct mem_section* ms);
1100extern unsigned long usemap_size(void);
1101
1102
1103
1104
1105
1106
1107#define SECTION_MARKED_PRESENT (1UL<<0)
1108#define SECTION_HAS_MEM_MAP (1UL<<1)
1109#define SECTION_MAP_LAST_BIT (1UL<<2)
1110#define SECTION_MAP_MASK (~(SECTION_MAP_LAST_BIT-1))
1111#define SECTION_NID_SHIFT 2
1112
1113static inline struct page *__section_mem_map_addr(struct mem_section *section)
1114{
1115 unsigned long map = section->section_mem_map;
1116 map &= SECTION_MAP_MASK;
1117 return (struct page *)map;
1118}
1119
1120static inline int present_section(struct mem_section *section)
1121{
1122 return (section && (section->section_mem_map & SECTION_MARKED_PRESENT));
1123}
1124
1125static inline int present_section_nr(unsigned long nr)
1126{
1127 return present_section(__nr_to_section(nr));
1128}
1129
1130static inline int valid_section(struct mem_section *section)
1131{
1132 return (section && (section->section_mem_map & SECTION_HAS_MEM_MAP));
1133}
1134
1135static inline int valid_section_nr(unsigned long nr)
1136{
1137 return valid_section(__nr_to_section(nr));
1138}
1139
1140static inline struct mem_section *__pfn_to_section(unsigned long pfn)
1141{
1142 return __nr_to_section(pfn_to_section_nr(pfn));
1143}
1144
1145#ifndef CONFIG_HAVE_ARCH_PFN_VALID
1146static inline int pfn_valid(unsigned long pfn)
1147{
1148 if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
1149 return 0;
1150 return valid_section(__nr_to_section(pfn_to_section_nr(pfn)));
1151}
1152#endif
1153
1154static inline int pfn_present(unsigned long pfn)
1155{
1156 if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
1157 return 0;
1158 return present_section(__nr_to_section(pfn_to_section_nr(pfn)));
1159}
1160
1161
1162
1163
1164
1165
1166#ifdef CONFIG_NUMA
1167#define pfn_to_nid(pfn) \
1168({ \
1169 unsigned long __pfn_to_nid_pfn = (pfn); \
1170 page_to_nid(pfn_to_page(__pfn_to_nid_pfn)); \
1171})
1172#else
1173#define pfn_to_nid(pfn) (0)
1174#endif
1175
1176#define early_pfn_valid(pfn) pfn_valid(pfn)
1177void sparse_init(void);
1178#else
1179#define sparse_init() do {} while (0)
1180#define sparse_index_init(_sec, _nid) do {} while (0)
1181#endif
1182
1183#ifdef CONFIG_NODES_SPAN_OTHER_NODES
1184bool early_pfn_in_nid(unsigned long pfn, int nid);
1185#else
1186#define early_pfn_in_nid(pfn, nid) (1)
1187#endif
1188
1189#ifndef early_pfn_valid
1190#define early_pfn_valid(pfn) (1)
1191#endif
1192
1193void memory_present(int nid, unsigned long start, unsigned long end);
1194unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);
1195
1196
1197
1198
1199
1200
1201
1202#ifdef CONFIG_HOLES_IN_ZONE
1203#define pfn_valid_within(pfn) pfn_valid(pfn)
1204#else
1205#define pfn_valid_within(pfn) (1)
1206#endif
1207
1208#ifdef CONFIG_ARCH_HAS_HOLES_MEMORYMODEL
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224int memmap_valid_within(unsigned long pfn,
1225 struct page *page, struct zone *zone);
1226#else
1227static inline int memmap_valid_within(unsigned long pfn,
1228 struct page *page, struct zone *zone)
1229{
1230 return 1;
1231}
1232#endif
1233
1234#endif
1235#endif
1236#endif
1237