mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	 1a4e58cce8
			
		
	
	
		1a4e58cce8
		
	
	
	
	
		
			
			When a process expects no accesses to a certain memory range for a long time, it could hint kernel that the pages can be reclaimed instantly but data should be preserved for future use. This could reduce workingset eviction so it ends up increasing performance. This patch introduces the new MADV_PAGEOUT hint to madvise(2) syscall. MADV_PAGEOUT can be used by a process to mark a memory range as not expected to be used for a long time so that kernel reclaims *any LRU* pages instantly. The hint can help kernel in deciding which pages to evict proactively. A note: It doesn't apply SWAP_CLUSTER_MAX LRU page isolation limit intentionally because it's automatically bounded by PMD size. If PMD size(e.g., 256) makes some trouble, we could fix it later by limit it to SWAP_CLUSTER_MAX[1]. - man-page material MADV_PAGEOUT (since Linux x.x) Do not expect access in the near future so pages in the specified regions could be reclaimed instantly regardless of memory pressure. Thus, access in the range after successful operation could cause major page fault but never lose the up-to-date contents unlike MADV_DONTNEED. Pages belonging to a shared mapping are only processed if a write access is allowed for the calling process. MADV_PAGEOUT cannot be applied to locked pages, Huge TLB pages, or VM_PFNMAP pages. [1] https://lore.kernel.org/lkml/20190710194719.GS29695@dhcp22.suse.cz/ [minchan@kernel.org: clear PG_active on MADV_PAGEOUT] Link: http://lkml.kernel.org/r/20190802200643.GA181880@google.com [akpm@linux-foundation.org: resolve conflicts with hmm.git] Link: http://lkml.kernel.org/r/20190726023435.214162-5-minchan@kernel.org Signed-off-by: Minchan Kim <minchan@kernel.org> Reported-by: kbuild test robot <lkp@intel.com> Acked-by: Michal Hocko <mhocko@suse.com> Cc: James E.J. Bottomley <James.Bottomley@HansenPartnership.com> Cc: Richard Henderson <rth@twiddle.net> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Chris Zankel <chris@zankel.net> Cc: Daniel Colascione <dancol@google.com> Cc: Dave Hansen <dave.hansen@intel.com> Cc: Hillf Danton <hdanton@sina.com> Cc: Joel Fernandes (Google) <joel@joelfernandes.org> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Oleksandr Natalenko <oleksandr@redhat.com> Cc: Shakeel Butt <shakeelb@google.com> Cc: Sonny Rao <sonnyrao@google.com> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Tim Murray <timmurray@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			80 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 | |
| #ifndef __PARISC_MMAN_H__
 | |
| #define __PARISC_MMAN_H__
 | |
| 
 | |
| #define PROT_READ	0x1		/* page can be read */
 | |
| #define PROT_WRITE	0x2		/* page can be written */
 | |
| #define PROT_EXEC	0x4		/* page can be executed */
 | |
| #define PROT_SEM	0x8		/* page may be used for atomic ops */
 | |
| #define PROT_NONE	0x0		/* page can not be accessed */
 | |
| #define PROT_GROWSDOWN	0x01000000	/* mprotect flag: extend change to start of growsdown vma */
 | |
| #define PROT_GROWSUP	0x02000000	/* mprotect flag: extend change to end of growsup vma */
 | |
| 
 | |
| /* 0x01 - 0x03 are defined in linux/mman.h */
 | |
| #define MAP_TYPE	0x2b		/* Mask for type of mapping, includes bits 0x08 and 0x20 */
 | |
| #define MAP_FIXED	0x04		/* Interpret addr exactly */
 | |
| #define MAP_ANONYMOUS	0x10		/* don't use a file */
 | |
| 
 | |
| #define MAP_DENYWRITE	0x0800		/* ETXTBSY */
 | |
| #define MAP_EXECUTABLE	0x1000		/* mark it as an executable */
 | |
