diff options
author | Johannes Weiner <hannes@cmpxchg.org> | 2015-02-11 18:25:01 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-11 20:06:00 -0500 |
commit | 6de226191d12fce30331ebf024ca3ed24834f0ee (patch) | |
tree | 74d4910406255087f3e72c0e4d483513d8449ad4 /mm/page-writeback.c | |
parent | 93aa7d95248d04b934eb8e89717c7b8d6400bf2b (diff) |
mm: memcontrol: track move_lock state internally
The complexity of memcg page stat synchronization is currently leaking
into the callsites, forcing them to keep track of the move_lock state and
the IRQ flags. Simplify the API by tracking it in the memcg.
Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Acked-by: Michal Hocko <mhocko@suse.cz>
Reviewed-by: Vladimir Davydov <vdavydov@parallels.com>
Cc: Wu Fengguang <fengguang.wu@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/page-writeback.c')
-rw-r--r-- | mm/page-writeback.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 6f4335238e33..fb71e9deca85 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
@@ -2308,12 +2308,10 @@ EXPORT_SYMBOL(clear_page_dirty_for_io); | |||
2308 | int test_clear_page_writeback(struct page *page) | 2308 | int test_clear_page_writeback(struct page *page) |
2309 | { | 2309 | { |
2310 | struct address_space *mapping = page_mapping(page); | 2310 | struct address_space *mapping = page_mapping(page); |
2311 | unsigned long memcg_flags; | ||
2312 | struct mem_cgroup *memcg; | 2311 | struct mem_cgroup *memcg; |
2313 | bool locked; | ||
2314 | int ret; | 2312 | int ret; |
2315 | 2313 | ||
2316 | memcg = mem_cgroup_begin_page_stat(page, &locked, &memcg_flags); | 2314 | memcg = mem_cgroup_begin_page_stat(page); |
2317 | if (mapping) { | 2315 | if (mapping) { |
2318 | struct backing_dev_info *bdi = mapping->backing_dev_info; | 2316 | struct backing_dev_info *bdi = mapping->backing_dev_info; |
2319 | unsigned long flags; | 2317 | unsigned long flags; |
@@ -2338,19 +2336,17 @@ int test_clear_page_writeback(struct page *page) | |||
2338 | dec_zone_page_state(page, NR_WRITEBACK); | 2336 | dec_zone_page_state(page, NR_WRITEBACK); |
2339 | inc_zone_page_state(page, NR_WRITTEN); | 2337 | inc_zone_page_state(page, NR_WRITTEN); |
2340 | } | 2338 | } |
2341 | mem_cgroup_end_page_stat(memcg, &locked, &memcg_flags); | 2339 | mem_cgroup_end_page_stat(memcg); |
2342 | return ret; | 2340 | return ret; |
2343 | } | 2341 | } |
2344 | 2342 | ||
2345 | int __test_set_page_writeback(struct page *page, bool keep_write) | 2343 | int __test_set_page_writeback(struct page *page, bool keep_write) |
2346 | { | 2344 | { |
2347 | struct address_space *mapping = page_mapping(page); | 2345 | struct address_space *mapping = page_mapping(page); |
2348 | unsigned long memcg_flags; | ||
2349 | struct mem_cgroup *memcg; | 2346 | struct mem_cgroup *memcg; |
2350 | bool locked; | ||
2351 | int ret; | 2347 | int ret; |
2352 | 2348 | ||
2353 | memcg = mem_cgroup_begin_page_stat(page, &locked, &memcg_flags); | 2349 | memcg = mem_cgroup_begin_page_stat(page); |
2354 | if (mapping) { | 2350 | if (mapping) { |
2355 | struct backing_dev_info *bdi = mapping->backing_dev_info; | 2351 | struct backing_dev_info *bdi = mapping->backing_dev_info; |
2356 | unsigned long flags; | 2352 | unsigned long flags; |
@@ -2380,7 +2376,7 @@ int __test_set_page_writeback(struct page *page, bool keep_write) | |||
2380 | mem_cgroup_inc_page_stat(memcg, MEM_CGROUP_STAT_WRITEBACK); | 2376 | mem_cgroup_inc_page_stat(memcg, MEM_CGROUP_STAT_WRITEBACK); |
2381 | inc_zone_page_state(page, NR_WRITEBACK); | 2377 | inc_zone_page_state(page, NR_WRITEBACK); |
2382 | } | 2378 | } |
2383 | mem_cgroup_end_page_stat(memcg, &locked, &memcg_flags); | 2379 | mem_cgroup_end_page_stat(memcg); |
2384 | return ret; | 2380 | return ret; |
2385 | 2381 | ||
2386 | } | 2382 | } |