mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
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:
parent
5a9dd10380
commit
66f44583f9
@ -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
|
||||||
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
18
mm/shmem.c
18
mm/shmem.c
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user