Mel Gorman
a8bef8ff6e
mm: migration: avoid race between shift_arg_pages() and rmap_walk() during migration by not migrating temporary stacks
...
Page migration requires rmap to be able to find all ptes mapping a page
at all times, otherwise the migration entry can be instantiated, but it
is possible to leave one behind if the second rmap_walk fails to find
the page. If this page is later faulted, migration_entry_to_page() will
call BUG because the page is locked indicating the page was migrated by
the migration PTE not cleaned up. For example
kernel BUG at include/linux/swapops.h:105!
invalid opcode: 0000 [#1 ] PREEMPT SMP
...
Call Trace:
[<ffffffff810e951a>] handle_mm_fault+0x3f8/0x76a
[<ffffffff8130c7a2>] do_page_fault+0x44a/0x46e
[<ffffffff813099b5>] page_fault+0x25/0x30
[<ffffffff8114de33>] load_elf_binary+0x152a/0x192b
[<ffffffff8111329b>] search_binary_handler+0x173/0x313
[<ffffffff81114896>] do_execve+0x219/0x30a
[<ffffffff8100a5c6>] sys_execve+0x43/0x5e
[<ffffffff8100320a>] stub_execve+0x6a/0xc0
RIP [<ffffffff811094ff>] migration_entry_wait+0xc1/0x129
There is a race between shift_arg_pages and migration that triggers this
bug. A temporary stack is setup during exec and later moved. If
migration moves a page in the temporary stack and the VMA is then removed
before migration completes, the migration PTE may not be found leading to
a BUG when the stack is faulted.
This patch causes pages within the temporary stack during exec to be
skipped by migration. It does this by marking the VMA covering the
temporary stack with an otherwise impossible combination of VMA flags.
These flags are cleared when the temporary stack is moved to its final
location.
[kamezawa.hiroyu@jp.fujitsu.com: idea for having migration skip temporary stacks]
Signed-off-by: Mel Gorman <mel@csn.ul.ie>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Reviewed-by: Rik van Riel <riel@redhat.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Minchan Kim <minchan.kim@gmail.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Reviewed-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-05-25 08:06:59 -07:00
..
9p
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs
2010-05-24 07:41:13 -07:00
adfs
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
affs
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
afs
AFS: Don't put struct file on the stack
2010-05-21 18:31:28 -04:00
autofs
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
autofs4
autofs4: Pushdown the bkl from ioctl
2010-05-22 17:44:18 +02:00
befs
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
bfs
bfs: replace inode uid,gid,mode initialization with helper function
2010-05-21 18:31:25 -04:00
btrfs
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
2010-05-21 19:37:45 -07:00
cachefiles
CacheFiles: Fix error handling in cachefiles_determine_cache_security()
2010-05-12 18:23:58 -07:00
ceph
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
2010-05-24 07:37:52 -07:00
cifs
cifs: fix noserverino handling when unix extensions are enabled
2010-05-17 20:59:21 +00:00
coda
Merge branch 'bkl/ioctl' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing
2010-05-24 08:01:10 -07:00
configfs
Fix the regression created by "set S_DEAD on unlink()..." commit
2010-05-15 07:16:33 -04:00
cramfs
debugfs
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
devpts
Simplify devpts_get_sb() failure exits
2010-05-21 18:31:12 -04:00
dlm
dlm: fix ast ordering for user locks
2010-04-30 14:52:51 -05:00
ecryptfs
switch ecryptfs_write() to struct inode *, kill on-stack fake files
2010-05-21 18:31:28 -04:00
efs
exofs
Merge branch 'for-linus' of git://git.open-osd.org/linux-open-osd
2010-05-24 07:57:41 -07:00
exportfs
nfs: new subdir Documentation/filesystems/nfs
2009-10-27 19:34:04 -04:00
ext2
ext2: replace inode uid,gid,mode init with helper
2010-05-21 18:31:24 -04:00
ext3
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
2010-05-21 19:37:45 -07:00
ext4
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
2010-05-21 19:37:45 -07:00
fat
Merge git://git.kernel.org/pub/scm/linux/kernel/git/hirofumi/fatfs-2.6
2010-05-24 07:41:47 -07:00
freevxfs
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
fscache
fs-cache: order the debugfs stats correctly
2010-04-07 08:38:05 -07:00
fuse
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
gfs2
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
2010-05-21 19:37:45 -07:00
hfs
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
hfsplus
hfsplus: Push down BKL into ioctl function
2010-05-17 05:27:03 +02:00
hostfs
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
hpfs
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
hppfs
hppfs can use existing proc_mnt, no need for do_kern_mount() in there
2010-03-03 14:08:00 -05:00
hugetlbfs
Untangling ima mess, part 1: alloc_file()
2009-12-16 12:16:47 -05:00
isofs
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
jbd
ext3: Fix waiting on transaction during fsync
2010-05-21 19:30:41 +02:00
jbd2
Merge branch 'master' into for-2.6.35
2010-05-21 21:27:26 +02:00
jffs2
jffs2: constify xattr_handler
2010-05-21 18:31:20 -04:00
jfs
jfs: replace inode uid,gid,mode init with helper
2010-05-21 18:31:23 -04:00
lockd
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
logfs
logfs: replace inode uid,gid,mode initialization with helper function
2010-05-21 18:31:27 -04:00
minix
minix: replace inode uid,gid,mode init with helper
2010-05-21 18:31:24 -04:00
ncpfs
ncpfs: BKL ioctl pushdown
2010-05-17 05:27:42 +02:00
nfs
NFS: Don't call iput() in nfs_access_cache_shrinker
2010-05-14 15:09:36 -04:00
nfs_common
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
nfsd
sanitize vfs_fsync calling conventions
2010-05-21 18:31:21 -04:00
nilfs2
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
2010-05-21 19:37:45 -07:00
nls
Merge git://git.kernel.org/pub/scm/linux/kernel/git/hirofumi/fatfs-2.6
2009-09-30 09:31:14 -07:00
notify
Saner locking around deactivate_super()
2010-05-21 18:31:14 -04:00
ntfs
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
ocfs2
ocfs2: replace inode uid,gid,mode initialization with helper function
2010-05-21 18:31:25 -04:00
omfs
omfs: replace inode uid,gid,mode initialization with helper function
2010-05-21 18:31:25 -04:00
openpromfs
partitions
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
2010-05-21 19:37:45 -07:00
proc
pagemap: add #ifdefs CONFIG_HUGETLB_PAGE on code walking hugetlb vma
2010-05-25 08:06:58 -07:00
qnx4
fs/qnx4: decrement sizeof size in strncmp
2010-02-04 11:55:46 +01:00
quota
new helper: iterate_supers()
2010-05-21 18:31:16 -04:00
ramfs
ramfs: replace inode uid,gid,mode initialization with helper function
2010-05-21 18:31:26 -04:00
reiserfs
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
2010-05-21 19:37:45 -07:00
romfs
fix leak in romfs_fill_super()
2010-01-26 22:22:26 -05:00
smbfs
smbfs: Push down BKL into ioctl function
2010-05-17 05:27:04 +02:00
squashfs
squashfs: fix potential buffer over-run on 4K block file systems
2010-04-25 02:09:05 +01:00
sysfs
sysfs: add struct file* to bin_attr callbacks
2010-05-21 09:37:31 -07:00
sysv
sysv: replace inode uid,gid,mode initialization with helper function
2010-05-21 18:31:26 -04:00
ubifs
ubifs: replace inode uid,gid,mode initialization with helper function
2010-05-21 18:31:26 -04:00
udf
udf: replace inode uid,gid,mode init with helper
2010-05-21 18:31:27 -04:00
ufs
ufs: replace inode uid,gid,mode initialization with helper function
2010-05-21 18:31:27 -04:00
xfs
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
2010-05-21 19:37:45 -07:00
aio.c
aio: remove unused field
2009-12-16 07:20:13 -08:00
anon_inodes.c
anon_inode: set S_IFREG on the anon_inode
2010-05-21 18:31:20 -04:00
attr.c
fs: use rlimit helpers
2010-03-06 11:26:29 -08:00
bad_inode.c
binfmt_aout.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
binfmt_elf.c
coredump: pass mm->flags as a coredump parameter for consistency
2010-03-06 11:26:46 -08:00
binfmt_elf_fdpic.c
Remove redundant check for CONFIG_MMU
2010-04-27 09:01:26 -07:00
binfmt_em86.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
binfmt_flat.c
uclinux: error message when FLAT reloc symbol is invalid, v2
2010-04-21 13:28:49 +10:00
binfmt_misc.c
binfmt_script.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
binfmt_som.c
Split 'flush_old_exec' into two functions
2010-01-29 08:22:01 -08:00
bio-integrity.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
bio.c
Merge branch 'master' into for-linus
2010-03-19 08:05:10 +01:00
block_dev.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
2010-05-21 19:37:45 -07:00
buffer.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
2010-05-21 19:37:45 -07:00
char_dev.c
fs/char_dev.c: remove useless loop
2009-09-24 07:21:03 -07:00
compat.c
revert "procfs: provide stack information for threads" and its fixup commits
2010-05-11 17:33:41 -07:00
compat_binfmt_elf.c
elf coredump: replace ELF_CORE_EXTRA_* macros by functions
2010-03-06 11:26:45 -08:00
compat_ioctl.c
pktcdvd: improve BKL and compat_ioctl.c usage
2010-04-29 08:44:37 -07:00
dcache.c
fix prune_dcache()/umount() race
2010-05-21 18:31:16 -04:00
dcookies.c
direct-io.c
dio: fix use-after-free
2009-12-17 04:52:13 -05:00
drop_caches.c
new helper: iterate_supers()
2010-05-21 18:31:16 -04:00
eventfd.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
eventpoll.c
sched, wait: Use wrapper functions
2010-05-11 17:43:58 +02:00
exec.c
mm: migration: avoid race between shift_arg_pages() and rmap_walk() during migration by not migrating temporary stacks
2010-05-25 08:06:59 -07:00
fcntl.c
Merge branch 'master' into for-2.6.35
2010-05-21 21:27:26 +02:00
fifo.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
file.c
fs: use rlimit helpers
2010-03-06 11:26:29 -08:00
file_table.c
vfs: take f_lock on modifying f_mode after open time
2010-03-06 11:26:25 -08:00
filesystems.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
fs-writeback.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
2010-05-21 19:37:45 -07:00
fs_struct.c
generic_acl.c
fs: xattr_handler table should be const
2010-05-21 18:31:18 -04:00
inode.c
vfs: Add inode uid,gid,mode init helper
2010-05-21 18:31:22 -04:00
internal.h
Bury __put_super_and_need_restart()
2010-05-21 18:31:16 -04:00
ioctl.c
Introduce freeze_super and thaw_super for the fsfreeze ioctl
2010-05-21 18:31:18 -04:00
ioprio.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
Kconfig
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
2010-03-19 09:43:06 -07:00
Kconfig.binfmt
libfs.c
FS / libfs: Implement simple_write_to_buffer
2010-05-10 23:08:17 +02:00
locks.c
Merge branch 'for-next' into for-linus
2010-03-08 16:55:37 +01:00
Makefile
Take statfs variants to fs/statfs.c
2010-05-21 18:31:17 -04:00
mbcache.c
mpage.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
namei.c
namei.c : update mnt when it needed
2010-05-21 18:31:22 -04:00
namespace.c
Merge branch 'next' into for-linus
2010-05-18 08:57:00 +10:00
nfsctl.c
Switch may_open() and break_lease() to passing O_...
2010-03-03 13:00:21 -05:00
no-block.c
open.c
Take statfs variants to fs/statfs.c
2010-05-21 18:31:17 -04:00
pipe.c
pipe: set lower and upper limit on max pages in the pipe page array
2010-05-21 21:12:52 +02:00
pnode.c
Kill CL_PROPAGATION, sanitize fs/pnode.c:get_source()
2010-03-03 13:00:22 -05:00
pnode.h
VFS: Clean up shared mount flag propagation
2010-03-03 14:07:55 -05:00
posix_acl.c
read_write.c
do_sync_read/write() should set kiocb.ki_nbytes to be consistent
2010-03-24 16:43:29 -07:00
read_write.h
readdir.c
select.c
Add generic sys_old_select()
2010-03-12 15:52:32 -08:00
seq_file.c
seq_file: fix new kernel-doc warnings
2010-03-07 15:48:26 -08:00
signalfd.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
splice.c
pipe: add support for shrinking and growing pipes
2010-05-21 21:12:40 +02:00
stack.c
VFS/fsstack: handle 32-bit smp + preempt + large files in fsstack_copy_inode_size
2009-12-17 10:58:17 -05:00
stat.c
Add unlocked version of inode_add_bytes() function
2009-12-23 13:33:54 +01:00
statfs.c
Take statfs variants to fs/statfs.c
2010-05-21 18:31:17 -04:00
super.c
vfs: add lockdep annotation to s_vfs_rename_key for ecryptfs
2010-05-21 18:31:22 -04:00
sync.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
2010-05-21 19:37:45 -07:00
timerfd.c
fs/timerfd.c: make use of wait_event_interruptible_locked_irq()
2010-05-20 13:21:42 -07:00
utimes.c
xattr.c
fs: xattr_handler table should be const
2010-05-21 18:31:18 -04:00
xattr_acl.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00