On Sat, 2007-10-06 at 21:43 +0100, Hugh Dickins wrote: > Building in a filesystem on a loop device on a tmpfs file can hang when > swapping, the loop thread caught in that infamous throttle_vm_writeout. > > In theory this is a long standing problem, which I've either never seen > in practice, or long ago suppressed the recollection, after discounting > my load and my tmpfs size as unrealistically high. But now, with the > new aops, it has become easy to hang on one machine. > > Loop used to grab_cache_page before the old prepare_write to tmpfs, > which seems to have been enough to free up some memory for any swapin > needed; but the new write_begin lets tmpfs find or allocate the page > (much nicer, since grab_cache_page missed tmpfs pages in swapcache). > > When allocating a fresh page, tmpfs respects loop's mapping_gfp_mask, > which has __GFP_IO|__GFP_FS stripped off, and throttle_vm_writeout is > designed to break out when __GFP_IO or GFP_FS is unset; but when tmfps > swaps in, read_swap_cache_async allocates with GFP_HIGHUSER_MOVABLE > regardless of the mapping_gfp_mask - hence the hang. > > So, pass gfp_mask down the line from shmem_getpage to shmem_swapin > to swapin_readahead to read_swap_cache_async to add_to_swap_cache. > > Signed-off-by: Hugh Dickins Acked-by: Peter Zijlstra