Thread (11 messages) 11 messages, 3 authors, 2014-09-03

Re: [PATCH] fs/super.c: do not shrink fs slab during direct memory reclaim

From: Dave Chinner <david@fromorbit.com>
Date: 2014-09-03 05:02:32
Also in: linux-fsdevel, lkml, ocfs2-devel

On Wed, Sep 03, 2014 at 12:21:24PM +0800, Junxiao Bi wrote:
On 09/03/2014 11:10 AM, Dave Chinner wrote:
quoted
On Wed, Sep 03, 2014 at 09:38:31AM +0800, Junxiao Bi wrote:
quoted
Hi Jiufei,

On 09/02/2014 05:03 PM, Xue jiufei wrote:
quoted
Hi, Dave
On 2014/9/2 7:51, Dave Chinner wrote:
quoted
On Fri, Aug 29, 2014 at 05:57:22PM +0800, Xue jiufei wrote:
quoted
The patch trys to solve one deadlock problem caused by cluster
fs, like ocfs2. And the problem may happen at least in the below
situations:
1)Receiving a connect message from other nodes, node queues a
work_struct o2net_listen_work.
2)o2net_wq processes this work and calls sock_alloc() to allocate
memory for a new socket.
3)It would do direct memory reclaim when available memory is not
enough and trigger the inode cleanup. That inode being cleaned up
is happened to be ocfs2 inode, so call evict()->ocfs2_evict_inode()
->ocfs2_drop_lock()->dlmunlock()->o2net_send_message_vec(),
and wait for the unlock response from master.
4)tcp layer received the response, call o2net_data_ready() and
queue sc_rx_work, waiting o2net_wq to process this work.
5)o2net_wq is a single thread workqueue, it process the work one by
one. Right now it is still doing o2net_listen_work and cannot handle
sc_rx_work. so we deadlock.

It is impossible to set GFP_NOFS for memory allocation in sock_alloc().
So we use PF_FSTRANS to avoid the task reentering filesystem when
available memory is not enough.

Signed-off-by: joyce.xue <redacted>
For the second time: use memalloc_noio_save/memalloc_noio_restore.
And please put a great big comment in the code explaining why you
need to do this special thing with memory reclaim flags.

Cheers,

Dave.
Thanks for your reply. But I am afraid that memalloc_noio_save/
memalloc_noio_restore can not solve my problem. __GFP_IO is cleared
if PF_MEMALLOC_NOIO is set and can avoid doing IO in direct memory
reclaim. However, __GFP_FS is still set that can not avoid pruning
dcache and icache in memory allocation, resulting in the deadlock I
described.
You can use PF_MEMALLOC_NOIO to replace PF_FSTRANS, set this flag in
ocfs2 and check it in sb shrinker.
No changes to the superblock shrinker, please. The flag should
modify the gfp_mask in the struct shrink_control passed to the
shrinker, just like the noio flag is used in the rest of the mm
code.
__GFP_FS seemed imply __GFP_IO,
Now you are starting to understand. Check what GFP_NOIO actually
means, then tell me why memalloc_noio_flags() is not fully correct,
needs fixing, and needs to be applied to all of reclaim.

Hint: there's a heirarchy involved....
can superblock shrinker check
!(sc->gfp_mask & __GFP_IO) and stop?
No. Go back and read what I said about the initial setting of
sc->gfp_mask.

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help