• Michal Hocko's avatar
    fs: break out of iomap_file_buffered_write on fatal signals · 72cd604c
    Michal Hocko authored
    commit d1908f52 upstream.
    
    Tetsuo has noticed that an OOM stress test which performs large write
    requests can cause the full memory reserves depletion.  He has tracked
    this down to the following path
    
    	__alloc_pages_nodemask+0x436/0x4d0
    	alloc_pages_current+0x97/0x1b0
    	__page_cache_alloc+0x15d/0x1a0          mm/filemap.c:728
    	pagecache_get_page+0x5a/0x2b0           mm/filemap.c:1331
    	grab_cache_page_write_begin+0x23/0x40   mm/filemap.c:2773
    	iomap_write_begin+0x50/0xd0             fs/iomap.c:118
    	iomap_write_actor+0xb5/0x1a0            fs/iomap.c:190
    	? iomap_write_end+0x80/0x80             fs/iomap.c:150
    	iomap_apply+0xb3/0x130                  fs/iomap.c:79
    	iomap_file_buffered_write+0x68/0xa0     fs/iomap.c:243
    	? iomap_write_end+0x80/0x80
    	xfs_file_buffered_aio_write+0x132/0x390 [xfs]
    	? remove_wait_queue+0x59/0x60
    	xfs_file_write_iter+0x90/0x130 [xfs]
    	__vfs_write+0xe5/0x140
    	vfs_write+0xc7/0x1f0
    	? syscall_trace_enter+0x1d0/0x380
    	SyS_write+0x58/0xc0
    	do_syscall_64+0x6c/0x200
    	entry_SYSCALL64_slow_path+0x25/0x25
    
    the oom victim has access to all memory reserves to make a forward
    progress to exit easier.  But iomap_file_buffered_write and other
    callers of iomap_apply loop to complete the full request.  We need to
    check for fatal signals and back off with a short write instead.
    
    As the iomap_apply delegates all the work down to the actor we have to
    hook into those.  All callers that work with the page cache are calling
    iomap_write_begin so we will check for signals there.  dax_iomap_actor
    has to handle the situation explicitly because it copies data to the
    userspace directly.  Other callers like iomap_page_mkwrite work on a
    single page or iomap_fiemap_actor do not allocate memory based on the
    given len.
    
    Fixes: 68a9f5e7 ("xfs: implement iomap based buffered write path")
    Link: http://lkml.kernel.org/r/20170201092706.9966-2-mhocko@kernel.orgSigned-off-by: default avatarMichal Hocko <mhocko@suse.com>
    Reported-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    72cd604c
dax.c 40.7 KB