Skip to content

Commit 827a03d

Browse files
hnaztorvalds
authored andcommitted
mm: memcg: move swapin charge functions above callsites
Charging cache pages may require swapin in the shmem case. Save the forward declaration and just move the swapin functions above the cache charging functions. Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Acked-by: Michal Hocko <mhocko@suse.cz> Cc: David Rientjes <rientjes@google.com> Cc: Hugh Dickins <hughd@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Wanpeng Li <liwp.linux@gmail.com> Cc: Mel Gorman <mel@csn.ul.ie> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 7d18895 commit 827a03d

File tree

1 file changed

+32
-36
lines changed

1 file changed

+32
-36
lines changed

mm/memcontrol.c

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2796,37 +2796,6 @@ int mem_cgroup_newpage_charge(struct page *page,
27962796
MEM_CGROUP_CHARGE_TYPE_ANON);
27972797
}
27982798

2799-
static void
2800-
__mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *ptr,
2801-
enum charge_type ctype);
2802-
2803-
int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm,
2804-
gfp_t gfp_mask)
2805-
{
2806-
struct mem_cgroup *memcg = NULL;
2807-
enum charge_type type = MEM_CGROUP_CHARGE_TYPE_CACHE;
2808-
int ret;
2809-
2810-
if (mem_cgroup_disabled())
2811-
return 0;
2812-
if (PageCompound(page))
2813-
return 0;
2814-
2815-
if (unlikely(!mm))
2816-
mm = &init_mm;
2817-
if (!page_is_file_cache(page))
2818-
type = MEM_CGROUP_CHARGE_TYPE_SHMEM;
2819-
2820-
if (!PageSwapCache(page))
2821-
ret = mem_cgroup_charge_common(page, mm, gfp_mask, type);
2822-
else { /* page is swapcache/shmem */
2823-
ret = mem_cgroup_try_charge_swapin(mm, page, gfp_mask, &memcg);
2824-
if (!ret)
2825-
__mem_cgroup_commit_charge_swapin(page, memcg, type);
2826-
}
2827-
return ret;
2828-
}
2829-
28302799
/*
28312800
* While swap-in, try_charge -> commit or cancel, the page is locked.
28322801
* And when try_charge() successfully returns, one refcnt to memcg without
@@ -2873,6 +2842,15 @@ int mem_cgroup_try_charge_swapin(struct mm_struct *mm,
28732842
return ret;
28742843
}
28752844

2845+
void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *memcg)
2846+
{
2847+
if (mem_cgroup_disabled())
2848+
return;
2849+
if (!memcg)
2850+
return;
2851+
__mem_cgroup_cancel_charge(memcg, 1);
2852+
}
2853+
28762854
static void
28772855
__mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *memcg,
28782856
enum charge_type ctype)
@@ -2910,13 +2888,31 @@ void mem_cgroup_commit_charge_swapin(struct page *page,
29102888
MEM_CGROUP_CHARGE_TYPE_ANON);
29112889
}
29122890

2913-
void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *memcg)
2891+
int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm,
2892+
gfp_t gfp_mask)
29142893
{
2894+
struct mem_cgroup *memcg = NULL;
2895+
enum charge_type type = MEM_CGROUP_CHARGE_TYPE_CACHE;
2896+
int ret;
2897+
29152898
if (mem_cgroup_disabled())
2916-
return;
2917-
if (!memcg)
2918-
return;
2919-
__mem_cgroup_cancel_charge(memcg, 1);
2899+
return 0;
2900+
if (PageCompound(page))
2901+
return 0;
2902+
2903+
if (unlikely(!mm))
2904+
mm = &init_mm;
2905+
if (!page_is_file_cache(page))
2906+
type = MEM_CGROUP_CHARGE_TYPE_SHMEM;
2907+
2908+
if (!PageSwapCache(page))
2909+
ret = mem_cgroup_charge_common(page, mm, gfp_mask, type);
2910+
else { /* page is swapcache/shmem */
2911+
ret = mem_cgroup_try_charge_swapin(mm, page, gfp_mask, &memcg);
2912+
if (!ret)
2913+
__mem_cgroup_commit_charge_swapin(page, memcg, type);
2914+
}
2915+
return ret;
29202916
}
29212917

29222918
static void mem_cgroup_do_uncharge(struct mem_cgroup *memcg,

0 commit comments

Comments
 (0)