1
2
3
4
5
6
7
8
9
10#include <linux/kernel.h>
11#include <linux/fs.h>
12#include <linux/mm.h>
13#include <linux/module.h>
14#include <linux/blkdev.h>
15#include <linux/backing-dev.h>
16#include <linux/task_io_accounting_ops.h>
17#include <linux/pagevec.h>
18#include <linux/pagemap.h>
19
20void default_unplug_io_fn(struct backing_dev_info *bdi, struct page *page)
21{
22}
23EXPORT_SYMBOL(default_unplug_io_fn);
24
25struct backing_dev_info default_backing_dev_info = {
26 .ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_CACHE_SIZE,
27 .state = 0,
28 .capabilities = BDI_CAP_MAP_COPY,
29 .unplug_io_fn = default_unplug_io_fn,
30};
31EXPORT_SYMBOL_GPL(default_backing_dev_info);
32
33
34
35
36
37void
38file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping)
39{
40 ra->ra_pages = mapping->backing_dev_info->ra_pages;
41 ra->prev_pos = -1;
42}
43EXPORT_SYMBOL_GPL(file_ra_state_init);
44
45#define list_to_page(head) (list_entry((head)->prev, struct page, lru))
46
47
48
49
50
51
52
53
54
55
56
57int read_cache_pages(struct address_space *mapping, struct list_head *pages,
58 int (*filler)(void *, struct page *), void *data)
59{
60 struct page *page;
61 int ret = 0;
62
63 while (!list_empty(pages)) {
64 page = list_to_page(pages);
65 list_del(&page->lru);
66 if (add_to_page_cache_lru(page, mapping,
67 page->index, GFP_KERNEL)) {
68 page_cache_release(page);
69 continue;
70 }
71 page_cache_release(page);
72
73 ret = filler(data, page);
74 if (unlikely(ret)) {
75 put_pages_list(pages);
76 break;
77 }
78 task_io_account_read(PAGE_CACHE_SIZE);
79 }
80 return ret;
81}
82
83EXPORT_SYMBOL(read_cache_pages);
84
85static int read_pages(struct address_space *mapping, struct file *filp,
86 struct list_head *pages, unsigned nr_pages)
87{
88 unsigned page_idx;
89 int ret;
90
91 if (mapping->a_ops->readpages) {
92 ret = mapping->a_ops->readpages(filp, mapping, pages, nr_pages);
93
94 put_pages_list(pages);
95 goto out;
96 }
97
98 for (page_idx = 0; page_idx < nr_pages; page_idx++) {
99 struct page *page = list_to_page(pages);
100 list_del(&page->lru);
101 if (!add_to_page_cache_lru(page, mapping,
102 page->index, GFP_KERNEL)) {
103 mapping->a_ops->readpage(filp, page);
104 }
105 page_cache_release(page);
106 }
107 ret = 0;
108out:
109 return ret;
110}
111
112
113
114
115
116
117
118
119
120
121
122
123static int
124__do_page_cache_readahead(struct address_space *mapping, struct file *filp,
125 pgoff_t offset, unsigned long nr_to_read,
126 unsigned long lookahead_size)
127{
128 struct inode *inode = mapping->host;
129 struct page *page;
130 unsigned long end_index;
131 LIST_HEAD(page_pool);
132 int page_idx;
133 int ret = 0;
134 loff_t isize = i_size_read(inode);
135
136 if (isize == 0)
137 goto out;
138
139 end_index = ((isize - 1) >> PAGE_CACHE_SHIFT);
140
141
142
143
144 for (page_idx = 0; page_idx < nr_to_read; page_idx++) {
145 pgoff_t page_offset = offset + page_idx;
146
147 if (page_offset > end_index)
148 break;
149
150 rcu_read_lock();
151 page = radix_tree_lookup(&mapping->page_tree, page_offset);
152 rcu_read_unlock();
153 if (page)
154 continue;
155
156 page = page_cache_alloc_cold(mapping);
157 if (!page)
158 break;
159 page->index = page_offset;
160 list_add(&page->lru, &page_pool);
161 if (page_idx == nr_to_read - lookahead_size)
162 SetPageReadahead(page);
163 ret++;
164 }
165
166
167
168
169
170
171 if (ret)
172 read_pages(mapping, filp, &page_pool, ret);
173 BUG_ON(!list_empty(&page_pool));
174out:
175 return ret;
176}
177
178
179
180
181
182int force_page_cache_readahead(struct address_space *mapping, struct file *filp,
183 pgoff_t offset, unsigned long nr_to_read)
184{
185 int ret = 0;
186
187 if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readpages))
188 return -EINVAL;
189
190 while (nr_to_read) {
191 int err;
192
193 unsigned long this_chunk = (2 * 1024 * 1024) / PAGE_CACHE_SIZE;
194
195 if (this_chunk > nr_to_read)
196 this_chunk = nr_to_read;
197 err = __do_page_cache_readahead(mapping, filp,
198 offset, this_chunk, 0);
199 if (err < 0) {
200 ret = err;
201 break;
202 }
203 ret += err;
204 offset += this_chunk;
205 nr_to_read -= this_chunk;
206 }
207 return ret;
208}
209
210
211
212
213
214
215
216
217int do_page_cache_readahead(struct address_space *mapping, struct file *filp,
218 pgoff_t offset, unsigned long nr_to_read)
219{
220 if (bdi_read_congested(mapping->backing_dev_info))
221 return -1;
222
223 return __do_page_cache_readahead(mapping, filp, offset, nr_to_read, 0);
224}
225
226
227
228
229
230unsigned long max_sane_readahead(unsigned long nr)
231{
232 return min(nr, (node_page_state(numa_node_id(), NR_INACTIVE_FILE)
233 + node_page_state(numa_node_id(), NR_FREE_PAGES)) / 2);
234}
235
236static int __init readahead_init(void)
237{
238 int err;
239
240 err = bdi_init(&default_backing_dev_info);
241 if (!err)
242 bdi_register(&default_backing_dev_info, NULL, "default");
243
244 return err;
245}
246subsys_initcall(readahead_init);
247
248
249
250
251static unsigned long ra_submit(struct file_ra_state *ra,
252 struct address_space *mapping, struct file *filp)
253{
254 int actual;
255
256 actual = __do_page_cache_readahead(mapping, filp,
257 ra->start, ra->size, ra->async_size);
258
259 return actual;
260}
261
262
263
264
265
266
267
268static unsigned long get_init_ra_size(unsigned long size, unsigned long max)
269{
270 unsigned long newsize = roundup_pow_of_two(size);
271
272 if (newsize <= max / 32)
273 newsize = newsize * 4;
274 else if (newsize <= max / 4)
275 newsize = newsize * 2;
276 else
277 newsize = max;
278
279 return newsize;
280}
281
282
283
284
285
286static unsigned long get_next_ra_size(struct file_ra_state *ra,
287 unsigned long max)
288{
289 unsigned long cur = ra->size;
290 unsigned long newsize;
291
292 if (cur < max / 16)
293 newsize = 4 * cur;
294 else
295 newsize = 2 * cur;
296
297 return min(newsize, max);
298}
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342static unsigned long
343ondemand_readahead(struct address_space *mapping,
344 struct file_ra_state *ra, struct file *filp,
345 bool hit_readahead_marker, pgoff_t offset,
346 unsigned long req_size)
347{
348 int max = ra->ra_pages;
349 pgoff_t prev_offset;
350 int sequential;
351
352
353
354
355
356 if (offset && (offset == (ra->start + ra->size - ra->async_size) ||
357 offset == (ra->start + ra->size))) {
358 ra->start += ra->size;
359 ra->size = get_next_ra_size(ra, max);
360 ra->async_size = ra->size;
361 goto readit;
362 }
363
364 prev_offset = ra->prev_pos >> PAGE_CACHE_SHIFT;
365 sequential = offset - prev_offset <= 1UL || req_size > max;
366
367
368
369
370
371 if (!hit_readahead_marker && !sequential) {
372 return __do_page_cache_readahead(mapping, filp,
373 offset, req_size, 0);
374 }
375
376
377
378
379
380
381
382 if (hit_readahead_marker) {
383 pgoff_t start;
384
385 rcu_read_lock();
386 start = radix_tree_next_hole(&mapping->page_tree, offset,max+1);
387 rcu_read_unlock();
388
389 if (!start || start - offset > max)
390 return 0;
391
392 ra->start = start;
393 ra->size = start - offset;
394 ra->size = get_next_ra_size(ra, max);
395 ra->async_size = ra->size;
396 goto readit;
397 }
398
399
400
401
402
403
404
405
406 ra->start = offset;
407 ra->size = get_init_ra_size(req_size, max);
408 ra->async_size = ra->size > req_size ? ra->size - req_size : ra->size;
409
410readit:
411 return ra_submit(ra, mapping, filp);
412}
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428void page_cache_sync_readahead(struct address_space *mapping,
429 struct file_ra_state *ra, struct file *filp,
430 pgoff_t offset, unsigned long req_size)
431{
432
433 if (!ra->ra_pages)
434 return;
435
436
437 ondemand_readahead(mapping, ra, filp, false, offset, req_size);
438}
439EXPORT_SYMBOL_GPL(page_cache_sync_readahead);
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456void
457page_cache_async_readahead(struct address_space *mapping,
458 struct file_ra_state *ra, struct file *filp,
459 struct page *page, pgoff_t offset,
460 unsigned long req_size)
461{
462
463 if (!ra->ra_pages)
464 return;
465
466
467
468
469 if (PageWriteback(page))
470 return;
471
472 ClearPageReadahead(page);
473
474
475
476
477 if (bdi_read_congested(mapping->backing_dev_info))
478 return;
479
480
481 ondemand_readahead(mapping, ra, filp, true, offset, req_size);
482}
483EXPORT_SYMBOL_GPL(page_cache_async_readahead);
484