diff options
Diffstat (limited to 'mm/page-writeback.c')
-rw-r--r-- | mm/page-writeback.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 96e93b214d31..bf050ab025b7 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
@@ -2724,9 +2724,12 @@ EXPORT_SYMBOL(clear_page_dirty_for_io); | |||
2724 | int test_clear_page_writeback(struct page *page) | 2724 | int test_clear_page_writeback(struct page *page) |
2725 | { | 2725 | { |
2726 | struct address_space *mapping = page_mapping(page); | 2726 | struct address_space *mapping = page_mapping(page); |
2727 | struct mem_cgroup *memcg; | ||
2728 | struct lruvec *lruvec; | ||
2727 | int ret; | 2729 | int ret; |
2728 | 2730 | ||
2729 | lock_page_memcg(page); | 2731 | memcg = lock_page_memcg(page); |
2732 | lruvec = mem_cgroup_page_lruvec(page, page_pgdat(page)); | ||
2730 | if (mapping && mapping_use_writeback_tags(mapping)) { | 2733 | if (mapping && mapping_use_writeback_tags(mapping)) { |
2731 | struct inode *inode = mapping->host; | 2734 | struct inode *inode = mapping->host; |
2732 | struct backing_dev_info *bdi = inode_to_bdi(inode); | 2735 | struct backing_dev_info *bdi = inode_to_bdi(inode); |
@@ -2754,12 +2757,18 @@ int test_clear_page_writeback(struct page *page) | |||
2754 | } else { | 2757 | } else { |
2755 | ret = TestClearPageWriteback(page); | 2758 | ret = TestClearPageWriteback(page); |
2756 | } | 2759 | } |
2760 | /* | ||
2761 | * NOTE: Page might be free now! Writeback doesn't hold a page | ||
2762 | * reference on its own, it relies on truncation to wait for | ||
2763 | * the clearing of PG_writeback. The below can only access | ||
2764 | * page state that is static across allocation cycles. | ||
2765 | */ | ||
2757 | if (ret) { | 2766 | if (ret) { |
2758 | dec_lruvec_page_state(page, NR_WRITEBACK); | 2767 | dec_lruvec_state(lruvec, NR_WRITEBACK); |
2759 | dec_zone_page_state(page, NR_ZONE_WRITE_PENDING); | 2768 | dec_zone_page_state(page, NR_ZONE_WRITE_PENDING); |
2760 | inc_node_page_state(page, NR_WRITTEN); | 2769 | inc_node_page_state(page, NR_WRITTEN); |
2761 | } | 2770 | } |
2762 | unlock_page_memcg(page); | 2771 | __unlock_page_memcg(memcg); |
2763 | return ret; | 2772 | return ret; |
2764 | } | 2773 | } |
2765 | 2774 | ||