memcg: bad page if page_cgroup when free
Replace free_hot_cold_page's VM_BUG_ON(page_get_page_cgroup(page)) by a "Bad page state" and clear: most users don't have CONFIG_DEBUG_VM on, and if it were set here, it'd likely cause corruption when the page is reused. Don't use page_assign_page_cgroup to clear it: that should be private to memcontrol.c, and always called with the lock taken; and memmap_init_zone doesn't need it either - like page->mapping and other pointers throughout the kernel, Linux assumes pointers in zeroed structures are NULL pointers. Instead use page_reset_bad_cgroup, added to memcontrol.h for this only. Signed-off-by: Hugh Dickins <hugh@veritas.com> Cc: David Rientjes <rientjes@google.com> Acked-by: Balbir Singh <balbir@linux.vnet.ibm.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Hirokazu Takahashi <taka@valinux.co.jp> Cc: YAMAMOTO Takashi <yamamoto@valinux.co.jp> Cc: Paul Menage <menage@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
98837c7f82
commit
9442ec9df4
@@ -29,8 +29,9 @@ struct mm_struct;
|
||||
|
||||
extern void mm_init_cgroup(struct mm_struct *mm, struct task_struct *p);
|
||||
extern void mm_free_cgroup(struct mm_struct *mm);
|
||||
extern void page_assign_page_cgroup(struct page *page,
|
||||
struct page_cgroup *pc);
|
||||
|
||||
#define page_reset_bad_cgroup(page) ((page)->page_cgroup = 0)
|
||||
|
||||
extern struct page_cgroup *page_get_page_cgroup(struct page *page);
|
||||
extern int mem_cgroup_charge(struct page *page, struct mm_struct *mm,
|
||||
gfp_t gfp_mask);
|
||||
@@ -82,8 +83,7 @@ static inline void mm_free_cgroup(struct mm_struct *mm)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void page_assign_page_cgroup(struct page *page,
|
||||
struct page_cgroup *pc)
|
||||
static inline void page_reset_bad_cgroup(struct page *page)
|
||||
{
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user