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