forked from mirrors/linux
		
	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
 | 
						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 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf,
 | 
				
			||||||
		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 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index,
 | 
				
			||||||
		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 a new issue