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