|
@@ -2796,37 +2796,6 @@ int mem_cgroup_newpage_charge(struct page *page,
|
|
|
MEM_CGROUP_CHARGE_TYPE_ANON);
|
|
|
}
|
|
|
|
|
|
-static void
|
|
|
-__mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *ptr,
|
|
|
- enum charge_type ctype);
|
|
|
-
|
|
|
-int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm,
|
|
|
- gfp_t gfp_mask)
|
|
|
-{
|
|
|
- struct mem_cgroup *memcg = NULL;
|
|
|
- enum charge_type type = MEM_CGROUP_CHARGE_TYPE_CACHE;
|
|
|
- int ret;
|
|
|
-
|
|
|
- if (mem_cgroup_disabled())
|
|
|
- return 0;
|
|
|
- if (PageCompound(page))
|
|
|
- return 0;
|
|
|
-
|
|
|
- if (unlikely(!mm))
|
|
|
- mm = &init_mm;
|
|
|
- if (!page_is_file_cache(page))
|
|
|
- type = MEM_CGROUP_CHARGE_TYPE_SHMEM;
|
|
|
-
|
|
|
- if (!PageSwapCache(page))
|
|
|
- ret = mem_cgroup_charge_common(page, mm, gfp_mask, type);
|
|
|
- else { /* page is swapcache/shmem */
|
|
|
- ret = mem_cgroup_try_charge_swapin(mm, page, gfp_mask, &memcg);
|
|
|
- if (!ret)
|
|
|
- __mem_cgroup_commit_charge_swapin(page, memcg, type);
|
|
|
- }
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* While swap-in, try_charge -> commit or cancel, the page is locked.
|
|
|
* And when try_charge() successfully returns, one refcnt to memcg without
|
|
@@ -2873,6 +2842,15 @@ charge_cur_mm:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *memcg)
|
|
|
+{
|
|
|
+ if (mem_cgroup_disabled())
|
|
|
+ return;
|
|
|
+ if (!memcg)
|
|
|
+ return;
|
|
|
+ __mem_cgroup_cancel_charge(memcg, 1);
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
__mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *memcg,
|
|
|
enum charge_type ctype)
|
|
@@ -2910,13 +2888,31 @@ void mem_cgroup_commit_charge_swapin(struct page *page,
|
|
|
MEM_CGROUP_CHARGE_TYPE_ANON);
|
|
|
}
|
|
|
|
|
|
-void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *memcg)
|
|
|
+int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm,
|
|
|
+ gfp_t gfp_mask)
|
|
|
{
|
|
|
+ struct mem_cgroup *memcg = NULL;
|
|
|
+ enum charge_type type = MEM_CGROUP_CHARGE_TYPE_CACHE;
|
|
|
+ int ret;
|
|
|
+
|
|
|
if (mem_cgroup_disabled())
|
|
|
- return;
|
|
|
- if (!memcg)
|
|
|
- return;
|
|
|
- __mem_cgroup_cancel_charge(memcg, 1);
|
|
|
+ return 0;
|
|
|
+ if (PageCompound(page))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (unlikely(!mm))
|
|
|
+ mm = &init_mm;
|
|
|
+ if (!page_is_file_cache(page))
|
|
|
+ type = MEM_CGROUP_CHARGE_TYPE_SHMEM;
|
|
|
+
|
|
|
+ if (!PageSwapCache(page))
|
|
|
+ ret = mem_cgroup_charge_common(page, mm, gfp_mask, type);
|
|
|
+ else { /* page is swapcache/shmem */
|
|
|
+ ret = mem_cgroup_try_charge_swapin(mm, page, gfp_mask, &memcg);
|
|
|
+ if (!ret)
|
|
|
+ __mem_cgroup_commit_charge_swapin(page, memcg, type);
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static void mem_cgroup_do_uncharge(struct mem_cgroup *memcg,
|