mm: don't call __page_cache_release for hugetlb
__put_compound_page() calls __page_cache_release() to do some freeing work, but it's obviously for thps, not for hugetlb. We don't care because PageLRU is always cleared and page->mem_cgroup is always NULL for hugetlb. But it's not correct and has potential risks, so let's make it conditional. Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> Cc: Hugh Dickins <hughd@google.com> Reviewed-by: Michal Hocko <mhocko@suse.cz> Cc: Mel Gorman <mgorman@suse.de> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: David Rientjes <rientjes@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:
parent
9fcd145717
commit
822fc61367
10
mm/swap.c
10
mm/swap.c
@ -31,6 +31,7 @@
|
||||
#include <linux/memcontrol.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/hugetlb.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
@ -75,7 +76,14 @@ static void __put_compound_page(struct page *page)
|
||||
{
|
||||
compound_page_dtor *dtor;
|
||||
|
||||
__page_cache_release(page);
|
||||
/*
|
||||
* __page_cache_release() is supposed to be called for thp, not for
|
||||
* hugetlb. This is because hugetlb page does never have PageLRU set
|
||||
* (it's never listed to any LRU lists) and no memcg routines should
|
||||
* be called for hugetlb (it has a separate hugetlb_cgroup.)
|
||||
*/
|
||||
if (!PageHuge(page))
|
||||
__page_cache_release(page);
|
||||
dtor = get_compound_page_dtor(page);
|
||||
(*dtor)(page);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user