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