Commit 85b9f46e authored by David Rientjes's avatar David Rientjes Committed by Linus Torvalds

mm, thp: track fallbacks due to failed memcg charges separately

The thp_fault_fallback and thp_file_fallback vmstats are incremented if
either the hugepage allocation fails through the page allocator or the
hugepage charge fails through mem cgroup.

This patch leaves this field untouched but adds two new fields,
thp_{fault,file}_fallback_charge, which is incremented only when the mem
cgroup charge fails.

This distinguishes between attempted hugepage allocations that fail due to
fragmentation (or low memory conditions) and those that fail due to mem
cgroup limits.  That can be used to determine the impact of fragmentation
on the system by excluding faults that failed due to memcg usage.
Signed-off-by: default avatarDavid Rientjes <rientjes@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Reviewed-by: default avatarYang Shi <yang.shi@linux.alibaba.com>
Acked-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Mike Rapoport <rppt@linux.ibm.com>
Cc: Jeremy Cline <jcline@redhat.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Vlastimil Babka <vbabka@suse.cz>
Link: http://lkml.kernel.org/r/alpine.DEB.2.21.2003061422070.7412@chino.kir.corp.google.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent dcdf11ee
...@@ -310,6 +310,11 @@ thp_fault_fallback ...@@ -310,6 +310,11 @@ thp_fault_fallback
is incremented if a page fault fails to allocate is incremented if a page fault fails to allocate
a huge page and instead falls back to using small pages. a huge page and instead falls back to using small pages.
thp_fault_fallback_charge
is incremented if a page fault fails to charge a huge page and
instead falls back to using small pages even though the
allocation was successful.
thp_collapse_alloc_failed thp_collapse_alloc_failed
is incremented if khugepaged found a range is incremented if khugepaged found a range
of pages that should be collapsed into one huge page but failed of pages that should be collapsed into one huge page but failed
...@@ -323,6 +328,11 @@ thp_file_fallback ...@@ -323,6 +328,11 @@ thp_file_fallback
is incremented if a file huge page is attempted to be allocated is incremented if a file huge page is attempted to be allocated
but fails and instead falls back to using small pages. but fails and instead falls back to using small pages.
thp_file_fallback_charge
is incremented if a file huge page cannot be charged and instead
falls back to using small pages even though the allocation was
successful.
thp_file_mapped thp_file_mapped
is incremented every time a file huge page is mapped into is incremented every time a file huge page is mapped into
user address space. user address space.
......
...@@ -73,10 +73,12 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT, ...@@ -73,10 +73,12 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
#ifdef CONFIG_TRANSPARENT_HUGEPAGE #ifdef CONFIG_TRANSPARENT_HUGEPAGE
THP_FAULT_ALLOC, THP_FAULT_ALLOC,
THP_FAULT_FALLBACK, THP_FAULT_FALLBACK,
THP_FAULT_FALLBACK_CHARGE,
THP_COLLAPSE_ALLOC, THP_COLLAPSE_ALLOC,
THP_COLLAPSE_ALLOC_FAILED, THP_COLLAPSE_ALLOC_FAILED,
THP_FILE_ALLOC, THP_FILE_ALLOC,
THP_FILE_FALLBACK, THP_FILE_FALLBACK,
THP_FILE_FALLBACK_CHARGE,
THP_FILE_MAPPED, THP_FILE_MAPPED,
THP_SPLIT_PAGE, THP_SPLIT_PAGE,
THP_SPLIT_PAGE_FAILED, THP_SPLIT_PAGE_FAILED,
...@@ -117,6 +119,7 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT, ...@@ -117,6 +119,7 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
#ifndef CONFIG_TRANSPARENT_HUGEPAGE #ifndef CONFIG_TRANSPARENT_HUGEPAGE
#define THP_FILE_ALLOC ({ BUILD_BUG(); 0; }) #define THP_FILE_ALLOC ({ BUILD_BUG(); 0; })
#define THP_FILE_FALLBACK ({ BUILD_BUG(); 0; }) #define THP_FILE_FALLBACK ({ BUILD_BUG(); 0; })
#define THP_FILE_FALLBACK_CHARGE ({ BUILD_BUG(); 0; })
#define THP_FILE_MAPPED ({ BUILD_BUG(); 0; }) #define THP_FILE_MAPPED ({ BUILD_BUG(); 0; })
#endif #endif
......
...@@ -597,6 +597,7 @@ static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf, ...@@ -597,6 +597,7 @@ static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf,
if (mem_cgroup_try_charge_delay(page, vma->vm_mm, gfp, &memcg, true)) { if (mem_cgroup_try_charge_delay(page, vma->vm_mm, gfp, &memcg, true)) {
put_page(page); put_page(page);
count_vm_event(THP_FAULT_FALLBACK); count_vm_event(THP_FAULT_FALLBACK);
count_vm_event(THP_FAULT_FALLBACK_CHARGE);
return VM_FAULT_FALLBACK; return VM_FAULT_FALLBACK;
} }
...@@ -1446,6 +1447,7 @@ vm_fault_t do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd) ...@@ -1446,6 +1447,7 @@ vm_fault_t do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd)
put_page(page); put_page(page);
ret |= VM_FAULT_FALLBACK; ret |= VM_FAULT_FALLBACK;
count_vm_event(THP_FAULT_FALLBACK); count_vm_event(THP_FAULT_FALLBACK);
count_vm_event(THP_FAULT_FALLBACK_CHARGE);
goto out; goto out;
} }
......
...@@ -1871,8 +1871,10 @@ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index, ...@@ -1871,8 +1871,10 @@ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index,
error = mem_cgroup_try_charge_delay(page, charge_mm, gfp, &memcg, error = mem_cgroup_try_charge_delay(page, charge_mm, gfp, &memcg,
PageTransHuge(page)); PageTransHuge(page));
if (error) { if (error) {
if (PageTransHuge(page)) if (PageTransHuge(page)) {
count_vm_event(THP_FILE_FALLBACK); count_vm_event(THP_FILE_FALLBACK);
count_vm_event(THP_FILE_FALLBACK_CHARGE);
}
goto unacct; goto unacct;
} }
error = shmem_add_to_page_cache(page, mapping, hindex, error = shmem_add_to_page_cache(page, mapping, hindex,
......
...@@ -1256,10 +1256,12 @@ const char * const vmstat_text[] = { ...@@ -1256,10 +1256,12 @@ const char * const vmstat_text[] = {
#ifdef CONFIG_TRANSPARENT_HUGEPAGE #ifdef CONFIG_TRANSPARENT_HUGEPAGE
"thp_fault_alloc", "thp_fault_alloc",
"thp_fault_fallback", "thp_fault_fallback",
"thp_fault_fallback_charge",
"thp_collapse_alloc", "thp_collapse_alloc",
"thp_collapse_alloc_failed", "thp_collapse_alloc_failed",
"thp_file_alloc", "thp_file_alloc",
"thp_file_fallback", "thp_file_fallback",
"thp_file_fallback_charge",
"thp_file_mapped", "thp_file_mapped",
"thp_split_page", "thp_split_page",
"thp_split_page_failed", "thp_split_page_failed",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment