diff options
Diffstat (limited to 'mm/page-writeback.c')
-rw-r--r-- | mm/page-writeback.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index d8ac2a7fb9e7..143c1c25d680 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
@@ -650,9 +650,8 @@ int wb_domain_init(struct wb_domain *dom, gfp_t gfp) | |||
650 | 650 | ||
651 | spin_lock_init(&dom->lock); | 651 | spin_lock_init(&dom->lock); |
652 | 652 | ||
653 | init_timer_deferrable(&dom->period_timer); | 653 | setup_deferrable_timer(&dom->period_timer, writeout_period, |
654 | dom->period_timer.function = writeout_period; | 654 | (unsigned long)dom); |
655 | dom->period_timer.data = (unsigned long)dom; | ||
656 | 655 | ||
657 | dom->dirty_limit_tstamp = jiffies; | 656 | dom->dirty_limit_tstamp = jiffies; |
658 | 657 | ||
@@ -2353,10 +2352,16 @@ int do_writepages(struct address_space *mapping, struct writeback_control *wbc) | |||
2353 | 2352 | ||
2354 | if (wbc->nr_to_write <= 0) | 2353 | if (wbc->nr_to_write <= 0) |
2355 | return 0; | 2354 | return 0; |
2356 | if (mapping->a_ops->writepages) | 2355 | while (1) { |
2357 | ret = mapping->a_ops->writepages(mapping, wbc); | 2356 | if (mapping->a_ops->writepages) |
2358 | else | 2357 | ret = mapping->a_ops->writepages(mapping, wbc); |
2359 | ret = generic_writepages(mapping, wbc); | 2358 | else |
2359 | ret = generic_writepages(mapping, wbc); | ||
2360 | if ((ret != -ENOMEM) || (wbc->sync_mode != WB_SYNC_ALL)) | ||
2361 | break; | ||
2362 | cond_resched(); | ||
2363 | congestion_wait(BLK_RW_ASYNC, HZ/50); | ||
2364 | } | ||
2360 | return ret; | 2365 | return ret; |
2361 | } | 2366 | } |
2362 | 2367 | ||
@@ -2428,7 +2433,7 @@ void account_page_dirtied(struct page *page, struct address_space *mapping) | |||
2428 | inode_attach_wb(inode, page); | 2433 | inode_attach_wb(inode, page); |
2429 | wb = inode_to_wb(inode); | 2434 | wb = inode_to_wb(inode); |
2430 | 2435 | ||
2431 | mem_cgroup_inc_page_stat(page, MEM_CGROUP_STAT_DIRTY); | 2436 | inc_memcg_page_state(page, NR_FILE_DIRTY); |
2432 | __inc_node_page_state(page, NR_FILE_DIRTY); | 2437 | __inc_node_page_state(page, NR_FILE_DIRTY); |
2433 | __inc_zone_page_state(page, NR_ZONE_WRITE_PENDING); | 2438 | __inc_zone_page_state(page, NR_ZONE_WRITE_PENDING); |
2434 | __inc_node_page_state(page, NR_DIRTIED); | 2439 | __inc_node_page_state(page, NR_DIRTIED); |
@@ -2450,7 +2455,7 @@ void account_page_cleaned(struct page *page, struct address_space *mapping, | |||
2450 | struct bdi_writeback *wb) | 2455 | struct bdi_writeback *wb) |
2451 | { | 2456 | { |
2452 | if (mapping_cap_account_dirty(mapping)) { | 2457 | if (mapping_cap_account_dirty(mapping)) { |
2453 | mem_cgroup_dec_page_stat(page, MEM_CGROUP_STAT_DIRTY); | 2458 | dec_memcg_page_state(page, NR_FILE_DIRTY); |
2454 | dec_node_page_state(page, NR_FILE_DIRTY); | 2459 | dec_node_page_state(page, NR_FILE_DIRTY); |
2455 | dec_zone_page_state(page, NR_ZONE_WRITE_PENDING); | 2460 | dec_zone_page_state(page, NR_ZONE_WRITE_PENDING); |
2456 | dec_wb_stat(wb, WB_RECLAIMABLE); | 2461 | dec_wb_stat(wb, WB_RECLAIMABLE); |
@@ -2707,7 +2712,7 @@ int clear_page_dirty_for_io(struct page *page) | |||
2707 | */ | 2712 | */ |
2708 | wb = unlocked_inode_to_wb_begin(inode, &locked); | 2713 | wb = unlocked_inode_to_wb_begin(inode, &locked); |
2709 | if (TestClearPageDirty(page)) { | 2714 | if (TestClearPageDirty(page)) { |
2710 | mem_cgroup_dec_page_stat(page, MEM_CGROUP_STAT_DIRTY); | 2715 | dec_memcg_page_state(page, NR_FILE_DIRTY); |
2711 | dec_node_page_state(page, NR_FILE_DIRTY); | 2716 | dec_node_page_state(page, NR_FILE_DIRTY); |
2712 | dec_zone_page_state(page, NR_ZONE_WRITE_PENDING); | 2717 | dec_zone_page_state(page, NR_ZONE_WRITE_PENDING); |
2713 | dec_wb_stat(wb, WB_RECLAIMABLE); | 2718 | dec_wb_stat(wb, WB_RECLAIMABLE); |
@@ -2754,7 +2759,7 @@ int test_clear_page_writeback(struct page *page) | |||
2754 | ret = TestClearPageWriteback(page); | 2759 | ret = TestClearPageWriteback(page); |
2755 | } | 2760 | } |
2756 | if (ret) { | 2761 | if (ret) { |
2757 | mem_cgroup_dec_page_stat(page, MEM_CGROUP_STAT_WRITEBACK); | 2762 | dec_memcg_page_state(page, NR_WRITEBACK); |
2758 | dec_node_page_state(page, NR_WRITEBACK); | 2763 | dec_node_page_state(page, NR_WRITEBACK); |
2759 | dec_zone_page_state(page, NR_ZONE_WRITE_PENDING); | 2764 | dec_zone_page_state(page, NR_ZONE_WRITE_PENDING); |
2760 | inc_node_page_state(page, NR_WRITTEN); | 2765 | inc_node_page_state(page, NR_WRITTEN); |
@@ -2809,7 +2814,7 @@ int __test_set_page_writeback(struct page *page, bool keep_write) | |||
2809 | ret = TestSetPageWriteback(page); | 2814 | ret = TestSetPageWriteback(page); |
2810 | } | 2815 | } |
2811 | if (!ret) { | 2816 | if (!ret) { |
2812 | mem_cgroup_inc_page_stat(page, MEM_CGROUP_STAT_WRITEBACK); | 2817 | inc_memcg_page_state(page, NR_WRITEBACK); |
2813 | inc_node_page_state(page, NR_WRITEBACK); | 2818 | inc_node_page_state(page, NR_WRITEBACK); |
2814 | inc_zone_page_state(page, NR_ZONE_WRITE_PENDING); | 2819 | inc_zone_page_state(page, NR_ZONE_WRITE_PENDING); |
2815 | } | 2820 | } |