Root/
1 | /* |
2 | * swapcache pages are stored in the swapper_space radix tree. We want to |
3 | * get good packing density in that tree, so the index should be dense in |
4 | * the low-order bits. |
5 | * |
6 | * We arrange the `type' and `offset' fields so that `type' is at the five |
7 | * high-order bits of the swp_entry_t and `offset' is right-aligned in the |
8 | * remaining bits. |
9 | * |
10 | * swp_entry_t's are *never* stored anywhere in their arch-dependent format. |
11 | */ |
12 | #define SWP_TYPE_SHIFT(e) (sizeof(e.val) * 8 - MAX_SWAPFILES_SHIFT) |
13 | #define SWP_OFFSET_MASK(e) ((1UL << SWP_TYPE_SHIFT(e)) - 1) |
14 | |
15 | /* |
16 | * Store a type+offset into a swp_entry_t in an arch-independent format |
17 | */ |
18 | static inline swp_entry_t swp_entry(unsigned long type, pgoff_t offset) |
19 | { |
20 | swp_entry_t ret; |
21 | |
22 | ret.val = (type << SWP_TYPE_SHIFT(ret)) | |
23 | (offset & SWP_OFFSET_MASK(ret)); |
24 | return ret; |
25 | } |
26 | |
27 | /* |
28 | * Extract the `type' field from a swp_entry_t. The swp_entry_t is in |
29 | * arch-independent format |
30 | */ |
31 | static inline unsigned swp_type(swp_entry_t entry) |
32 | { |
33 | return (entry.val >> SWP_TYPE_SHIFT(entry)); |
34 | } |
35 | |
36 | /* |
37 | * Extract the `offset' field from a swp_entry_t. The swp_entry_t is in |
38 | * arch-independent format |
39 | */ |
40 | static inline pgoff_t swp_offset(swp_entry_t entry) |
41 | { |
42 | return entry.val & SWP_OFFSET_MASK(entry); |
43 | } |
44 | |
45 | #ifdef CONFIG_MMU |
46 | /* check whether a pte points to a swap entry */ |
47 | static inline int is_swap_pte(pte_t pte) |
48 | { |
49 | return !pte_none(pte) && !pte_present(pte) && !pte_file(pte); |
50 | } |
51 | #endif |
52 | |
53 | /* |
54 | * Convert the arch-dependent pte representation of a swp_entry_t into an |
55 | * arch-independent swp_entry_t. |
56 | */ |
57 | static inline swp_entry_t pte_to_swp_entry(pte_t pte) |
58 | { |
59 | swp_entry_t arch_entry; |
60 | |
61 | BUG_ON(pte_file(pte)); |
62 | arch_entry = __pte_to_swp_entry(pte); |
63 | return swp_entry(__swp_type(arch_entry), __swp_offset(arch_entry)); |
64 | } |
65 | |
66 | /* |
67 | * Convert the arch-independent representation of a swp_entry_t into the |
68 | * arch-dependent pte representation. |
69 | */ |
70 | static inline pte_t swp_entry_to_pte(swp_entry_t entry) |
71 | { |
72 | swp_entry_t arch_entry; |
73 | |
74 | arch_entry = __swp_entry(swp_type(entry), swp_offset(entry)); |
75 | BUG_ON(pte_file(__swp_entry_to_pte(arch_entry))); |
76 | return __swp_entry_to_pte(arch_entry); |
77 | } |
78 | |
79 | #ifdef CONFIG_MIGRATION |
80 | static inline swp_entry_t make_migration_entry(struct page *page, int write) |
81 | { |
82 | BUG_ON(!PageLocked(page)); |
83 | return swp_entry(write ? SWP_MIGRATION_WRITE : SWP_MIGRATION_READ, |
84 | page_to_pfn(page)); |
85 | } |
86 | |
87 | static inline int is_migration_entry(swp_entry_t entry) |
88 | { |
89 | return unlikely(swp_type(entry) == SWP_MIGRATION_READ || |
90 | swp_type(entry) == SWP_MIGRATION_WRITE); |
91 | } |
92 | |
93 | static inline int is_write_migration_entry(swp_entry_t entry) |
94 | { |
95 | return unlikely(swp_type(entry) == SWP_MIGRATION_WRITE); |
96 | } |
97 | |
98 | static inline struct page *migration_entry_to_page(swp_entry_t entry) |
99 | { |
100 | struct page *p = pfn_to_page(swp_offset(entry)); |
101 | /* |
102 | * Any use of migration entries may only occur while the |
103 | * corresponding page is locked |
104 | */ |
105 | BUG_ON(!PageLocked(p)); |
106 | return p; |
107 | } |
108 | |
109 | static inline void make_migration_entry_read(swp_entry_t *entry) |
110 | { |
111 | *entry = swp_entry(SWP_MIGRATION_READ, swp_offset(*entry)); |
112 | } |
113 | |
114 | extern void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, |
115 | unsigned long address); |
116 | #else |
117 | |
118 | #define make_migration_entry(page, write) swp_entry(0, 0) |
119 | static inline int is_migration_entry(swp_entry_t swp) |
120 | { |
121 | return 0; |
122 | } |
123 | #define migration_entry_to_page(swp) NULL |
124 | static inline void make_migration_entry_read(swp_entry_t *entryp) { } |
125 | static inline void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, |
126 | unsigned long address) { } |
127 | static inline int is_write_migration_entry(swp_entry_t entry) |
128 | { |
129 | return 0; |
130 | } |
131 | |
132 | #endif |
133 | |
134 | #ifdef CONFIG_MEMORY_FAILURE |
135 | /* |
136 | * Support for hardware poisoned pages |
137 | */ |
138 | static inline swp_entry_t make_hwpoison_entry(struct page *page) |
139 | { |
140 | BUG_ON(!PageLocked(page)); |
141 | return swp_entry(SWP_HWPOISON, page_to_pfn(page)); |
142 | } |
143 | |
144 | static inline int is_hwpoison_entry(swp_entry_t entry) |
145 | { |
146 | return swp_type(entry) == SWP_HWPOISON; |
147 | } |
148 | #else |
149 | |
150 | static inline swp_entry_t make_hwpoison_entry(struct page *page) |
151 | { |
152 | return swp_entry(0, 0); |
153 | } |
154 | |
155 | static inline int is_hwpoison_entry(swp_entry_t swp) |
156 | { |
157 | return 0; |
158 | } |
159 | #endif |
160 | |
161 | #if defined(CONFIG_MEMORY_FAILURE) || defined(CONFIG_MIGRATION) |
162 | static inline int non_swap_entry(swp_entry_t entry) |
163 | { |
164 | return swp_type(entry) >= MAX_SWAPFILES; |
165 | } |
166 | #else |
167 | static inline int non_swap_entry(swp_entry_t entry) |
168 | { |
169 | return 0; |
170 | } |
171 | #endif |
172 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9