diff options
| author | Hugh Dickins <hugh@veritas.com> | 2008-03-04 17:29:07 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-03-04 19:35:15 -0500 |
| commit | 9442ec9df40d952b0de185ae5638a74970388e01 (patch) | |
| tree | 14b06d71203be119d93736464ca49f37ce402c1c /include | |
| parent | 98837c7f82ef78aa38f40462aa2fcac68fd3acbf (diff) | |
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>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/memcontrol.h | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 56432ff8d4e3..70789df7dab4 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
| @@ -29,8 +29,9 @@ struct mm_struct; | |||
| 29 | 29 | ||
| 30 | extern void mm_init_cgroup(struct mm_struct *mm, struct task_struct *p); | 30 | extern void mm_init_cgroup(struct mm_struct *mm, struct task_struct *p); |
| 31 | extern void mm_free_cgroup(struct mm_struct *mm); | 31 | extern void mm_free_cgroup(struct mm_struct *mm); |
| 32 | extern void page_assign_page_cgroup(struct page *page, | 32 | |
| 33 | struct page_cgroup *pc); | 33 | #define page_reset_bad_cgroup(page) ((page)->page_cgroup = 0) |
| 34 | |||
| 34 | extern struct page_cgroup *page_get_page_cgroup(struct page *page); | 35 | extern struct page_cgroup *page_get_page_cgroup(struct page *page); |
| 35 | extern int mem_cgroup_charge(struct page *page, struct mm_struct *mm, | 36 | extern int mem_cgroup_charge(struct page *page, struct mm_struct *mm, |
| 36 | gfp_t gfp_mask); | 37 | gfp_t gfp_mask); |
| @@ -82,8 +83,7 @@ static inline void mm_free_cgroup(struct mm_struct *mm) | |||
| 82 | { | 83 | { |
| 83 | } | 84 | } |
| 84 | 85 | ||
| 85 | static inline void page_assign_page_cgroup(struct page *page, | 86 | static inline void page_reset_bad_cgroup(struct page *page) |
| 86 | struct page_cgroup *pc) | ||
| 87 | { | 87 | { |
| 88 | } | 88 | } |
| 89 | 89 | ||
