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