thp+memcg-numa: fix BUG at include/linux/mm.h:370!

THP's collapse_huge_page() has an understandable but ugly difference
in when its huge page is allocated: inside if NUMA but outside if not.
It's hardly surprising that the memcg failure path forgot that, freeing
the page in the non-NUMA case, then hitting a VM_BUG_ON in get_page()
(or even worse, using the freed page).

Signed-off-by: Hugh Dickins <hughd@google.com>
Reviewed-by: Minchan Kim <minchan.kim@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Hugh Dickins and committed by Linus Torvalds 2fbfac4e c44ed965

+5 -1
+5 -1
mm/huge_memory.c
··· 1762 #ifndef CONFIG_NUMA 1763 VM_BUG_ON(!*hpage); 1764 new_page = *hpage; 1765 #else 1766 VM_BUG_ON(*hpage); 1767 /* ··· 1785 *hpage = ERR_PTR(-ENOMEM); 1786 return; 1787 } 1788 - #endif 1789 if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) { 1790 up_read(&mm->mmap_sem); 1791 put_page(new_page); 1792 return; 1793 } 1794 1795 /* after allocating the hugepage upgrade to mmap_sem write mode */ 1796 up_read(&mm->mmap_sem);
··· 1762 #ifndef CONFIG_NUMA 1763 VM_BUG_ON(!*hpage); 1764 new_page = *hpage; 1765 + if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) { 1766 + up_read(&mm->mmap_sem); 1767 + return; 1768 + } 1769 #else 1770 VM_BUG_ON(*hpage); 1771 /* ··· 1781 *hpage = ERR_PTR(-ENOMEM); 1782 return; 1783 } 1784 if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) { 1785 up_read(&mm->mmap_sem); 1786 put_page(new_page); 1787 return; 1788 } 1789 + #endif 1790 1791 /* after allocating the hugepage upgrade to mmap_sem write mode */ 1792 up_read(&mm->mmap_sem);