Commit 692e0b35427a088bf75d9363788c61c7edbe93a5
Committed by
Linus Torvalds
1 parent
9547d01bfb
Exists in
master
and in
20 other branches
mm: thp: optimize memcg charge in khugepaged
We don't need to hold the mmmap_sem through mem_cgroup_newpage_charge(), the mmap_sem is only hold for keeping the vma stable and we don't need the vma stable anymore after we return from alloc_hugepage_vma(). Signed-off-by: Andrea Arcangeli <aarcange@redhat.com> Cc: Johannes Weiner <jweiner@redhat.com> Cc: Hugh Dickins <hughd@google.com> Cc: David Rientjes <rientjes@google.com> Cc: Minchan Kim <minchan.kim@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 11 additions and 10 deletions Side-by-side Diff
mm/huge_memory.c
... | ... | @@ -1771,12 +1771,9 @@ |
1771 | 1771 | |
1772 | 1772 | VM_BUG_ON(address & ~HPAGE_PMD_MASK); |
1773 | 1773 | #ifndef CONFIG_NUMA |
1774 | + up_read(&mm->mmap_sem); | |
1774 | 1775 | VM_BUG_ON(!*hpage); |
1775 | 1776 | new_page = *hpage; |
1776 | - if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) { | |
1777 | - up_read(&mm->mmap_sem); | |
1778 | - return; | |
1779 | - } | |
1780 | 1777 | #else |
1781 | 1778 | VM_BUG_ON(*hpage); |
1782 | 1779 | /* |
1783 | 1780 | |
1784 | 1781 | |
1785 | 1782 | |
1786 | 1783 | |
1787 | 1784 | |
... | ... | @@ -1791,22 +1788,26 @@ |
1791 | 1788 | */ |
1792 | 1789 | new_page = alloc_hugepage_vma(khugepaged_defrag(), vma, address, |
1793 | 1790 | node, __GFP_OTHER_NODE); |
1791 | + | |
1792 | + /* | |
1793 | + * After allocating the hugepage, release the mmap_sem read lock in | |
1794 | + * preparation for taking it in write mode. | |
1795 | + */ | |
1796 | + up_read(&mm->mmap_sem); | |
1794 | 1797 | if (unlikely(!new_page)) { |
1795 | - up_read(&mm->mmap_sem); | |
1796 | 1798 | count_vm_event(THP_COLLAPSE_ALLOC_FAILED); |
1797 | 1799 | *hpage = ERR_PTR(-ENOMEM); |
1798 | 1800 | return; |
1799 | 1801 | } |
1802 | +#endif | |
1803 | + | |
1800 | 1804 | count_vm_event(THP_COLLAPSE_ALLOC); |
1801 | 1805 | if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) { |
1802 | - up_read(&mm->mmap_sem); | |
1806 | +#ifdef CONFIG_NUMA | |
1803 | 1807 | put_page(new_page); |
1808 | +#endif | |
1804 | 1809 | return; |
1805 | 1810 | } |
1806 | -#endif | |
1807 | - | |
1808 | - /* after allocating the hugepage upgrade to mmap_sem write mode */ | |
1809 | - up_read(&mm->mmap_sem); | |
1810 | 1811 | |
1811 | 1812 | /* |
1812 | 1813 | * Prevent all access to pagetables with the exception of |