FROMLIST: android: binder: Move buffer out of area shared with user space
[GitHub/LineageOS/android_kernel_samsung_universal7580.git] / mm / page_io.c
1 /*
2 * linux/mm/page_io.c
3 *
4 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
5 *
6 * Swap reorganised 29.12.95,
7 * Asynchronous swapping added 30.12.95. Stephen Tweedie
8 * Removed race in async swapping. 14.4.1996. Bruno Haible
9 * Add swap of shared pages through the page cache. 20.2.1998. Stephen Tweedie
10 * Always use brw_page, life becomes simpler. 12 May 1998 Eric Biederman
11 */
12
13 #include <linux/mm.h>
14 #include <linux/kernel_stat.h>
15 #include <linux/gfp.h>
16 #include <linux/pagemap.h>
17 #include <linux/swap.h>
18 #include <linux/bio.h>
19 #include <linux/swapops.h>
20 #include <linux/buffer_head.h>
21 #include <linux/writeback.h>
22 #include <linux/frontswap.h>
23 #include <linux/aio.h>
24 #include <linux/blkdev.h>
25 #include <asm/pgtable.h>
26
27 static struct bio *get_swap_bio(gfp_t gfp_flags,
28 struct page *page, bio_end_io_t end_io)
29 {
30 struct bio *bio;
31
32 bio = bio_alloc(gfp_flags, 1);
33 if (bio) {
34 bio->bi_sector = map_swap_page(page, &bio->bi_bdev);
35 bio->bi_sector <<= PAGE_SHIFT - 9;
36 bio->bi_io_vec[0].bv_page = page;
37 bio->bi_io_vec[0].bv_len = PAGE_SIZE;
38 bio->bi_io_vec[0].bv_offset = 0;
39 bio->bi_vcnt = 1;
40 bio->bi_size = PAGE_SIZE;
41 bio->bi_end_io = end_io;
42 }
43 return bio;
44 }
45
46 void end_swap_bio_write(struct bio *bio, int err)
47 {
48 const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
49 struct page *page = bio->bi_io_vec[0].bv_page;
50
51 if (!uptodate) {
52 SetPageError(page);
53 /*
54 * We failed to write the page out to swap-space.
55 * Re-dirty the page in order to avoid it being reclaimed.
56 * Also print a dire warning that things will go BAD (tm)
57 * very quickly.
58 *
59 * Also clear PG_reclaim to avoid rotate_reclaimable_page()
60 */
61 set_page_dirty(page);
62 #ifndef CONFIG_VNSWAP
63 printk(KERN_ALERT "Write-error on swap-device (%u:%u:%Lu)\n",
64 imajor(bio->bi_bdev->bd_inode),
65 iminor(bio->bi_bdev->bd_inode),
66 (unsigned long long)bio->bi_sector);
67 #endif
68 ClearPageReclaim(page);
69 }
70 end_page_writeback(page);
71 bio_put(bio);
72 }
73
74 void end_swap_bio_read(struct bio *bio, int err)
75 {
76 const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
77 struct page *page = bio->bi_io_vec[0].bv_page;
78
79 if (!uptodate) {
80 SetPageError(page);
81 ClearPageUptodate(page);
82 printk(KERN_ALERT "Read-error on swap-device (%u:%u:%Lu)\n",
83 imajor(bio->bi_bdev->bd_inode),
84 iminor(bio->bi_bdev->bd_inode),
85 (unsigned long long)bio->bi_sector);
86 goto out;
87 }
88
89 SetPageUptodate(page);
90
91 /*
92 * There is no guarantee that the page is in swap cache - the software
93 * suspend code (at least) uses end_swap_bio_read() against a non-
94 * swapcache page. So we must check PG_swapcache before proceeding with
95 * this optimization.
96 */
97 if (likely(PageSwapCache(page))) {
98 struct swap_info_struct *sis;
99
100 sis = page_swap_info(page);
101 if (sis->flags & SWP_BLKDEV) {
102 /*
103 * The swap subsystem performs lazy swap slot freeing,
104 * expecting that the page will be swapped out again.
105 * So we can avoid an unnecessary write if the page
106 * isn't redirtied.
107 * This is good for real swap storage because we can
108 * reduce unnecessary I/O and enhance wear-leveling
109 * if an SSD is used as the as swap device.
110 * But if in-memory swap device (eg zram) is used,
111 * this causes a duplicated copy between uncompressed
112 * data in VM-owned memory and compressed data in
113 * zram-owned memory. So let's free zram-owned memory
114 * and make the VM-owned decompressed page *dirty*,
115 * so the page should be swapped out somewhere again if
116 * we again wish to reclaim it.
117 */
118 struct gendisk *disk = sis->bdev->bd_disk;
119 if (disk->fops->swap_slot_free_notify) {
120 swp_entry_t entry;
121 unsigned long offset;
122
123 entry.val = page_private(page);
124 offset = swp_offset(entry);
125
126 SetPageDirty(page);
127 disk->fops->swap_slot_free_notify(sis->bdev,
128 offset);
129 }
130 }
131 }
132
133 out:
134 unlock_page(page);
135 bio_put(bio);
136 }
137
138 int generic_swapfile_activate(struct swap_info_struct *sis,
139 struct file *swap_file,
140 sector_t *span)
141 {
142 struct address_space *mapping = swap_file->f_mapping;
143 struct inode *inode = mapping->host;
144 unsigned blocks_per_page;
145 unsigned long page_no;
146 unsigned blkbits;
147 sector_t probe_block;
148 sector_t last_block;
149 sector_t lowest_block = -1;
150 sector_t highest_block = 0;
151 int nr_extents = 0;
152 int ret;
153
154 blkbits = inode->i_blkbits;
155 blocks_per_page = PAGE_SIZE >> blkbits;
156
157 /*
158 * Map all the blocks into the extent list. This code doesn't try
159 * to be very smart.
160 */
161 probe_block = 0;
162 page_no = 0;
163 last_block = i_size_read(inode) >> blkbits;
164 while ((probe_block + blocks_per_page) <= last_block &&
165 page_no < sis->max) {
166 unsigned block_in_page;
167 sector_t first_block;
168
169 first_block = bmap(inode, probe_block);
170 if (first_block == 0)
171 goto bad_bmap;
172
173 /*
174 * It must be PAGE_SIZE aligned on-disk
175 */
176 if (first_block & (blocks_per_page - 1)) {
177 probe_block++;
178 goto reprobe;
179 }
180
181 for (block_in_page = 1; block_in_page < blocks_per_page;
182 block_in_page++) {
183 sector_t block;
184
185 block = bmap(inode, probe_block + block_in_page);
186 if (block == 0)
187 goto bad_bmap;
188 if (block != first_block + block_in_page) {
189 /* Discontiguity */
190 probe_block++;
191 goto reprobe;
192 }
193 }
194
195 first_block >>= (PAGE_SHIFT - blkbits);
196 if (page_no) { /* exclude the header page */
197 if (first_block < lowest_block)
198 lowest_block = first_block;
199 if (first_block > highest_block)
200 highest_block = first_block;
201 }
202
203 /*
204 * We found a PAGE_SIZE-length, PAGE_SIZE-aligned run of blocks
205 */
206 ret = add_swap_extent(sis, page_no, 1, first_block);
207 if (ret < 0)
208 goto out;
209 nr_extents += ret;
210 page_no++;
211 probe_block += blocks_per_page;
212 reprobe:
213 continue;
214 }
215 ret = nr_extents;
216 *span = 1 + highest_block - lowest_block;
217 if (page_no == 0)
218 page_no = 1; /* force Empty message */
219 sis->max = page_no;
220 sis->pages = page_no - 1;
221 sis->highest_bit = page_no - 1;
222 out:
223 return ret;
224 bad_bmap:
225 printk(KERN_ERR "swapon: swapfile has holes\n");
226 ret = -EINVAL;
227 goto out;
228 }
229
230 /*
231 * We may have stale swap cache pages in memory: notice
232 * them here and get rid of the unnecessary final write.
233 */
234 int swap_writepage(struct page *page, struct writeback_control *wbc)
235 {
236 int ret = 0;
237
238 if (try_to_free_swap(page)) {
239 unlock_page(page);
240 goto out;
241 }
242 if (frontswap_store(page) == 0) {
243 set_page_writeback(page);
244 unlock_page(page);
245 end_page_writeback(page);
246 goto out;
247 }
248 ret = __swap_writepage(page, wbc, end_swap_bio_write);
249 out:
250 return ret;
251 }
252
253 int __swap_writepage(struct page *page, struct writeback_control *wbc,
254 void (*end_write_func)(struct bio *, int))
255 {
256 struct bio *bio;
257 int ret = 0, rw = WRITE;
258 struct swap_info_struct *sis = page_swap_info(page);
259
260 if (sis->flags & SWP_FILE) {
261 struct kiocb kiocb;
262 struct file *swap_file = sis->swap_file;
263 struct address_space *mapping = swap_file->f_mapping;
264 struct iovec iov = {
265 .iov_base = kmap(page),
266 .iov_len = PAGE_SIZE,
267 };
268
269 init_sync_kiocb(&kiocb, swap_file);
270 kiocb.ki_pos = page_file_offset(page);
271 kiocb.ki_left = PAGE_SIZE;
272 kiocb.ki_nbytes = PAGE_SIZE;
273
274 set_page_writeback(page);
275 unlock_page(page);
276 ret = mapping->a_ops->direct_IO(KERNEL_WRITE,
277 &kiocb, &iov,
278 kiocb.ki_pos, 1);
279 kunmap(page);
280 if (ret == PAGE_SIZE) {
281 count_vm_event(PSWPOUT);
282 ret = 0;
283 } else {
284 /*
285 * In the case of swap-over-nfs, this can be a
286 * temporary failure if the system has limited
287 * memory for allocating transmit buffers.
288 * Mark the page dirty and avoid
289 * rotate_reclaimable_page but rate-limit the
290 * messages but do not flag PageError like
291 * the normal direct-to-bio case as it could
292 * be temporary.
293 */
294 set_page_dirty(page);
295 ClearPageReclaim(page);
296 pr_err_ratelimited("Write error on dio swapfile (%Lu)\n",
297 page_file_offset(page));
298 }
299 end_page_writeback(page);
300 return ret;
301 }
302
303 bio = get_swap_bio(GFP_NOIO, page, end_write_func);
304 if (bio == NULL) {
305 set_page_dirty(page);
306 unlock_page(page);
307 ret = -ENOMEM;
308 goto out;
309 }
310 if (wbc->sync_mode == WB_SYNC_ALL)
311 rw |= REQ_SYNC;
312 count_vm_event(PSWPOUT);
313 set_page_writeback(page);
314 unlock_page(page);
315 submit_bio(rw, bio);
316 out:
317 return ret;
318 }
319
320 int swap_readpage(struct page *page)
321 {
322 struct bio *bio;
323 int ret = 0;
324 struct swap_info_struct *sis = page_swap_info(page);
325
326 VM_BUG_ON(!PageLocked(page));
327 VM_BUG_ON(PageUptodate(page));
328 if (frontswap_load(page) == 0) {
329 SetPageUptodate(page);
330 unlock_page(page);
331 goto out;
332 }
333
334 if (sis->flags & SWP_FILE) {
335 struct file *swap_file = sis->swap_file;
336 struct address_space *mapping = swap_file->f_mapping;
337
338 ret = mapping->a_ops->readpage(swap_file, page);
339 if (!ret)
340 count_vm_event(PSWPIN);
341 return ret;
342 }
343
344 bio = get_swap_bio(GFP_KERNEL, page, end_swap_bio_read);
345 if (bio == NULL) {
346 unlock_page(page);
347 ret = -ENOMEM;
348 goto out;
349 }
350 count_vm_event(PSWPIN);
351 submit_bio(READ, bio);
352 out:
353 return ret;
354 }
355
356 int swap_set_page_dirty(struct page *page)
357 {
358 struct swap_info_struct *sis = page_swap_info(page);
359
360 if (sis->flags & SWP_FILE) {
361 struct address_space *mapping = sis->swap_file->f_mapping;
362 return mapping->a_ops->set_page_dirty(page);
363 } else {
364 return __set_page_dirty_no_writeback(page);
365 }
366 }