Blame view
include/linux/page-flags-layout.h
2.9 KB
bbeae5b05 mm: move page fla... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#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 #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 mm: fold page->_l... |
35 36 37 38 39 |
* 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 mm: move page fla... |
40 |
* |
b795854b1 sched/numa: Set p... |
41 |
* No sparsemem or sparsemem vmemmap: | NODE | ZONE | ... | FLAGS | |
90572890d mm: numa: Change ... |
42 |
* " plus space for last_cpupid: | NODE | ZONE | LAST_CPUPID ... | FLAGS | |
b795854b1 sched/numa: Set p... |
43 |
* classic sparse with space for node:| SECTION | NODE | ZONE | ... | FLAGS | |
90572890d mm: numa: Change ... |
44 |
* " plus space for last_cpupid: | SECTION | NODE | ZONE | LAST_CPUPID ... | FLAGS | |
bbeae5b05 mm: move page fla... |
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
* 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 mm: fold page->_l... |
63 |
#ifdef CONFIG_NUMA_BALANCING |
b795854b1 sched/numa: Set p... |
64 65 |
#define LAST__PID_SHIFT 8 #define LAST__PID_MASK ((1 << LAST__PID_SHIFT)-1) |
90572890d mm: numa: Change ... |
66 67 |
#define LAST__CPU_SHIFT NR_CPUS_BITS #define LAST__CPU_MASK ((1 << LAST__CPU_SHIFT)-1) |
b795854b1 sched/numa: Set p... |
68 |
|
90572890d mm: numa: Change ... |
69 |
#define LAST_CPUPID_SHIFT (LAST__PID_SHIFT+LAST__CPU_SHIFT) |
75980e97d mm: fold page->_l... |
70 |
#else |
90572890d mm: numa: Change ... |
71 |
#define LAST_CPUPID_SHIFT 0 |
75980e97d mm: fold page->_l... |
72 |
#endif |
90572890d mm: numa: Change ... |
73 74 |
#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT+LAST_CPUPID_SHIFT <= BITS_PER_LONG - NR_PAGEFLAGS #define LAST_CPUPID_WIDTH LAST_CPUPID_SHIFT |
75980e97d mm: fold page->_l... |
75 |
#else |
90572890d mm: numa: Change ... |
76 |
#define LAST_CPUPID_WIDTH 0 |
75980e97d mm: fold page->_l... |
77 |
#endif |
bbeae5b05 mm: move page fla... |
78 79 80 81 82 83 84 |
/* * 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 mm: numa: Change ... |
85 86 |
#if defined(CONFIG_NUMA_BALANCING) && LAST_CPUPID_WIDTH == 0 #define LAST_CPUPID_NOT_IN_PAGE_FLAGS |
75980e97d mm: fold page->_l... |
87 |
#endif |
bbeae5b05 mm: move page fla... |
88 |
#endif /* _LINUX_PAGE_FLAGS_LAYOUT */ |