mm: shmem: add mTHP counters for anonymous shmem

Add mTHP counters for anonymous shmem.

[baolin.wang@linux.alibaba.com: update Documentation/admin-guide/mm/transhuge.rst]
  Link: https://lkml.kernel.org/r/d86e2e7f-4141-432b-b2ba-c6691f36ef0b@linux.alibaba.com
Link: https://lkml.kernel.org/r/4fd9e467d49ae4a747e428bcd821c7d13125ae67.1718090413.git.baolin.wang@linux.alibaba.com
Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Reviewed-by: Lance Yang <ioworker0@gmail.com>
Cc: Barry Song <v-songbaohua@oppo.com>
Cc: Daniel Gomez <da.gomez@samsung.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: "Huang, Ying" <ying.huang@intel.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
Cc: Pankaj Raghav <p.raghav@samsung.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Yang Shi <shy828301@gmail.com>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Baolin Wang 2024-06-11 18:11:10 +08:00 committed by Andrew Morton
parent 5a9dd10380
commit 66f44583f9
4 changed files with 37 additions and 3 deletions

View File

@ -501,6 +501,19 @@ swpout_fallback
Usually because failed to allocate some continuous swap space Usually because failed to allocate some continuous swap space
for the huge page. for the huge page.
file_alloc
is incremented every time a file huge page is successfully
allocated.
file_fallback
is incremented if a file huge page is attempted to be allocated
but fails and instead falls back to using small pages.
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.
As the system ages, allocating huge pages may be expensive as the As the system ages, allocating huge pages may be expensive as the
system uses memory compaction to copy data around memory to free a system uses memory compaction to copy data around memory to free a
huge page for use. There are some counters in ``/proc/vmstat`` to help huge page for use. There are some counters in ``/proc/vmstat`` to help

View File

@ -281,6 +281,9 @@ enum mthp_stat_item {
MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE, MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE,
MTHP_STAT_SWPOUT, MTHP_STAT_SWPOUT,
MTHP_STAT_SWPOUT_FALLBACK, MTHP_STAT_SWPOUT_FALLBACK,
MTHP_STAT_FILE_ALLOC,
MTHP_STAT_FILE_FALLBACK,
MTHP_STAT_FILE_FALLBACK_CHARGE,
__MTHP_STAT_COUNT __MTHP_STAT_COUNT
}; };

View File

@ -556,6 +556,9 @@ DEFINE_MTHP_STAT_ATTR(anon_fault_fallback, MTHP_STAT_ANON_FAULT_FALLBACK);
DEFINE_MTHP_STAT_ATTR(anon_fault_fallback_charge, MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE); DEFINE_MTHP_STAT_ATTR(anon_fault_fallback_charge, MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE);
DEFINE_MTHP_STAT_ATTR(swpout, MTHP_STAT_SWPOUT); DEFINE_MTHP_STAT_ATTR(swpout, MTHP_STAT_SWPOUT);
DEFINE_MTHP_STAT_ATTR(swpout_fallback, MTHP_STAT_SWPOUT_FALLBACK); DEFINE_MTHP_STAT_ATTR(swpout_fallback, MTHP_STAT_SWPOUT_FALLBACK);
DEFINE_MTHP_STAT_ATTR(file_alloc, MTHP_STAT_FILE_ALLOC);
DEFINE_MTHP_STAT_ATTR(file_fallback, MTHP_STAT_FILE_FALLBACK);
DEFINE_MTHP_STAT_ATTR(file_fallback_charge, MTHP_STAT_FILE_FALLBACK_CHARGE);
static struct attribute *stats_attrs[] = { static struct attribute *stats_attrs[] = {
&anon_fault_alloc_attr.attr, &anon_fault_alloc_attr.attr,
@ -563,6 +566,9 @@ static struct attribute *stats_attrs[] = {
&anon_fault_fallback_charge_attr.attr, &anon_fault_fallback_charge_attr.attr,
&swpout_attr.attr, &swpout_attr.attr,
&swpout_fallback_attr.attr, &swpout_fallback_attr.attr,
&file_alloc_attr.attr,
&file_fallback_attr.attr,
&file_fallback_charge_attr.attr,
NULL, NULL,
}; };

View File

@ -1772,6 +1772,9 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf,
if (pages == HPAGE_PMD_NR) if (pages == HPAGE_PMD_NR)
count_vm_event(THP_FILE_FALLBACK); count_vm_event(THP_FILE_FALLBACK);
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
count_mthp_stat(order, MTHP_STAT_FILE_FALLBACK);
#endif
order = next_order(&suitable_orders, order); order = next_order(&suitable_orders, order);
} }
} else { } else {
@ -1791,9 +1794,15 @@ allocated:
if (xa_find(&mapping->i_pages, &index, if (xa_find(&mapping->i_pages, &index,
index + pages - 1, XA_PRESENT)) { index + pages - 1, XA_PRESENT)) {
error = -EEXIST; error = -EEXIST;
} else if (pages == HPAGE_PMD_NR) { } else if (pages > 1) {
count_vm_event(THP_FILE_FALLBACK); if (pages == HPAGE_PMD_NR) {
count_vm_event(THP_FILE_FALLBACK_CHARGE); count_vm_event(THP_FILE_FALLBACK);
count_vm_event(THP_FILE_FALLBACK_CHARGE);
}
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_FALLBACK);
count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_FALLBACK_CHARGE);
#endif
} }
goto unlock; goto unlock;
} }
@ -2167,6 +2176,9 @@ repeat:
if (!IS_ERR(folio)) { if (!IS_ERR(folio)) {
if (folio_test_pmd_mappable(folio)) if (folio_test_pmd_mappable(folio))
count_vm_event(THP_FILE_ALLOC); count_vm_event(THP_FILE_ALLOC);
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_ALLOC);
#endif
goto alloced; goto alloced;
} }
if (PTR_ERR(folio) == -EEXIST) if (PTR_ERR(folio) == -EEXIST)