mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
mm: memcontrol: update mem_cgroup_page_lruvec() documentation
Commit7512102cf6
("memcg: fix GPF when cgroup removal races with last exit") added a pc->mem_cgroup reset into mem_cgroup_page_lruvec() to prevent a crash where an anon page gets uncharged on unmap, the memcg is released, and then the final LRU isolation on free dereferences the stale pc->mem_cgroup pointer. But since commit0a31bc97c8
("mm: memcontrol: rewrite uncharge API"), pages are only uncharged AFTER that final LRU isolation, which guarantees the memcg's lifetime until then. pc->mem_cgroup now only needs to be reset for swapcache readahead pages. Update the comment and callsite requirements accordingly. Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Cc: Hugh Dickins <hughd@google.com> Acked-by: Michal Hocko <mhocko@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
bc2f2e7ffe
commit
dfe0e773d0
@ -1262,9 +1262,13 @@ out:
|
||||
}
|
||||
|
||||
/**
|
||||
* mem_cgroup_page_lruvec - return lruvec for adding an lru page
|
||||
* mem_cgroup_page_lruvec - return lruvec for isolating/putting an LRU page
|
||||
* @page: the page
|
||||
* @zone: zone of the page
|
||||
*
|
||||
* This function is only safe when following the LRU page isolation
|
||||
* and putback protocol: the LRU lock must be held, and the page must
|
||||
* either be PageLRU() or the caller must have isolated/allocated it.
|
||||
*/
|
||||
struct lruvec *mem_cgroup_page_lruvec(struct page *page, struct zone *zone)
|
||||
{
|
||||
@ -1282,13 +1286,9 @@ struct lruvec *mem_cgroup_page_lruvec(struct page *page, struct zone *zone)
|
||||
memcg = pc->mem_cgroup;
|
||||
|
||||
/*
|
||||
* Surreptitiously switch any uncharged offlist page to root:
|
||||
* an uncharged page off lru does nothing to secure
|
||||
* its former mem_cgroup from sudden removal.
|
||||
*
|
||||
* Our caller holds lru_lock, and PageCgroupUsed is updated
|
||||
* under page_cgroup lock: between them, they make all uses
|
||||
* of pc->mem_cgroup safe.
|
||||
* Swapcache readahead pages are added to the LRU - and
|
||||
* possibly migrated - before they are charged. Ensure
|
||||
* pc->mem_cgroup is sane.
|
||||
*/
|
||||
if (!PageLRU(page) && !PageCgroupUsed(pc) && memcg != root_mem_cgroup)
|
||||
pc->mem_cgroup = memcg = root_mem_cgroup;
|
||||
|
Loading…
Reference in New Issue
Block a user