Commit 692e0b35427a088bf75d9363788c61c7edbe93a5

Authored by Andrea Arcangeli
Committed by Linus Torvalds
1 parent 9547d01bfb

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

... ... @@ -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