aboutsummaryrefslogtreecommitdiffstats
path: root/mm/page-writeback.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/page-writeback.c')
-rw-r--r--mm/page-writeback.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 6c7b0187be8e..f5236f804aa6 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -2143,11 +2143,17 @@ EXPORT_SYMBOL(account_page_dirtied);
2143 2143
2144/* 2144/*
2145 * Helper function for set_page_writeback family. 2145 * Helper function for set_page_writeback family.
2146 *
2147 * The caller must hold mem_cgroup_begin/end_update_page_stat() lock
2148 * while calling this function.
2149 * See test_set_page_writeback for example.
2150 *
2146 * NOTE: Unlike account_page_dirtied this does not rely on being atomic 2151 * NOTE: Unlike account_page_dirtied this does not rely on being atomic
2147 * wrt interrupts. 2152 * wrt interrupts.
2148 */ 2153 */
2149void account_page_writeback(struct page *page) 2154void account_page_writeback(struct page *page)
2150{ 2155{
2156 mem_cgroup_inc_page_stat(page, MEM_CGROUP_STAT_WRITEBACK);
2151 inc_zone_page_state(page, NR_WRITEBACK); 2157 inc_zone_page_state(page, NR_WRITEBACK);
2152} 2158}
2153EXPORT_SYMBOL(account_page_writeback); 2159EXPORT_SYMBOL(account_page_writeback);
@@ -2364,7 +2370,10 @@ int test_clear_page_writeback(struct page *page)
2364{ 2370{
2365 struct address_space *mapping = page_mapping(page); 2371 struct address_space *mapping = page_mapping(page);
2366 int ret; 2372 int ret;
2373 bool locked;
2374 unsigned long memcg_flags;
2367 2375
2376 mem_cgroup_begin_update_page_stat(page, &locked, &memcg_flags);
2368 if (mapping) { 2377 if (mapping) {
2369 struct backing_dev_info *bdi = mapping->backing_dev_info; 2378 struct backing_dev_info *bdi = mapping->backing_dev_info;
2370 unsigned long flags; 2379 unsigned long flags;
@@ -2385,9 +2394,11 @@ int test_clear_page_writeback(struct page *page)
2385 ret = TestClearPageWriteback(page); 2394 ret = TestClearPageWriteback(page);
2386 } 2395 }
2387 if (ret) { 2396 if (ret) {
2397 mem_cgroup_dec_page_stat(page, MEM_CGROUP_STAT_WRITEBACK);
2388 dec_zone_page_state(page, NR_WRITEBACK); 2398 dec_zone_page_state(page, NR_WRITEBACK);
2389 inc_zone_page_state(page, NR_WRITTEN); 2399 inc_zone_page_state(page, NR_WRITTEN);
2390 } 2400 }
2401 mem_cgroup_end_update_page_stat(page, &locked, &memcg_flags);
2391 return ret; 2402 return ret;
2392} 2403}
2393 2404
@@ -2395,7 +2406,10 @@ int test_set_page_writeback(struct page *page)
2395{ 2406{
2396 struct address_space *mapping = page_mapping(page); 2407 struct address_space *mapping = page_mapping(page);
2397 int ret; 2408 int ret;
2409 bool locked;
2410 unsigned long memcg_flags;
2398 2411
2412 mem_cgroup_begin_update_page_stat(page, &locked, &memcg_flags);
2399 if (mapping) { 2413 if (mapping) {
2400 struct backing_dev_info *bdi = mapping->backing_dev_info; 2414 struct backing_dev_info *bdi = mapping->backing_dev_info;
2401 unsigned long flags; 2415 unsigned long flags;
@@ -2422,6 +2436,7 @@ int test_set_page_writeback(struct page *page)
2422 } 2436 }
2423 if (!ret) 2437 if (!ret)
2424 account_page_writeback(page); 2438 account_page_writeback(page);
2439 mem_cgroup_end_update_page_stat(page, &locked, &memcg_flags);
2425 return ret; 2440 return ret;
2426 2441
2427} 2442}