forked from Minki/linux
f822566165
Currently, copy-on-write may change the physical address of a page even if the user requested that the page is pinned in memory (either by mlock or by get_user_pages). This happens if the process forks meanwhile, and the parent writes to that page. As a result, the page is orphaned: in case of get_user_pages, the application will never see any data hardware DMA's into this page after the COW. In case of mlock'd memory, the parent is not getting the realtime/security benefits of mlock. In particular, this affects the Infiniband modules which do DMA from and into user pages all the time. This patch adds madvise options to control whether memory range is inherited across fork. Useful e.g. for when hardware is doing DMA from/into these pages. Could also be useful to an application wanting to speed up its forks by cutting large areas out of consideration. Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il> Acked-by: Hugh Dickins <hugh@veritas.com> Cc: Michael Kerrisk <mtk-manpages@gmx.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
77 lines
2.9 KiB
C
77 lines
2.9 KiB
C
/*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
* Copyright (C) 1995, 1999, 2002 by Ralf Baechle
|
|
*/
|
|
#ifndef _ASM_MMAN_H
|
|
#define _ASM_MMAN_H
|
|
|
|
/*
|
|
* Protections are chosen from these bits, OR'd together. The
|
|
* implementation does not necessarily support PROT_EXEC or PROT_WRITE
|
|
* without PROT_READ. The only guarantees are that no writing will be
|
|
* allowed without PROT_WRITE and no access will be allowed for PROT_NONE.
|
|
*/
|
|
#define PROT_NONE 0x00 /* page can not be accessed */
|
|
#define PROT_READ 0x01 /* page can be read */
|
|
#define PROT_WRITE 0x02 /* page can be written */
|
|
#define PROT_EXEC 0x04 /* page can be executed */
|
|
/* 0x08 reserved for PROT_EXEC_NOFLUSH */
|
|
#define PROT_SEM 0x10 /* page may be used for atomic ops */
|
|
#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 */
|
|
|
|
/*
|
|
* Flags for mmap
|
|
*/
|
|
#define MAP_SHARED 0x001 /* Share changes */
|
|
#define MAP_PRIVATE 0x002 /* Changes are private */
|
|
#define MAP_TYPE 0x00f /* Mask for type of mapping */
|
|
#define MAP_FIXED 0x010 /* Interpret addr exactly */
|
|
|
|
/* not used by linux, but here to make sure we don't clash with ABI defines */
|
|
#define MAP_RENAME 0x020 /* Assign page to file */
|
|
#define MAP_AUTOGROW 0x040 /* File may grow by writing */
|
|
#define MAP_LOCAL 0x080 /* Copy on fork/sproc */
|
|
#define MAP_AUTORSRV 0x100 /* Logical swap reserved on demand */
|
|
|
|
/* These are linux-specific */
|
|
#define MAP_NORESERVE 0x0400 /* don't check for reservations */
|
|
#define MAP_ANONYMOUS 0x0800 /* don't use a file */
|
|
#define MAP_GROWSDOWN 0x1000 /* stack-like segment */
|
|
#define MAP_DENYWRITE 0x2000 /* ETXTBSY */
|
|
#define MAP_EXECUTABLE 0x4000 /* mark it as an executable */
|
|
#define MAP_LOCKED 0x8000 /* pages are locked */
|
|
#define MAP_POPULATE 0x10000 /* populate (prefault) pagetables */
|
|
#define MAP_NONBLOCK 0x20000 /* do not block on IO */
|
|
|
|
/*
|
|
* Flags for msync
|
|
*/
|
|
#define MS_ASYNC 0x0001 /* sync memory asynchronously */
|
|
#define MS_INVALIDATE 0x0002 /* invalidate mappings & caches */
|
|
#define MS_SYNC 0x0004 /* synchronous memory sync */
|
|
|
|
/*
|
|
* Flags for mlockall
|
|
*/
|
|
#define MCL_CURRENT 1 /* lock all current mappings */
|
|
#define MCL_FUTURE 2 /* lock all future mappings */
|
|
|
|
#define MADV_NORMAL 0x0 /* default page-in behavior */
|
|
#define MADV_RANDOM 0x1 /* page-in minimum required */
|
|
#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */
|
|
#define MADV_WILLNEED 0x3 /* pre-fault pages */
|
|
#define MADV_DONTNEED 0x4 /* discard these pages */
|
|
#define MADV_REMOVE 0x5 /* remove these pages & resources */
|
|
#define MADV_DONTFORK 0x30 /* dont inherit across fork */
|
|
#define MADV_DOFORK 0x31 /* do inherit across fork */
|
|
|
|
/* compatibility flags */
|
|
#define MAP_ANON MAP_ANONYMOUS
|
|
#define MAP_FILE 0
|
|
|
|
#endif /* _ASM_MMAN_H */
|