mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	mm: prohibit the last subpage from reusing the entire large folio
In a Copy-on-Write (CoW) scenario, the last subpage will reuse the entire
large folio, resulting in the waste of (nr_pages - 1) pages.  This wasted
memory remains allocated until it is either unmapped or memory reclamation
occurs.
The following small program can serve as evidence of this behavior
 main()
 {
 #define SIZE 1024 * 1024 * 1024UL
         void *p = malloc(SIZE);
         memset(p, 0x11, SIZE);
         if (fork() == 0)
                 _exit(0);
         memset(p, 0x12, SIZE);
         printf("done\n");
         while(1);
 }
For example, using a 1024KiB mTHP by:
 echo always > /sys/kernel/mm/transparent_hugepage/hugepages-1024kB/enabled
(1) w/o the patch, it takes 2GiB,
Before running the test program,
 / # free -m
                total        used        free      shared  buff/cache   available
 Mem:            5754          84        5692           0          17        5669
 Swap:              0           0           0
 / # /a.out &
 / # done
After running the test program,
 / # free -m
                 total        used        free      shared  buff/cache   available
 Mem:            5754        2149        3627           0          19        3605
 Swap:              0           0           0
(2) w/ the patch, it takes 1GiB only,
Before running the test program,
 / # free -m
                 total        used        free      shared  buff/cache   available
 Mem:            5754          89        5687           0          17        5664
 Swap:              0           0           0
 / # /a.out &
 / # done
After running the test program,
 / # free -m
                total        used        free      shared  buff/cache   available
 Mem:            5754        1122        4655           0          17        4632
 Swap:              0           0           0
This patch migrates the last subpage to a small folio and immediately
returns the large folio to the system. It benefits both memory availability
and anti-fragmentation.
Link: https://lkml.kernel.org/r/20240308092721.144735-1-21cnbao@gmail.com
Signed-off-by: Barry Song <v-songbaohua@oppo.com>
Acked-by: David Hildenbrand <david@redhat.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Lance Yang <ioworker0@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									c087a5c324
								
							
						
					
					
						commit
						cd197c3a20
					
				
					 1 changed files with 10 additions and 0 deletions
				
			
		
							
								
								
									
										10
									
								
								mm/memory.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								mm/memory.c
									
										
									
									
									
								
							|  | @ -3498,6 +3498,16 @@ static vm_fault_t wp_page_shared(struct vm_fault *vmf, struct folio *folio) | |||
| static bool wp_can_reuse_anon_folio(struct folio *folio, | ||||
| 				    struct vm_area_struct *vma) | ||||
| { | ||||
| 	/*
 | ||||
| 	 * We could currently only reuse a subpage of a large folio if no | ||||
| 	 * other subpages of the large folios are still mapped. However, | ||||
| 	 * let's just consistently not reuse subpages even if we could | ||||
| 	 * reuse in that scenario, and give back a large folio a bit | ||||
| 	 * sooner. | ||||
| 	 */ | ||||
| 	if (folio_test_large(folio)) | ||||
| 		return false; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * We have to verify under folio lock: these early checks are | ||||
| 	 * just an optimization to avoid locking the folio and freeing | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Barry Song
						Barry Song