diff options
author | Nick Piggin <npiggin@suse.de> | 2006-02-07 12:58:52 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-07 16:12:33 -0800 |
commit | 8519fb30e438f8088b71a94a7d5a660a814d3872 (patch) | |
tree | 8d29a7b1fa33e5f65e649d363cfa10e83c4fab97 /include/linux/mm.h | |
parent | 99f6d61bda82d09b2d94414d413d39f66a0b7da2 (diff) | |
download | blackbird-op-linux-8519fb30e438f8088b71a94a7d5a660a814d3872.tar.gz blackbird-op-linux-8519fb30e438f8088b71a94a7d5a660a814d3872.zip |
[PATCH] mm: compound release fix
Compound pages on SMP systems can now often be freed from pagetables via
the release_pages path. This uses put_page_testzero which does not handle
compound pages at all. Releasing constituent pages from process mappings
decrements their count to a large negative number and leaks the reference
at the head page - net result is a memory leak.
The problem was hidden because the debug check in put_page_testzero itself
actually did take compound pages into consideration.
Fix the bug and the debug check.
Signed-off-by: Nick Piggin <npiggin@suse.de>
Acked-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/linux/mm.h')
-rw-r--r-- | include/linux/mm.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 85854b867463..75e9f0724997 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -303,7 +303,7 @@ struct page { */ #define put_page_testzero(p) \ ({ \ - BUG_ON(page_count(p) == 0); \ + BUG_ON(atomic_read(&(p)->_count) == -1);\ atomic_add_negative(-1, &(p)->_count); \ }) |