Blame view

include/linux/page-flags-layout.h 2.95 KB
bbeae5b05   Peter Zijlstra   mm: move page fla...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  #ifndef PAGE_FLAGS_LAYOUT_H
  #define PAGE_FLAGS_LAYOUT_H
  
  #include <linux/numa.h>
  #include <generated/bounds.h>
  
  /*
   * When a memory allocation must conform to specific limitations (such
   * as being suitable for DMA) the caller will pass in hints to the
   * allocator in the gfp_mask, in the zone modifier bits.  These bits
   * are used to select a priority ordered list of memory zones which
   * match the requested limits. See gfp_zone() in include/linux/gfp.h
   */
  #if MAX_NR_ZONES < 2
  #define ZONES_SHIFT 0
  #elif MAX_NR_ZONES <= 2
  #define ZONES_SHIFT 1
  #elif MAX_NR_ZONES <= 4
  #define ZONES_SHIFT 2
b11a7b941   Dan Williams   mm: exclude ZONE_...
20
21
  #elif MAX_NR_ZONES <= 8
  #define ZONES_SHIFT 3
bbeae5b05   Peter Zijlstra   mm: move page fla...
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  #else
  #error ZONES_SHIFT -- too many zones configured adjust calculation
  #endif
  
  #ifdef CONFIG_SPARSEMEM
  #include <asm/sparsemem.h>
  
  /* SECTION_SHIFT	#bits space required to store a section # */
  #define SECTIONS_SHIFT	(MAX_PHYSMEM_BITS - SECTION_SIZE_BITS)
  
  #endif /* CONFIG_SPARSEMEM */
  
  /*
   * page->flags layout:
   *
75980e97d   Peter Zijlstra   mm: fold page->_l...
37
38
39
40
41
   * There are five possibilities for how page->flags get laid out.  The first
   * pair is for the normal case without sparsemem. The second pair is for
   * sparsemem when there is plenty of space for node and section information.
   * The last is when there is insufficient space in page->flags and a separate
   * lookup is necessary.
bbeae5b05   Peter Zijlstra   mm: move page fla...
42
   *
b795854b1   Mel Gorman   sched/numa: Set p...
43
   * No sparsemem or sparsemem vmemmap: |       NODE     | ZONE |             ... | FLAGS |
90572890d   Peter Zijlstra   mm: numa: Change ...
44
   *      " plus space for last_cpupid: |       NODE     | ZONE | LAST_CPUPID ... | FLAGS |
b795854b1   Mel Gorman   sched/numa: Set p...
45
   * classic sparse with space for node:| SECTION | NODE | ZONE |             ... | FLAGS |
90572890d   Peter Zijlstra   mm: numa: Change ...
46
   *      " plus space for last_cpupid: | SECTION | NODE | ZONE | LAST_CPUPID ... | FLAGS |
bbeae5b05   Peter Zijlstra   mm: move page fla...
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
   * classic sparse no space for node:  | SECTION |     ZONE    | ... | FLAGS |
   */
  #if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP)
  #define SECTIONS_WIDTH		SECTIONS_SHIFT
  #else
  #define SECTIONS_WIDTH		0
  #endif
  
  #define ZONES_WIDTH		ZONES_SHIFT
  
  #if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT <= BITS_PER_LONG - NR_PAGEFLAGS
  #define NODES_WIDTH		NODES_SHIFT
  #else
  #ifdef CONFIG_SPARSEMEM_VMEMMAP
  #error "Vmemmap: No space for nodes field in page flags"
  #endif
  #define NODES_WIDTH		0
  #endif
75980e97d   Peter Zijlstra   mm: fold page->_l...
65
  #ifdef CONFIG_NUMA_BALANCING
b795854b1   Mel Gorman   sched/numa: Set p...
66
67
  #define LAST__PID_SHIFT 8
  #define LAST__PID_MASK  ((1 << LAST__PID_SHIFT)-1)
90572890d   Peter Zijlstra   mm: numa: Change ...
68
69
  #define LAST__CPU_SHIFT NR_CPUS_BITS
  #define LAST__CPU_MASK  ((1 << LAST__CPU_SHIFT)-1)
b795854b1   Mel Gorman   sched/numa: Set p...
70

90572890d   Peter Zijlstra   mm: numa: Change ...
71
  #define LAST_CPUPID_SHIFT (LAST__PID_SHIFT+LAST__CPU_SHIFT)
75980e97d   Peter Zijlstra   mm: fold page->_l...
72
  #else
90572890d   Peter Zijlstra   mm: numa: Change ...
73
  #define LAST_CPUPID_SHIFT 0
75980e97d   Peter Zijlstra   mm: fold page->_l...
74
  #endif
90572890d   Peter Zijlstra   mm: numa: Change ...
75
76
  #if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT+LAST_CPUPID_SHIFT <= BITS_PER_LONG - NR_PAGEFLAGS
  #define LAST_CPUPID_WIDTH LAST_CPUPID_SHIFT
75980e97d   Peter Zijlstra   mm: fold page->_l...
77
  #else
90572890d   Peter Zijlstra   mm: numa: Change ...
78
  #define LAST_CPUPID_WIDTH 0
75980e97d   Peter Zijlstra   mm: fold page->_l...
79
  #endif
bbeae5b05   Peter Zijlstra   mm: move page fla...
80
81
82
83
84
85
86
  /*
   * We are going to use the flags for the page to node mapping if its in
   * there.  This includes the case where there is no node, so it is implicit.
   */
  #if !(NODES_WIDTH > 0 || NODES_SHIFT == 0)
  #define NODE_NOT_IN_PAGE_FLAGS
  #endif
90572890d   Peter Zijlstra   mm: numa: Change ...
87
88
  #if defined(CONFIG_NUMA_BALANCING) && LAST_CPUPID_WIDTH == 0
  #define LAST_CPUPID_NOT_IN_PAGE_FLAGS
75980e97d   Peter Zijlstra   mm: fold page->_l...
89
  #endif
bbeae5b05   Peter Zijlstra   mm: move page fla...
90
  #endif /* _LINUX_PAGE_FLAGS_LAYOUT */