Commit 66f44583 authored by Baolin Wang's avatar Baolin Wang Committed by Andrew Morton
Browse files

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: default avatarBaolin Wang <baolin.wang@linux.alibaba.com>
Reviewed-by: default avatarLance 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: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 5a9dd103
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -501,6 +501,19 @@ swpout_fallback
	Usually because failed to allocate some continuous swap space
	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
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
+3 −0
Original line number Diff line number Diff line
@@ -281,6 +281,9 @@ enum mthp_stat_item {
	MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE,
	MTHP_STAT_SWPOUT,
	MTHP_STAT_SWPOUT_FALLBACK,
	MTHP_STAT_FILE_ALLOC,
	MTHP_STAT_FILE_FALLBACK,
	MTHP_STAT_FILE_FALLBACK_CHARGE,
	__MTHP_STAT_COUNT
};

+6 −0
Original line number Diff line number Diff line
@@ -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(swpout, MTHP_STAT_SWPOUT);
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[] = {
	&anon_fault_alloc_attr.attr,
@@ -563,6 +566,9 @@ static struct attribute *stats_attrs[] = {
	&anon_fault_fallback_charge_attr.attr,
	&swpout_attr.attr,
	&swpout_fallback_attr.attr,
	&file_alloc_attr.attr,
	&file_fallback_attr.attr,
	&file_fallback_charge_attr.attr,
	NULL,
};

+15 −3
Original line number Diff line number Diff line
@@ -1772,6 +1772,9 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf,

			if (pages == HPAGE_PMD_NR)
				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);
		}
	} else {
@@ -1791,10 +1794,16 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf,
		if (xa_find(&mapping->i_pages, &index,
				index + pages - 1, XA_PRESENT)) {
			error = -EEXIST;
		} else if (pages == HPAGE_PMD_NR) {
		} else if (pages > 1) {
			if (pages == HPAGE_PMD_NR) {
				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;
	}

@@ -2167,6 +2176,9 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index,
		if (!IS_ERR(folio)) {
			if (folio_test_pmd_mappable(folio))
				count_vm_event(THP_FILE_ALLOC);
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
			count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_ALLOC);
#endif
			goto alloced;
		}
		if (PTR_ERR(folio) == -EEXIST)