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