Skip to content

Commit 9b7f43a

Browse files
Hugh Dickinstorvalds
authored andcommitted
memcg: fix Bad page state after replace_page_cache
My 9ce70c0 "memcg: fix deadlock by inverting lrucare nesting" put a nasty little bug into v3.3's version of mem_cgroup_replace_page_cache(), sometimes used for FUSE. Replacing __mem_cgroup_commit_charge_lrucare() by __mem_cgroup_commit_charge(), I used the "pc" pointer set up earlier: but it's for oldpage, and needs now to be for newpage. Once oldpage was freed, its PageCgroupUsed bit (cleared above but set again here) caused "Bad page state" messages - and perhaps worse, being missed from newpage. (I didn't find this by using FUSE, but in reusing the function for tmpfs.) Signed-off-by: Hugh Dickins <[email protected]> Cc: [email protected] [v3.3 only] Signed-off-by: Linus Torvalds <[email protected]>
1 parent 932e9f3 commit 9b7f43a

File tree

1 file changed

+1
-0
lines changed

1 file changed

+1
-0
lines changed

mm/memcontrol.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3392,6 +3392,7 @@ void mem_cgroup_replace_page_cache(struct page *oldpage,
33923392
* the newpage may be on LRU(or pagevec for LRU) already. We lock
33933393
* LRU while we overwrite pc->mem_cgroup.
33943394
*/
3395+
pc = lookup_page_cgroup(newpage);
33953396
__mem_cgroup_commit_charge(memcg, newpage, 1, pc, type, true);
33963397
}
33973398

0 commit comments

Comments
 (0)