mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02: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
					
				
					 4 changed files with 37 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										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)
 | 
			
		||||
				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,9 +1794,15 @@ 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) {
 | 
			
		||||
			count_vm_event(THP_FILE_FALLBACK);
 | 
			
		||||
			count_vm_event(THP_FILE_FALLBACK_CHARGE);
 | 
			
		||||
		} 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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue