On Tue, Nov 30, 2010 at 09:38:04AM +0900, Daisuke Nishimura wrote: > I'm sorry if I miss something, "new_page" will be reused in !CONFIG_NUMA case > as you say, but, in CONFIG_NUMA case, it is allocated in this function > (collapse_huge_page()) by alloc_hugepage_vma(), and is not freed when memcg's > charge failed. > Actually, we do in collapse_huge_page(): > if (unlikely(!isolated)) { > ... > #ifdef CONFIG_NUMA > put_page(new_page); > #endif > goto out; > } > later. I think we need a similar logic in memcg's failure path too. Apologies, you really found a minor memleak in case of memcg accounting failure. diff --git a/mm/huge_memory.c b/mm/huge_memory.c --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1726,7 +1726,7 @@ static void collapse_huge_page(struct mm } #endif if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) - goto out; + goto out_put_page; anon_vma_lock(vma->anon_vma); @@ -1755,10 +1755,7 @@ static void collapse_huge_page(struct mm spin_unlock(&mm->page_table_lock); anon_vma_unlock(vma->anon_vma); mem_cgroup_uncharge_page(new_page); -#ifdef CONFIG_NUMA - put_page(new_page); -#endif - goto out; + goto out_put_page; } /* @@ -1799,6 +1796,13 @@ static void collapse_huge_page(struct mm khugepaged_pages_collapsed++; out: up_write(&mm->mmap_sem); + return; + +out_put_page: +#ifdef CONFIG_NUMA + put_page(new_page); +#endif + goto out; } static int khugepaged_scan_pmd(struct mm_struct *mm, I was too optimistic that there wasn't really a bug, I thought it was some confusion about the hpage usage that differs with numa and not numa. On a side note, the CONFIG_NUMA case will later change further to move the allocation out of the mmap_sem write mode to make the fs submitting I/O from userland and doing memory allocations in the I/O paths happier. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>