forked from mirrors/linux
		
	 7a9cdebdcc
			
		
	
	
		7a9cdebdcc
		
	
	
	
	
		
			
			Jann Horn points out that the vmacache_flush_all() function is not only potentially expensive, it's buggy too. It also happens to be entirely unnecessary, because the sequence number overflow case can be avoided by simply making the sequence number be 64-bit. That doesn't even grow the data structures in question, because the other adjacent fields are already 64-bit. So simplify the whole thing by just making the sequence number overflow case go away entirely, which gets rid of all the complications and makes the code faster too. Win-win. [ Oleg Nesterov points out that the VMACACHE_FULL_FLUSHES statistics also just goes away entirely with this ] Reported-by: Jann Horn <jannh@google.com> Suggested-by: Will Deacon <will.deacon@arm.com> Acked-by: Davidlohr Bueso <dave@stgolabs.net> Cc: Oleg Nesterov <oleg@redhat.com> Cc: stable@kernel.org Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			28 lines
		
	
	
	
		
			722 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			28 lines
		
	
	
	
		
			722 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #ifndef __LINUX_VMACACHE_H
 | |
| #define __LINUX_VMACACHE_H
 | |
| 
 | |
| #include <linux/sched.h>
 | |
| #include <linux/mm.h>
 | |
| 
 | |
| static inline void vmacache_flush(struct task_struct *tsk)
 | |
| {
 | |
| 	memset(tsk->vmacache.vmas, 0, sizeof(tsk->vmacache.vmas));
 | |
| }
 | |
| 
 | |
| extern void vmacache_update(unsigned long addr, struct vm_area_struct *newvma);
 | |
| extern struct vm_area_struct *vmacache_find(struct mm_struct *mm,
 | |
| 						    unsigned long addr);
 | |
| 
 | |
| #ifndef CONFIG_MMU
 | |
| extern struct vm_area_struct *vmacache_find_exact(struct mm_struct *mm,
 | |
| 						  unsigned long start,
 | |
| 						  unsigned long end);
 | |
| #endif
 | |
| 
 | |
| static inline void vmacache_invalidate(struct mm_struct *mm)
 | |
| {
 | |
| 	mm->vmacache_seqnum++;
 | |
| }
 | |
| 
 | |
| #endif /* __LINUX_VMACACHE_H */
 |