mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	thp: make MADV_HUGEPAGE check for mm->def_flags
This adds a check to hugepage_madvise(), to refuse MADV_HUGEPAGE if VM_NOHUGEPAGE is set in mm->def_flags. On s390, the VM_NOHUGEPAGE flag will be set in mm->def_flags for kvm processes, to prevent any future thp mappings. In order to also prevent MADV_HUGEPAGE on such an mm, hugepage_madvise() should check mm->def_flags. Signed-off-by: Gerald Schaefer <gerald.schaefer@de.ibm.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Hugh Dickins <hughd@google.com> Cc: Hillf Danton <dhillf@gmail.com> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.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
							
								
									46dcde735c
								
							
						
					
					
						commit
						8e72033f2a
					
				
					 1 changed files with 4 additions and 0 deletions
				
			
		| 
						 | 
					@ -1450,6 +1450,8 @@ int split_huge_page(struct page *page)
 | 
				
			||||||
int hugepage_madvise(struct vm_area_struct *vma,
 | 
					int hugepage_madvise(struct vm_area_struct *vma,
 | 
				
			||||||
		     unsigned long *vm_flags, int advice)
 | 
							     unsigned long *vm_flags, int advice)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct mm_struct *mm = vma->vm_mm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (advice) {
 | 
						switch (advice) {
 | 
				
			||||||
	case MADV_HUGEPAGE:
 | 
						case MADV_HUGEPAGE:
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
| 
						 | 
					@ -1457,6 +1459,8 @@ int hugepage_madvise(struct vm_area_struct *vma,
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		if (*vm_flags & (VM_HUGEPAGE | VM_NO_THP))
 | 
							if (*vm_flags & (VM_HUGEPAGE | VM_NO_THP))
 | 
				
			||||||
			return -EINVAL;
 | 
								return -EINVAL;
 | 
				
			||||||
 | 
							if (mm->def_flags & VM_NOHUGEPAGE)
 | 
				
			||||||
 | 
								return -EINVAL;
 | 
				
			||||||
		*vm_flags &= ~VM_NOHUGEPAGE;
 | 
							*vm_flags &= ~VM_NOHUGEPAGE;
 | 
				
			||||||
		*vm_flags |= VM_HUGEPAGE;
 | 
							*vm_flags |= VM_HUGEPAGE;
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue