1#ifndef _LINUX_PAGEMAP_H
2#define _LINUX_PAGEMAP_H
3
4
5
6
7#include <linux/mm.h>
8#include <linux/fs.h>
9#include <linux/list.h>
10#include <linux/highmem.h>
11#include <linux/compiler.h>
12#include <asm/uaccess.h>
13#include <linux/gfp.h>
14#include <linux/bitops.h>
15#include <linux/hardirq.h>
16
17
18
19
20
21enum mapping_flags {
22 AS_EIO = __GFP_BITS_SHIFT + 0,
23 AS_ENOSPC = __GFP_BITS_SHIFT + 1,
24 AS_MM_ALL_LOCKS = __GFP_BITS_SHIFT + 2,
25#ifdef CONFIG_UNEVICTABLE_LRU
26 AS_UNEVICTABLE = __GFP_BITS_SHIFT + 3,
27#endif
28};
29
30static inline void mapping_set_error(struct address_space *mapping, int error)
31{
32 if (unlikely(error)) {
33 if (error == -ENOSPC)
34 set_bit(AS_ENOSPC, &mapping->flags);
35 else
36 set_bit(AS_EIO, &mapping->flags);
37 }
38}
39
40#ifdef CONFIG_UNEVICTABLE_LRU
41
42static inline void mapping_set_unevictable(struct address_space *mapping)
43{
44 set_bit(AS_UNEVICTABLE, &mapping->flags);
45}
46
47static inline void mapping_clear_unevictable(struct address_space *mapping)
48{
49 clear_bit(AS_UNEVICTABLE, &mapping->flags);
50}
51
52static inline int mapping_unevictable(struct address_space *mapping)
53{
54 if (likely(mapping))
55 return test_bit(AS_UNEVICTABLE, &mapping->flags);
56 return !!mapping;
57}
58#else
59static inline void mapping_set_unevictable(struct address_space *mapping) { }
60static inline void mapping_clear_unevictable(struct address_space *mapping) { }
61static inline int mapping_unevictable(struct address_space *mapping)
62{
63 return 0;
64}
65#endif
66
67static inline gfp_t mapping_gfp_mask(struct address_space * mapping)
68{
69 return (__force gfp_t)mapping->flags & __GFP_BITS_MASK;
70}
71
72
73
74
75
76static inline void mapping_set_gfp_mask(struct address_space *m, gfp_t mask)
77{
78 m->flags = (m->flags & ~(__force unsigned long)__GFP_BITS_MASK) |
79 (__force unsigned long)mask;
80}
81
82
83
84
85
86
87
88
89
90#define PAGE_CACHE_SHIFT PAGE_SHIFT
91#define PAGE_CACHE_SIZE PAGE_SIZE
92#define PAGE_CACHE_MASK PAGE_MASK
93#define PAGE_CACHE_ALIGN(addr) (((addr)+PAGE_CACHE_SIZE-1)&PAGE_CACHE_MASK)
94
95#define page_cache_get(page) get_page(page)
96#define page_cache_release(page) put_page(page)
97void release_pages(struct page **pages, int nr, int cold);
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143static inline int page_cache_get_speculative(struct page *page)
144{
145 VM_BUG_ON(in_interrupt());
146
147#if !defined(CONFIG_SMP) && defined(CONFIG_CLASSIC_RCU)
148# ifdef CONFIG_PREEMPT
149 VM_BUG_ON(!in_atomic());
150# endif
151
152
153
154
155
156
157
158
159
160 VM_BUG_ON(page_count(page) == 0);
161 atomic_inc(&page->_count);
162
163#else
164 if (unlikely(!get_page_unless_zero(page))) {
165
166
167
168
169
170 return 0;
171 }
172#endif
173 VM_BUG_ON(PageTail(page));
174
175 return 1;
176}
177
178
179
180
181static inline int page_cache_add_speculative(struct page *page, int count)
182{
183 VM_BUG_ON(in_interrupt());
184
185#if !defined(CONFIG_SMP) && defined(CONFIG_CLASSIC_RCU)
186# ifdef CONFIG_PREEMPT
187 VM_BUG_ON(!in_atomic());
188# endif
189 VM_BUG_ON(page_count(page) == 0);
190 atomic_add(count, &page->_count);
191
192#else
193 if (unlikely(!atomic_add_unless(&page->_count, count, 0)))
194 return 0;
195#endif
196 VM_BUG_ON(PageCompound(page) && page != compound_head(page));
197
198 return 1;
199}
200
201static inline int page_freeze_refs(struct page *page, int count)
202{
203 return likely(atomic_cmpxchg(&page->_count, count, 0) == count);
204}
205
206static inline void page_unfreeze_refs(struct page *page, int count)
207{
208 VM_BUG_ON(page_count(page) != 0);
209 VM_BUG_ON(count == 0);
210
211 atomic_set(&page->_count, count);
212}
213
214#ifdef CONFIG_NUMA
215extern struct page *__page_cache_alloc(gfp_t gfp);
216#else
217static inline struct page *__page_cache_alloc(gfp_t gfp)
218{
219 return alloc_pages(gfp, 0);
220}
221#endif
222
223static inline struct page *page_cache_alloc(struct address_space *x)
224{
225 return __page_cache_alloc(mapping_gfp_mask(x));
226}
227
228static inline struct page *page_cache_alloc_cold(struct address_space *x)
229{
230 return __page_cache_alloc(mapping_gfp_mask(x)|__GFP_COLD);
231}
232
233typedef int filler_t(void *, struct page *);
234
235extern struct page * find_get_page(struct address_space *mapping,
236 pgoff_t index);
237extern struct page * find_lock_page(struct address_space *mapping,
238 pgoff_t index);
239extern struct page * find_or_create_page(struct address_space *mapping,
240 pgoff_t index, gfp_t gfp_mask);
241unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
242 unsigned int nr_pages, struct page **pages);
243unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t start,
244 unsigned int nr_pages, struct page **pages);
245unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
246 int tag, unsigned int nr_pages, struct page **pages);
247
248struct page *grab_cache_page_write_begin(struct address_space *mapping,
249 pgoff_t index, unsigned flags);
250
251
252
253
254static inline struct page *grab_cache_page(struct address_space *mapping,
255 pgoff_t index)
256{
257 return find_or_create_page(mapping, index, mapping_gfp_mask(mapping));
258}
259
260extern struct page * grab_cache_page_nowait(struct address_space *mapping,
261 pgoff_t index);
262extern struct page * read_cache_page_async(struct address_space *mapping,
263 pgoff_t index, filler_t *filler,
264 void *data);
265extern struct page * read_cache_page(struct address_space *mapping,
266 pgoff_t index, filler_t *filler,
267 void *data);
268extern int read_cache_pages(struct address_space *mapping,
269 struct list_head *pages, filler_t *filler, void *data);
270
271static inline struct page *read_mapping_page_async(
272 struct address_space *mapping,
273 pgoff_t index, void *data)
274{
275 filler_t *filler = (filler_t *)mapping->a_ops->readpage;
276 return read_cache_page_async(mapping, index, filler, data);
277}
278
279static inline struct page *read_mapping_page(struct address_space *mapping,
280 pgoff_t index, void *data)
281{
282 filler_t *filler = (filler_t *)mapping->a_ops->readpage;
283 return read_cache_page(mapping, index, filler, data);
284}
285
286
287
288
289static inline loff_t page_offset(struct page *page)
290{
291 return ((loff_t)page->index) << PAGE_CACHE_SHIFT;
292}
293
294static inline pgoff_t linear_page_index(struct vm_area_struct *vma,
295 unsigned long address)
296{
297 pgoff_t pgoff = (address - vma->vm_start) >> PAGE_SHIFT;
298 pgoff += vma->vm_pgoff;
299 return pgoff >> (PAGE_CACHE_SHIFT - PAGE_SHIFT);
300}
301
302extern void __lock_page(struct page *page);
303extern int __lock_page_killable(struct page *page);
304extern void __lock_page_nosync(struct page *page);
305extern void unlock_page(struct page *page);
306
307static inline void __set_page_locked(struct page *page)
308{
309 __set_bit(PG_locked, &page->flags);
310}
311
312static inline void __clear_page_locked(struct page *page)
313{
314 __clear_bit(PG_locked, &page->flags);
315}
316
317static inline int trylock_page(struct page *page)
318{
319 return (likely(!test_and_set_bit_lock(PG_locked, &page->flags)));
320}
321
322
323
324
325static inline void lock_page(struct page *page)
326{
327 might_sleep();
328 if (!trylock_page(page))
329 __lock_page(page);
330}
331
332
333
334
335
336
337static inline int lock_page_killable(struct page *page)
338{
339 might_sleep();
340 if (!trylock_page(page))
341 return __lock_page_killable(page);
342 return 0;
343}
344
345
346
347
348
349static inline void lock_page_nosync(struct page *page)
350{
351 might_sleep();
352 if (!trylock_page(page))
353 __lock_page_nosync(page);
354}
355
356
357
358
359
360extern void wait_on_page_bit(struct page *page, int bit_nr);
361
362
363
364
365
366
367
368
369static inline void wait_on_page_locked(struct page *page)
370{
371 if (PageLocked(page))
372 wait_on_page_bit(page, PG_locked);
373}
374
375
376
377
378static inline void wait_on_page_writeback(struct page *page)
379{
380 if (PageWriteback(page))
381 wait_on_page_bit(page, PG_writeback);
382}
383
384extern void end_page_writeback(struct page *page);
385
386
387
388
389extern void add_page_wait_queue(struct page *page, wait_queue_t *waiter);
390
391
392
393
394
395
396
397static inline int fault_in_pages_writeable(char __user *uaddr, int size)
398{
399 int ret;
400
401 if (unlikely(size == 0))
402 return 0;
403
404
405
406
407
408 ret = __put_user(0, uaddr);
409 if (ret == 0) {
410 char __user *end = uaddr + size - 1;
411
412
413
414
415
416 if (((unsigned long)uaddr & PAGE_MASK) !=
417 ((unsigned long)end & PAGE_MASK))
418 ret = __put_user(0, end);
419 }
420 return ret;
421}
422
423static inline int fault_in_pages_readable(const char __user *uaddr, int size)
424{
425 volatile char c;
426 int ret;
427
428 if (unlikely(size == 0))
429 return 0;
430
431 ret = __get_user(c, uaddr);
432 if (ret == 0) {
433 const char __user *end = uaddr + size - 1;
434
435 if (((unsigned long)uaddr & PAGE_MASK) !=
436 ((unsigned long)end & PAGE_MASK))
437 ret = __get_user(c, end);
438 }
439 return ret;
440}
441
442int add_to_page_cache_locked(struct page *page, struct address_space *mapping,
443 pgoff_t index, gfp_t gfp_mask);
444int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
445 pgoff_t index, gfp_t gfp_mask);
446extern void remove_from_page_cache(struct page *page);
447extern void __remove_from_page_cache(struct page *page);
448
449
450
451
452
453static inline int add_to_page_cache(struct page *page,
454 struct address_space *mapping, pgoff_t offset, gfp_t gfp_mask)
455{
456 int error;
457
458 __set_page_locked(page);
459 error = add_to_page_cache_locked(page, mapping, offset, gfp_mask);
460 if (unlikely(error))
461 __clear_page_locked(page);
462 return error;
463}
464
465#endif
466