mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	mm, thp: add VM_INIT_DEF_MASK and PRCTL_THP_DISABLE
Add VM_INIT_DEF_MASK, to allow us to set the default flags for VMs. It also adds a prctl control which allows us to set the THP disable bit in mm->def_flags so that VMs will pick up the setting as they are created. Signed-off-by: Alex Thorlton <athorlton@sgi.com> Suggested-by: Oleg Nesterov <oleg@redhat.com> Cc: Gerald Schaefer <gerald.schaefer@de.ibm.com> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Christian Borntraeger <borntraeger@de.ibm.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> Cc: Mel Gorman <mgorman@suse.de> Acked-by: Rik van Riel <riel@redhat.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: David Rientjes <rientjes@google.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									1e1836e84f
								
							
						
					
					
						commit
						a0715cc226
					
				
					 4 changed files with 29 additions and 3 deletions
				
			
		|  | @ -177,6 +177,9 @@ extern unsigned int kobjsize(const void *objp); | ||||||
|  */ |  */ | ||||||
| #define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_PFNMAP | VM_MIXEDMAP) | #define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_PFNMAP | VM_MIXEDMAP) | ||||||
| 
 | 
 | ||||||
|  | /* This mask defines which mm->def_flags a process can inherit its parent */ | ||||||
|  | #define VM_INIT_DEF_MASK	VM_NOHUGEPAGE | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * mapping from the currently active vm_flags protection bits (the |  * mapping from the currently active vm_flags protection bits (the | ||||||
|  * low four bits) to a page protection mask.. |  * low four bits) to a page protection mask.. | ||||||
|  |  | ||||||
|  | @ -149,4 +149,7 @@ | ||||||
| 
 | 
 | ||||||
| #define PR_GET_TID_ADDRESS	40 | #define PR_GET_TID_ADDRESS	40 | ||||||
| 
 | 
 | ||||||
|  | #define PR_SET_THP_DISABLE	41 | ||||||
|  | #define PR_GET_THP_DISABLE	42 | ||||||
|  | 
 | ||||||
| #endif /* _LINUX_PRCTL_H */ | #endif /* _LINUX_PRCTL_H */ | ||||||
|  |  | ||||||
|  | @ -530,8 +530,6 @@ static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p) | ||||||
| 	atomic_set(&mm->mm_count, 1); | 	atomic_set(&mm->mm_count, 1); | ||||||
| 	init_rwsem(&mm->mmap_sem); | 	init_rwsem(&mm->mmap_sem); | ||||||
| 	INIT_LIST_HEAD(&mm->mmlist); | 	INIT_LIST_HEAD(&mm->mmlist); | ||||||
| 	mm->flags = (current->mm) ? |  | ||||||
| 		(current->mm->flags & MMF_INIT_MASK) : default_dump_filter; |  | ||||||
| 	mm->core_state = NULL; | 	mm->core_state = NULL; | ||||||
| 	atomic_long_set(&mm->nr_ptes, 0); | 	atomic_long_set(&mm->nr_ptes, 0); | ||||||
| 	memset(&mm->rss_stat, 0, sizeof(mm->rss_stat)); | 	memset(&mm->rss_stat, 0, sizeof(mm->rss_stat)); | ||||||
|  | @ -540,8 +538,15 @@ static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p) | ||||||
| 	mm_init_owner(mm, p); | 	mm_init_owner(mm, p); | ||||||
| 	clear_tlb_flush_pending(mm); | 	clear_tlb_flush_pending(mm); | ||||||
| 
 | 
 | ||||||
| 	if (likely(!mm_alloc_pgd(mm))) { | 	if (current->mm) { | ||||||
|  | 		mm->flags = current->mm->flags & MMF_INIT_MASK; | ||||||
|  | 		mm->def_flags = current->mm->def_flags & VM_INIT_DEF_MASK; | ||||||
|  | 	} else { | ||||||
|  | 		mm->flags = default_dump_filter; | ||||||
| 		mm->def_flags = 0; | 		mm->def_flags = 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (likely(!mm_alloc_pgd(mm))) { | ||||||
| 		mmu_notifier_mm_init(mm); | 		mmu_notifier_mm_init(mm); | ||||||
| 		return mm; | 		return mm; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								kernel/sys.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								kernel/sys.c
									
									
									
									
									
								
							|  | @ -1996,6 +1996,21 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, | ||||||
| 		if (arg2 || arg3 || arg4 || arg5) | 		if (arg2 || arg3 || arg4 || arg5) | ||||||
| 			return -EINVAL; | 			return -EINVAL; | ||||||
| 		return current->no_new_privs ? 1 : 0; | 		return current->no_new_privs ? 1 : 0; | ||||||
|  | 	case PR_GET_THP_DISABLE: | ||||||
|  | 		if (arg2 || arg3 || arg4 || arg5) | ||||||
|  | 			return -EINVAL; | ||||||
|  | 		error = !!(me->mm->def_flags & VM_NOHUGEPAGE); | ||||||
|  | 		break; | ||||||
|  | 	case PR_SET_THP_DISABLE: | ||||||
|  | 		if (arg3 || arg4 || arg5) | ||||||
|  | 			return -EINVAL; | ||||||
|  | 		down_write(&me->mm->mmap_sem); | ||||||
|  | 		if (arg2) | ||||||
|  | 			me->mm->def_flags |= VM_NOHUGEPAGE; | ||||||
|  | 		else | ||||||
|  | 			me->mm->def_flags &= ~VM_NOHUGEPAGE; | ||||||
|  | 		up_write(&me->mm->mmap_sem); | ||||||
|  | 		break; | ||||||
| 	default: | 	default: | ||||||
| 		error = -EINVAL; | 		error = -EINVAL; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Alex Thorlton
						Alex Thorlton