diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/backing-dev.c | 8 | ||||
-rw-r--r-- | mm/filemap.c | 74 | ||||
-rw-r--r-- | mm/memory-failure.c | 8 | ||||
-rw-r--r-- | mm/nommu.c | 4 | ||||
-rw-r--r-- | mm/oom_kill.c | 2 | ||||
-rw-r--r-- | mm/page-writeback.c | 10 | ||||
-rw-r--r-- | mm/page_alloc.c | 2 | ||||
-rw-r--r-- | mm/page_io.c | 2 | ||||
-rw-r--r-- | mm/readahead.c | 18 | ||||
-rw-r--r-- | mm/shmem.c | 1 | ||||
-rw-r--r-- | mm/slub.c | 6 | ||||
-rw-r--r-- | mm/swap_state.c | 5 | ||||
-rw-r--r-- | mm/swapfile.c | 37 | ||||
-rw-r--r-- | mm/vmscan.c | 2 |
14 files changed, 40 insertions, 139 deletions
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 4b3e9f17ee21..0d9a036ada66 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c | |||
@@ -14,17 +14,11 @@ | |||
14 | 14 | ||
15 | static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0); | 15 | static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0); |
16 | 16 | ||
17 | void default_unplug_io_fn(struct backing_dev_info *bdi, struct page *page) | ||
18 | { | ||
19 | } | ||
20 | EXPORT_SYMBOL(default_unplug_io_fn); | ||
21 | |||
22 | struct backing_dev_info default_backing_dev_info = { | 17 | struct backing_dev_info default_backing_dev_info = { |
23 | .name = "default", | 18 | .name = "default", |
24 | .ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_CACHE_SIZE, | 19 | .ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_CACHE_SIZE, |
25 | .state = 0, | 20 | .state = 0, |
26 | .capabilities = BDI_CAP_MAP_COPY, | 21 | .capabilities = BDI_CAP_MAP_COPY, |
27 | .unplug_io_fn = default_unplug_io_fn, | ||
28 | }; | 22 | }; |
29 | EXPORT_SYMBOL_GPL(default_backing_dev_info); | 23 | EXPORT_SYMBOL_GPL(default_backing_dev_info); |
30 | 24 | ||
@@ -604,7 +598,7 @@ static void bdi_prune_sb(struct backing_dev_info *bdi) | |||
604 | spin_lock(&sb_lock); | 598 | spin_lock(&sb_lock); |
605 | list_for_each_entry(sb, &super_blocks, s_list) { | 599 | list_for_each_entry(sb, &super_blocks, s_list) { |
606 | if (sb->s_bdi == bdi) | 600 | if (sb->s_bdi == bdi) |
607 | sb->s_bdi = NULL; | 601 | sb->s_bdi = &default_backing_dev_info; |
608 | } | 602 | } |
609 | spin_unlock(&sb_lock); | 603 | spin_unlock(&sb_lock); |
610 | } | 604 | } |
diff --git a/mm/filemap.c b/mm/filemap.c index d8b34d1a1071..c641edf553a9 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -166,45 +166,15 @@ void delete_from_page_cache(struct page *page) | |||
166 | } | 166 | } |
167 | EXPORT_SYMBOL(delete_from_page_cache); | 167 | EXPORT_SYMBOL(delete_from_page_cache); |
168 | 168 | ||
169 | static int sync_page(void *word) | 169 | static int sleep_on_page(void *word) |
170 | { | 170 | { |
171 | struct address_space *mapping; | ||
172 | struct page *page; | ||
173 | |||
174 | page = container_of((unsigned long *)word, struct page, flags); | ||
175 | |||
176 | /* | ||
177 | * page_mapping() is being called without PG_locked held. | ||
178 | * Some knowledge of the state and use of the page is used to | ||
179 | * reduce the requirements down to a memory barrier. | ||
180 | * The danger here is of a stale page_mapping() return value | ||
181 | * indicating a struct address_space different from the one it's | ||
182 | * associated with when it is associated with one. | ||
183 | * After smp_mb(), it's either the correct page_mapping() for | ||
184 | * the page, or an old page_mapping() and the page's own | ||
185 | * page_mapping() has gone NULL. | ||
186 | * The ->sync_page() address_space operation must tolerate | ||
187 | * page_mapping() going NULL. By an amazing coincidence, | ||
188 | * this comes about because none of the users of the page | ||
189 | * in the ->sync_page() methods make essential use of the | ||
190 | * page_mapping(), merely passing the page down to the backing | ||
191 | * device's unplug functions when it's non-NULL, which in turn | ||
192 | * ignore it for all cases but swap, where only page_private(page) is | ||
193 | * of interest. When page_mapping() does go NULL, the entire | ||
194 | * call stack gracefully ignores the page and returns. | ||
195 | * -- wli | ||
196 | */ | ||
197 | smp_mb(); | ||
198 | mapping = page_mapping(page); | ||
199 | if (mapping && mapping->a_ops && mapping->a_ops->sync_page) | ||
200 | mapping->a_ops->sync_page(page); | ||
201 | io_schedule(); | 171 | io_schedule(); |
202 | return 0; | 172 | return 0; |
203 | } | 173 | } |
204 | 174 | ||
205 | static int sync_page_killable(void *word) | 175 | static int sleep_on_page_killable(void *word) |
206 | { | 176 | { |
207 | sync_page(word); | 177 | sleep_on_page(word); |
208 | return fatal_signal_pending(current) ? -EINTR : 0; | 178 | return fatal_signal_pending(current) ? -EINTR : 0; |
209 | } | 179 | } |
210 | 180 | ||
@@ -560,12 +530,6 @@ struct page *__page_cache_alloc(gfp_t gfp) | |||
560 | EXPORT_SYMBOL(__page_cache_alloc); | 530 | EXPORT_SYMBOL(__page_cache_alloc); |
561 | #endif | 531 | #endif |
562 | 532 | ||
563 | static int __sleep_on_page_lock(void *word) | ||
564 | { | ||
565 | io_schedule(); | ||
566 | return 0; | ||
567 | } | ||
568 | |||
569 | /* | 533 | /* |
570 | * In order to wait for pages to become available there must be | 534 | * In order to wait for pages to become available there must be |
571 | * waitqueues associated with pages. By using a hash table of | 535 | * waitqueues associated with pages. By using a hash table of |
@@ -593,7 +557,7 @@ void wait_on_page_bit(struct page *page, int bit_nr) | |||
593 | DEFINE_WAIT_BIT(wait, &page->flags, bit_nr); | 557 | DEFINE_WAIT_BIT(wait, &page->flags, bit_nr); |
594 | 558 | ||
595 | if (test_bit(bit_nr, &page->flags)) | 559 | if (test_bit(bit_nr, &page->flags)) |
596 | __wait_on_bit(page_waitqueue(page), &wait, sync_page, | 560 | __wait_on_bit(page_waitqueue(page), &wait, sleep_on_page, |
597 | TASK_UNINTERRUPTIBLE); | 561 | TASK_UNINTERRUPTIBLE); |
598 | } | 562 | } |
599 | EXPORT_SYMBOL(wait_on_page_bit); | 563 | EXPORT_SYMBOL(wait_on_page_bit); |
@@ -657,17 +621,12 @@ EXPORT_SYMBOL(end_page_writeback); | |||
657 | /** | 621 | /** |
658 | * __lock_page - get a lock on the page, assuming we need to sleep to get it | 622 | * __lock_page - get a lock on the page, assuming we need to sleep to get it |
659 | * @page: the page to lock | 623 | * @page: the page to lock |
660 | * | ||
661 | * Ugly. Running sync_page() in state TASK_UNINTERRUPTIBLE is scary. If some | ||
662 | * random driver's requestfn sets TASK_RUNNING, we could busywait. However | ||
663 | * chances are that on the second loop, the block layer's plug list is empty, | ||
664 | * so sync_page() will then return in state TASK_UNINTERRUPTIBLE. | ||
665 | */ | 624 | */ |
666 | void __lock_page(struct page *page) | 625 | void __lock_page(struct page *page) |
667 | { | 626 | { |
668 | DEFINE_WAIT_BIT(wait, &page->flags, PG_locked); | 627 | DEFINE_WAIT_BIT(wait, &page->flags, PG_locked); |
669 | 628 | ||
670 | __wait_on_bit_lock(page_waitqueue(page), &wait, sync_page, | 629 | __wait_on_bit_lock(page_waitqueue(page), &wait, sleep_on_page, |
671 | TASK_UNINTERRUPTIBLE); | 630 | TASK_UNINTERRUPTIBLE); |
672 | } | 631 | } |
673 | EXPORT_SYMBOL(__lock_page); | 632 | EXPORT_SYMBOL(__lock_page); |
@@ -677,24 +636,10 @@ int __lock_page_killable(struct page *page) | |||
677 | DEFINE_WAIT_BIT(wait, &page->flags, PG_locked); | 636 | DEFINE_WAIT_BIT(wait, &page->flags, PG_locked); |
678 | 637 | ||
679 | return __wait_on_bit_lock(page_waitqueue(page), &wait, | 638 | return __wait_on_bit_lock(page_waitqueue(page), &wait, |
680 | sync_page_killable, TASK_KILLABLE); | 639 | sleep_on_page_killable, TASK_KILLABLE); |
681 | } | 640 | } |
682 | EXPORT_SYMBOL_GPL(__lock_page_killable); | 641 | EXPORT_SYMBOL_GPL(__lock_page_killable); |
683 | 642 | ||
684 | /** | ||
685 | * __lock_page_nosync - get a lock on the page, without calling sync_page() | ||
686 | * @page: the page to lock | ||
687 | * | ||
688 | * Variant of lock_page that does not require the caller to hold a reference | ||
689 | * on the page's mapping. | ||
690 | */ | ||
691 | void __lock_page_nosync(struct page *page) | ||
692 | { | ||
693 | DEFINE_WAIT_BIT(wait, &page->flags, PG_locked); | ||
694 | __wait_on_bit_lock(page_waitqueue(page), &wait, __sleep_on_page_lock, | ||
695 | TASK_UNINTERRUPTIBLE); | ||
696 | } | ||
697 | |||
698 | int __lock_page_or_retry(struct page *page, struct mm_struct *mm, | 643 | int __lock_page_or_retry(struct page *page, struct mm_struct *mm, |
699 | unsigned int flags) | 644 | unsigned int flags) |
700 | { | 645 | { |
@@ -1409,12 +1354,15 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
1409 | unsigned long seg = 0; | 1354 | unsigned long seg = 0; |
1410 | size_t count; | 1355 | size_t count; |
1411 | loff_t *ppos = &iocb->ki_pos; | 1356 | loff_t *ppos = &iocb->ki_pos; |
1357 | struct blk_plug plug; | ||
1412 | 1358 | ||
1413 | count = 0; | 1359 | count = 0; |
1414 | retval = generic_segment_checks(iov, &nr_segs, &count, VERIFY_WRITE); | 1360 | retval = generic_segment_checks(iov, &nr_segs, &count, VERIFY_WRITE); |
1415 | if (retval) | 1361 | if (retval) |
1416 | return retval; | 1362 | return retval; |
1417 | 1363 | ||
1364 | blk_start_plug(&plug); | ||
1365 | |||
1418 | /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */ | 1366 | /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */ |
1419 | if (filp->f_flags & O_DIRECT) { | 1367 | if (filp->f_flags & O_DIRECT) { |
1420 | loff_t size; | 1368 | loff_t size; |
@@ -1487,6 +1435,7 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
1487 | break; | 1435 | break; |
1488 | } | 1436 | } |
1489 | out: | 1437 | out: |
1438 | blk_finish_plug(&plug); | ||
1490 | return retval; | 1439 | return retval; |
1491 | } | 1440 | } |
1492 | EXPORT_SYMBOL(generic_file_aio_read); | 1441 | EXPORT_SYMBOL(generic_file_aio_read); |
@@ -2598,11 +2547,13 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
2598 | { | 2547 | { |
2599 | struct file *file = iocb->ki_filp; | 2548 | struct file *file = iocb->ki_filp; |
2600 | struct inode *inode = file->f_mapping->host; | 2549 | struct inode *inode = file->f_mapping->host; |
2550 | struct blk_plug plug; | ||
2601 | ssize_t ret; | 2551 | ssize_t ret; |
2602 | 2552 | ||
2603 | BUG_ON(iocb->ki_pos != pos); | 2553 | BUG_ON(iocb->ki_pos != pos); |
2604 | 2554 | ||
2605 | mutex_lock(&inode->i_mutex); | 2555 | mutex_lock(&inode->i_mutex); |
2556 | blk_start_plug(&plug); | ||
2606 | ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); | 2557 | ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); |
2607 | mutex_unlock(&inode->i_mutex); | 2558 | mutex_unlock(&inode->i_mutex); |
2608 | 2559 | ||
@@ -2613,6 +2564,7 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
2613 | if (err < 0 && ret > 0) | 2564 | if (err < 0 && ret > 0) |
2614 | ret = err; | 2565 | ret = err; |
2615 | } | 2566 | } |
2567 | blk_finish_plug(&plug); | ||
2616 | return ret; | 2568 | return ret; |
2617 | } | 2569 | } |
2618 | EXPORT_SYMBOL(generic_file_aio_write); | 2570 | EXPORT_SYMBOL(generic_file_aio_write); |
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index e0af336530c6..37feb9fec228 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c | |||
@@ -945,7 +945,7 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn, | |||
945 | collect_procs(ppage, &tokill); | 945 | collect_procs(ppage, &tokill); |
946 | 946 | ||
947 | if (hpage != ppage) | 947 | if (hpage != ppage) |
948 | lock_page_nosync(ppage); | 948 | lock_page(ppage); |
949 | 949 | ||
950 | ret = try_to_unmap(ppage, ttu); | 950 | ret = try_to_unmap(ppage, ttu); |
951 | if (ret != SWAP_SUCCESS) | 951 | if (ret != SWAP_SUCCESS) |
@@ -1038,7 +1038,7 @@ int __memory_failure(unsigned long pfn, int trapno, int flags) | |||
1038 | * Check "just unpoisoned", "filter hit", and | 1038 | * Check "just unpoisoned", "filter hit", and |
1039 | * "race with other subpage." | 1039 | * "race with other subpage." |
1040 | */ | 1040 | */ |
1041 | lock_page_nosync(hpage); | 1041 | lock_page(hpage); |
1042 | if (!PageHWPoison(hpage) | 1042 | if (!PageHWPoison(hpage) |
1043 | || (hwpoison_filter(p) && TestClearPageHWPoison(p)) | 1043 | || (hwpoison_filter(p) && TestClearPageHWPoison(p)) |
1044 | || (p != hpage && TestSetPageHWPoison(hpage))) { | 1044 | || (p != hpage && TestSetPageHWPoison(hpage))) { |
@@ -1088,7 +1088,7 @@ int __memory_failure(unsigned long pfn, int trapno, int flags) | |||
1088 | * It's very difficult to mess with pages currently under IO | 1088 | * It's very difficult to mess with pages currently under IO |
1089 | * and in many cases impossible, so we just avoid it here. | 1089 | * and in many cases impossible, so we just avoid it here. |
1090 | */ | 1090 | */ |
1091 | lock_page_nosync(hpage); | 1091 | lock_page(hpage); |
1092 | 1092 | ||
1093 | /* | 1093 | /* |
1094 | * unpoison always clear PG_hwpoison inside page lock | 1094 | * unpoison always clear PG_hwpoison inside page lock |
@@ -1231,7 +1231,7 @@ int unpoison_memory(unsigned long pfn) | |||
1231 | return 0; | 1231 | return 0; |
1232 | } | 1232 | } |
1233 | 1233 | ||
1234 | lock_page_nosync(page); | 1234 | lock_page(page); |
1235 | /* | 1235 | /* |
1236 | * This test is racy because PG_hwpoison is set outside of page lock. | 1236 | * This test is racy because PG_hwpoison is set outside of page lock. |
1237 | * That's acceptable because that won't trigger kernel panic. Instead, | 1237 | * That's acceptable because that won't trigger kernel panic. Instead, |
diff --git a/mm/nommu.c b/mm/nommu.c index e629143f9440..cb86e7d5e7f5 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -1842,10 +1842,6 @@ int remap_vmalloc_range(struct vm_area_struct *vma, void *addr, | |||
1842 | } | 1842 | } |
1843 | EXPORT_SYMBOL(remap_vmalloc_range); | 1843 | EXPORT_SYMBOL(remap_vmalloc_range); |
1844 | 1844 | ||
1845 | void swap_unplug_io_fn(struct backing_dev_info *bdi, struct page *page) | ||
1846 | { | ||
1847 | } | ||
1848 | |||
1849 | unsigned long arch_get_unmapped_area(struct file *file, unsigned long addr, | 1845 | unsigned long arch_get_unmapped_area(struct file *file, unsigned long addr, |
1850 | unsigned long len, unsigned long pgoff, unsigned long flags) | 1846 | unsigned long len, unsigned long pgoff, unsigned long flags) |
1851 | { | 1847 | { |
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 62a5cec08a17..6a819d1b2c7d 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
@@ -406,7 +406,7 @@ static void dump_header(struct task_struct *p, gfp_t gfp_mask, int order, | |||
406 | task_unlock(current); | 406 | task_unlock(current); |
407 | dump_stack(); | 407 | dump_stack(); |
408 | mem_cgroup_print_oom_info(mem, p); | 408 | mem_cgroup_print_oom_info(mem, p); |
409 | __show_mem(SHOW_MEM_FILTER_NODES); | 409 | show_mem(SHOW_MEM_FILTER_NODES); |
410 | if (sysctl_oom_dump_tasks) | 410 | if (sysctl_oom_dump_tasks) |
411 | dump_tasks(mem, nodemask); | 411 | dump_tasks(mem, nodemask); |
412 | } | 412 | } |
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 632b46479c94..31f698862420 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
@@ -1040,11 +1040,17 @@ static int __writepage(struct page *page, struct writeback_control *wbc, | |||
1040 | int generic_writepages(struct address_space *mapping, | 1040 | int generic_writepages(struct address_space *mapping, |
1041 | struct writeback_control *wbc) | 1041 | struct writeback_control *wbc) |
1042 | { | 1042 | { |
1043 | struct blk_plug plug; | ||
1044 | int ret; | ||
1045 | |||
1043 | /* deal with chardevs and other special file */ | 1046 | /* deal with chardevs and other special file */ |
1044 | if (!mapping->a_ops->writepage) | 1047 | if (!mapping->a_ops->writepage) |
1045 | return 0; | 1048 | return 0; |
1046 | 1049 | ||
1047 | return write_cache_pages(mapping, wbc, __writepage, mapping); | 1050 | blk_start_plug(&plug); |
1051 | ret = write_cache_pages(mapping, wbc, __writepage, mapping); | ||
1052 | blk_finish_plug(&plug); | ||
1053 | return ret; | ||
1048 | } | 1054 | } |
1049 | 1055 | ||
1050 | EXPORT_SYMBOL(generic_writepages); | 1056 | EXPORT_SYMBOL(generic_writepages); |
@@ -1251,7 +1257,7 @@ int set_page_dirty_lock(struct page *page) | |||
1251 | { | 1257 | { |
1252 | int ret; | 1258 | int ret; |
1253 | 1259 | ||
1254 | lock_page_nosync(page); | 1260 | lock_page(page); |
1255 | ret = set_page_dirty(page); | 1261 | ret = set_page_dirty(page); |
1256 | unlock_page(page); | 1262 | unlock_page(page); |
1257 | return ret; | 1263 | return ret; |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 8e5726ab0d85..d6e7ba7373be 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -2195,7 +2195,7 @@ nopage: | |||
2195 | current->comm, order, gfp_mask); | 2195 | current->comm, order, gfp_mask); |
2196 | dump_stack(); | 2196 | dump_stack(); |
2197 | if (!should_suppress_show_mem()) | 2197 | if (!should_suppress_show_mem()) |
2198 | __show_mem(filter); | 2198 | show_mem(filter); |
2199 | } | 2199 | } |
2200 | return page; | 2200 | return page; |
2201 | got_pg: | 2201 | got_pg: |
diff --git a/mm/page_io.c b/mm/page_io.c index 2dee975bf469..dc76b4d0611e 100644 --- a/mm/page_io.c +++ b/mm/page_io.c | |||
@@ -106,7 +106,7 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) | |||
106 | goto out; | 106 | goto out; |
107 | } | 107 | } |
108 | if (wbc->sync_mode == WB_SYNC_ALL) | 108 | if (wbc->sync_mode == WB_SYNC_ALL) |
109 | rw |= REQ_SYNC | REQ_UNPLUG; | 109 | rw |= REQ_SYNC; |
110 | count_vm_event(PSWPOUT); | 110 | count_vm_event(PSWPOUT); |
111 | set_page_writeback(page); | 111 | set_page_writeback(page); |
112 | unlock_page(page); | 112 | unlock_page(page); |
diff --git a/mm/readahead.c b/mm/readahead.c index 77506a291a2d..2c0cc489e288 100644 --- a/mm/readahead.c +++ b/mm/readahead.c | |||
@@ -109,9 +109,12 @@ EXPORT_SYMBOL(read_cache_pages); | |||
109 | static int read_pages(struct address_space *mapping, struct file *filp, | 109 | static int read_pages(struct address_space *mapping, struct file *filp, |
110 | struct list_head *pages, unsigned nr_pages) | 110 | struct list_head *pages, unsigned nr_pages) |
111 | { | 111 | { |
112 | struct blk_plug plug; | ||
112 | unsigned page_idx; | 113 | unsigned page_idx; |
113 | int ret; | 114 | int ret; |
114 | 115 | ||
116 | blk_start_plug(&plug); | ||
117 | |||
115 | if (mapping->a_ops->readpages) { | 118 | if (mapping->a_ops->readpages) { |
116 | ret = mapping->a_ops->readpages(filp, mapping, pages, nr_pages); | 119 | ret = mapping->a_ops->readpages(filp, mapping, pages, nr_pages); |
117 | /* Clean up the remaining pages */ | 120 | /* Clean up the remaining pages */ |
@@ -129,7 +132,10 @@ static int read_pages(struct address_space *mapping, struct file *filp, | |||
129 | page_cache_release(page); | 132 | page_cache_release(page); |
130 | } | 133 | } |
131 | ret = 0; | 134 | ret = 0; |
135 | |||
132 | out: | 136 | out: |
137 | blk_finish_plug(&plug); | ||
138 | |||
133 | return ret; | 139 | return ret; |
134 | } | 140 | } |
135 | 141 | ||
@@ -554,17 +560,5 @@ page_cache_async_readahead(struct address_space *mapping, | |||
554 | 560 | ||
555 | /* do read-ahead */ | 561 | /* do read-ahead */ |
556 | ondemand_readahead(mapping, ra, filp, true, offset, req_size); | 562 | ondemand_readahead(mapping, ra, filp, true, offset, req_size); |
557 | |||
558 | #ifdef CONFIG_BLOCK | ||
559 | /* | ||
560 | * Normally the current page is !uptodate and lock_page() will be | ||
561 | * immediately called to implicitly unplug the device. However this | ||
562 | * is not always true for RAID conifgurations, where data arrives | ||
563 | * not strictly in their submission order. In this case we need to | ||
564 | * explicitly kick off the IO. | ||
565 | */ | ||
566 | if (PageUptodate(page)) | ||
567 | blk_run_backing_dev(mapping->backing_dev_info, NULL); | ||
568 | #endif | ||
569 | } | 563 | } |
570 | EXPORT_SYMBOL_GPL(page_cache_async_readahead); | 564 | EXPORT_SYMBOL_GPL(page_cache_async_readahead); |
diff --git a/mm/shmem.c b/mm/shmem.c index 91ce9a1024d7..58da7c150ba6 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -224,7 +224,6 @@ static const struct vm_operations_struct shmem_vm_ops; | |||
224 | static struct backing_dev_info shmem_backing_dev_info __read_mostly = { | 224 | static struct backing_dev_info shmem_backing_dev_info __read_mostly = { |
225 | .ra_pages = 0, /* No readahead */ | 225 | .ra_pages = 0, /* No readahead */ |
226 | .capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK | BDI_CAP_SWAP_BACKED, | 226 | .capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK | BDI_CAP_SWAP_BACKED, |
227 | .unplug_io_fn = default_unplug_io_fn, | ||
228 | }; | 227 | }; |
229 | 228 | ||
230 | static LIST_HEAD(shmem_swaplist); | 229 | static LIST_HEAD(shmem_swaplist); |
@@ -849,11 +849,11 @@ static inline void slab_free_hook(struct kmem_cache *s, void *x) | |||
849 | local_irq_save(flags); | 849 | local_irq_save(flags); |
850 | kmemcheck_slab_free(s, x, s->objsize); | 850 | kmemcheck_slab_free(s, x, s->objsize); |
851 | debug_check_no_locks_freed(x, s->objsize); | 851 | debug_check_no_locks_freed(x, s->objsize); |
852 | if (!(s->flags & SLAB_DEBUG_OBJECTS)) | ||
853 | debug_check_no_obj_freed(x, s->objsize); | ||
854 | local_irq_restore(flags); | 852 | local_irq_restore(flags); |
855 | } | 853 | } |
856 | #endif | 854 | #endif |
855 | if (!(s->flags & SLAB_DEBUG_OBJECTS)) | ||
856 | debug_check_no_obj_freed(x, s->objsize); | ||
857 | } | 857 | } |
858 | 858 | ||
859 | /* | 859 | /* |
@@ -1604,7 +1604,7 @@ static inline void note_cmpxchg_failure(const char *n, | |||
1604 | 1604 | ||
1605 | void init_kmem_cache_cpus(struct kmem_cache *s) | 1605 | void init_kmem_cache_cpus(struct kmem_cache *s) |
1606 | { | 1606 | { |
1607 | #if defined(CONFIG_CMPXCHG_LOCAL) && defined(CONFIG_PREEMPT) | 1607 | #ifdef CONFIG_CMPXCHG_LOCAL |
1608 | int cpu; | 1608 | int cpu; |
1609 | 1609 | ||
1610 | for_each_possible_cpu(cpu) | 1610 | for_each_possible_cpu(cpu) |
diff --git a/mm/swap_state.c b/mm/swap_state.c index 5c8cfabbc9bc..46680461785b 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
@@ -24,12 +24,10 @@ | |||
24 | 24 | ||
25 | /* | 25 | /* |
26 | * swapper_space is a fiction, retained to simplify the path through | 26 | * swapper_space is a fiction, retained to simplify the path through |
27 | * vmscan's shrink_page_list, to make sync_page look nicer, and to allow | 27 | * vmscan's shrink_page_list. |
28 | * future use of radix_tree tags in the swap cache. | ||
29 | */ | 28 | */ |
30 | static const struct address_space_operations swap_aops = { | 29 | static const struct address_space_operations swap_aops = { |
31 | .writepage = swap_writepage, | 30 | .writepage = swap_writepage, |
32 | .sync_page = block_sync_page, | ||
33 | .set_page_dirty = __set_page_dirty_nobuffers, | 31 | .set_page_dirty = __set_page_dirty_nobuffers, |
34 | .migratepage = migrate_page, | 32 | .migratepage = migrate_page, |
35 | }; | 33 | }; |
@@ -37,7 +35,6 @@ static const struct address_space_operations swap_aops = { | |||
37 | static struct backing_dev_info swap_backing_dev_info = { | 35 | static struct backing_dev_info swap_backing_dev_info = { |
38 | .name = "swap", | 36 | .name = "swap", |
39 | .capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK | BDI_CAP_SWAP_BACKED, | 37 | .capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK | BDI_CAP_SWAP_BACKED, |
40 | .unplug_io_fn = swap_unplug_io_fn, | ||
41 | }; | 38 | }; |
42 | 39 | ||
43 | struct address_space swapper_space = { | 40 | struct address_space swapper_space = { |
diff --git a/mm/swapfile.c b/mm/swapfile.c index 039e61677635..8c6b3ce38f09 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
@@ -95,39 +95,6 @@ __try_to_reclaim_swap(struct swap_info_struct *si, unsigned long offset) | |||
95 | } | 95 | } |
96 | 96 | ||
97 | /* | 97 | /* |
98 | * We need this because the bdev->unplug_fn can sleep and we cannot | ||
99 | * hold swap_lock while calling the unplug_fn. And swap_lock | ||
100 | * cannot be turned into a mutex. | ||
101 | */ | ||
102 | static DECLARE_RWSEM(swap_unplug_sem); | ||
103 | |||
104 | void swap_unplug_io_fn(struct backing_dev_info *unused_bdi, struct page *page) | ||
105 | { | ||
106 | swp_entry_t entry; | ||
107 | |||
108 | down_read(&swap_unplug_sem); | ||
109 | entry.val = page_private(page); | ||
110 | if (PageSwapCache(page)) { | ||
111 | struct block_device *bdev = swap_info[swp_type(entry)]->bdev; | ||
112 | struct backing_dev_info *bdi; | ||
113 | |||
114 | /* | ||
115 | * If the page is removed from swapcache from under us (with a | ||
116 | * racy try_to_unuse/swapoff) we need an additional reference | ||
117 | * count to avoid reading garbage from page_private(page) above. | ||
118 | * If the WARN_ON triggers during a swapoff it maybe the race | ||
119 | * condition and it's harmless. However if it triggers without | ||
120 | * swapoff it signals a problem. | ||
121 | */ | ||
122 | WARN_ON(page_count(page) <= 1); | ||
123 | |||
124 | bdi = bdev->bd_inode->i_mapping->backing_dev_info; | ||
125 | blk_run_backing_dev(bdi, page); | ||
126 | } | ||
127 | up_read(&swap_unplug_sem); | ||
128 | } | ||
129 | |||
130 | /* | ||
131 | * swapon tell device that all the old swap contents can be discarded, | 98 | * swapon tell device that all the old swap contents can be discarded, |
132 | * to allow the swap device to optimize its wear-levelling. | 99 | * to allow the swap device to optimize its wear-levelling. |
133 | */ | 100 | */ |
@@ -1662,10 +1629,6 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile) | |||
1662 | goto out_dput; | 1629 | goto out_dput; |
1663 | } | 1630 | } |
1664 | 1631 | ||
1665 | /* wait for any unplug function to finish */ | ||
1666 | down_write(&swap_unplug_sem); | ||
1667 | up_write(&swap_unplug_sem); | ||
1668 | |||
1669 | destroy_swap_extents(p); | 1632 | destroy_swap_extents(p); |
1670 | if (p->flags & SWP_CONTINUED) | 1633 | if (p->flags & SWP_CONTINUED) |
1671 | free_swap_count_continuations(p); | 1634 | free_swap_count_continuations(p); |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 060e4c191403..f73b8657c2d0 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -358,7 +358,7 @@ static int may_write_to_queue(struct backing_dev_info *bdi, | |||
358 | static void handle_write_error(struct address_space *mapping, | 358 | static void handle_write_error(struct address_space *mapping, |
359 | struct page *page, int error) | 359 | struct page *page, int error) |
360 | { | 360 | { |
361 | lock_page_nosync(page); | 361 | lock_page(page); |
362 | if (page_mapping(page) == mapping) | 362 | if (page_mapping(page) == mapping) |
363 | mapping_set_error(mapping, error); | 363 | mapping_set_error(mapping, error); |
364 | unlock_page(page); | 364 | unlock_page(page); |