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#include <linux/topology.h>
768
769#ifndef numa_node_id
770#define numa_node_id() (cpu_to_node(raw_smp_processor_id()))
771#endif
772
773#ifndef CONFIG_NEED_MULTIPLE_NODES
774
775extern struct pglist_data contig_page_data;
776#define NODE_DATA(nid) (&contig_page_data)
777#define NODE_MEM_MAP(nid) mem_map
778
779#else
780
781#include <asm/mmzone.h>
782
783#endif
784
785extern struct pglist_data *first_online_pgdat(void);
786extern struct pglist_data *next_online_pgdat(struct pglist_data *pgdat);
787extern struct zone *next_zone(struct zone *zone);
788
789
790
791
792
793#define for_each_online_pgdat(pgdat) \
794 for (pgdat = first_online_pgdat(); \
795 pgdat; \
796 pgdat = next_online_pgdat(pgdat))
797
798
799
800
801
802
803
804#define for_each_zone(zone) \
805 for (zone = (first_online_pgdat())->node_zones; \
806 zone; \
807 zone = next_zone(zone))
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#endif
1099#endif
1100#endif
1101