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