| #define MAP_LOCKED	0x2000		/* pages are locked */
 | |
| #define MAP_NORESERVE	0x4000		/* don't check for reservations */
 | |
| #define MAP_GROWSDOWN	0x8000		/* stack-like segment */
 | |
| #define MAP_POPULATE	0x10000		/* populate (prefault) pagetables */
 | |
| #define MAP_NONBLOCK	0x20000		/* do not block on IO */
 | |
| #define MAP_STACK	0x40000		/* give out an address that is best suited for process/thread stacks */
 | |
| #define MAP_HUGETLB	0x80000		/* create a huge page mapping */
 | |
| #define MAP_FIXED_NOREPLACE 0x100000	/* MAP_FIXED which doesn't unmap underlying mapping */
 | |
| 
 | |
| #define MS_SYNC		1		/* synchronous memory sync */
 | |
| #define MS_ASYNC	2		/* sync memory asynchronously */
 | |
| #define MS_INVALIDATE	4		/* invalidate the caches */
 | |
| 
 | |
| #define MCL_CURRENT	1		/* lock all current mappings */
 | |
| #define MCL_FUTURE	2		/* lock all future mappings */
 | |
| #define MCL_ONFAULT	4		/* lock all pages that are faulted in */
 | |
| 
 | |
| #define MLOCK_ONFAULT	0x01		/* Lock pages in range after they are faulted in, do not prefault */
 | |
| 
 | |
| #define MADV_NORMAL     0               /* no further special treatment */
 | |
| #define MADV_RANDOM     1               /* expect random page references */
 | |
| #define MADV_SEQUENTIAL 2               /* expect sequential page references */
 | |
| #define MADV_WILLNEED   3               /* will need these pages */
 | |
| #define MADV_DONTNEED   4               /* don't need these pages */
 | |
| 
 | |
| /* common/generic parameters */
 | |
| #define MADV_FREE	8		/* free pages only if memory pressure */
 | |
| #define MADV_REMOVE	9		/* remove these pages & resources */
 | |
| #define MADV_DONTFORK	10		/* don't inherit across fork */
 | |
| #define MADV_DOFORK	11		/* do inherit across fork */
 | |
| 
 | |
| #define MADV_COLD	20		/* deactivate these pages */
 | |
| #define MADV_PAGEOUT	21		/* reclaim these pages */
 | |
| 
 | |
| #define MADV_MERGEABLE   65		/* KSM may merge identical pages */
 | |
| #define MADV_UNMERGEABLE 66		/* KSM may not merge identical pages */
 | |
| 
 | |
| #define MADV_HUGEPAGE	67		/* Worth backing with hugepages */
 | |
| #define MADV_NOHUGEPAGE	68		/* Not worth backing with hugepages */
 | |
| 
 | |
| #define MADV_DONTDUMP   69		/* Explicity exclude from the core dump,
 | |
| 					   overrides the coredump filter bits */
 | |
| #define MADV_DODUMP	70		/* Clear the MADV_NODUMP flag */
 | |
| 
 | |
| #define MADV_WIPEONFORK 71		/* Zero memory on fork, child only */
 | |
| #define MADV_KEEPONFORK 72		/* Undo MADV_WIPEONFORK */
 | |
| 
 | |
| #define MADV_HWPOISON     100		/* poison a page for testing */
 | |
| #define MADV_SOFT_OFFLINE 101		/* soft offline page for testing */
 | |
| 
 | |
| /* compatibility flags */
 | |
| #define MAP_FILE	0
 | |
| #define MAP_VARIABLE	0
 | |
| 
 | |
| #define PKEY_DISABLE_ACCESS	0x1
 | |
| #define PKEY_DISABLE_WRITE	0x2
 | |
| #define PKEY_ACCESS_MASK	(PKEY_DISABLE_ACCESS |\
 | |
| 				 PKEY_DISABLE_WRITE)
 | |
| 
 | |
| #endif /* __PARISC_MMAN_H__ */
 |