|
@@ -2703,15 +2703,6 @@ static int __mem_cgroup_try_charge(struct mm_struct *mm,
|
|
|
|
|
|
if (gfp_mask & __GFP_NOFAIL)
|
|
|
oom = false;
|
|
|
-
|
|
|
- /*
|
|
|
- * We always charge the cgroup the mm_struct belongs to.
|
|
|
- * The mm_struct's mem_cgroup changes on task migration if the
|
|
|
- * thread group leader migrates. It's possible that mm is not
|
|
|
- * set, if so charge the root memcg (happens for pagecache usage).
|
|
|
- */
|
|
|
- if (!*ptr && !mm)
|
|
|
- *ptr = root_mem_cgroup;
|
|
|
again:
|
|
|
if (*ptr) { /* css should be a valid one */
|
|
|
memcg = *ptr;
|
|
@@ -4038,6 +4029,12 @@ int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm,
|
|
|
return 0;
|
|
|
|
|
|
if (!PageSwapCache(page)) {
|
|
|
+ /*
|
|
|
+ * Page cache insertions can happen without an actual
|
|
|
+ * task context, e.g. during disk probing on boot.
|
|
|
+ */
|
|
|
+ if (!mm)
|
|
|
+ memcg = root_mem_cgroup;
|
|
|
ret = __mem_cgroup_try_charge(mm, gfp_mask, 1, &memcg, true);
|
|
|
if (ret != -ENOMEM)
|
|
|
__mem_cgroup_commit_charge(memcg, page, 1, type, false);
|