Skip to content

Support loop-back NFS mounts

NeilBrown linux-mm linux-nfs linux-xfs lkml netdev 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest19 patches 32 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/19Promote current_{set, restore}_flags_nested from xfs to global.drivers/base/power/runtime.c drivers/block/nbd.c drivers/md/dm-bufio.c +16 more+78 -990 replies
2/19lockdep: lockdep_set_current_reclaim_state should save old valueinclude/linux/lockdep.h kernel/locking/lockdep.c mm/page_alloc.c +1 more+18 -130 replies
3/19lockdep: improve scenario messages for RECLAIM_FS errors.kernel/locking/lockdep.c+32 -111 reply
4/19Make effect of PF_FSTRANS to disable __GFP_FS universal.fs/nfs/file.c fs/xfs/kmem.h fs/xfs/xfs_aops.c +6 more+14 -154 replies
5/19SUNRPC: track whether a request is coming from a loop-back interface.include/linux/sunrpc/svc.h include/linux/sunrpc/svc_xprt.h net/sunrpc/svcsock.c+12 -02 replies
6/19nfsd: set PF_FSTRANS for nfsd threads.fs/nfsd/nfssvc.c include/linux/sunrpc/svc.h net/sunrpc/svc.c+25 -01 reply
7/19nfsd and VM: use PF_LESS_THROTTLE to avoid throttle in shrink_inactive_list.fs/nfsd/nfssvc.c fs/nfsd/vfs.c mm/vmscan.c+11 -80 replies
8/19Set PF_FSTRANS while write_cache_pages calls ->writepagemm/page-writeback.c+3 -00 replies
9/19XFS: ensure xfs_file_*_read cannot deadlock in memory allocation.fs/xfs/xfs_file.c+12 -03 replies
10/19NET: set PF_FSTRANS while holding sk_lockinclude/net/sock.h net/core/sock.c+3 -04 replies
11/19FS: set PF_FSTRANS while holding mmap_sem in exec.cfs/exec.c+6 -00 replies
12/19NET: set PF_FSTRANS while holding rtnl_locknet/core/rtnetlink.c+8 -10 replies
13/19MM: set PF_FSTRANS while allocating per-cpu memory to avoid deadlock.mm/percpu.c+4 -03 replies
14/19driver core: set PF_FSTRANS while holding gdp_mutexdrivers/base/core.c+3 -00 replies
15/19nfsd: set PF_FSTRANS when client_mutex is held.fs/nfsd/nfs4state.c+3 -00 replies
16/19VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc.fs/dcache.c+2 -25 replies
17/19VFS: set PF_FSTRANS while namespace_sem is held.fs/namespace.c+4 -03 replies
18/19nfsd: set PF_FSTRANS during nfsd4_do_callback_rpc.fs/nfsd/nfs4callback.c+5 -00 replies
19/19XFS: set PF_FSTRANS while ilock is held in xfs_free_eofblocksfs/xfs/xfs_bmap_util.c+4 -01 reply

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.

Read the v1 thread

Cover letter [PATCH/RFC 00/19] Support loop-back NFS mounts

Loop-back NFS mounts are when the NFS client and server run on the same host.

The use-case for this is a high availability cluster with shared storage. The shared filesystem is mounted on any one machine and NFS-mounted on the others.
If the nfs server fails, some other node will take over that service, and then it will have a loop-back NFS mount which needs to keep working.

This patch set addresses the "keep working" bit and specifically addresses deadlocks and livelocks.
Allowing the fail-over itself to be deadlock free is a separate challenge for another day.

The short description of how this works is:

deadlocks:
- Elevate PF_FSTRANS to apply globally instead of just in NFS and XFS. PF_FSTRANS disables __GFP_NS in the same way that PF_MEMALLOC_NOIO disables __GFP_IO.
- Set PF_FSTRANS in nfsd when handling requests related to memory reclaim, or requests which could block requests related to memory reclaim.
- Use lockdep to find all consequent deadlocks from some other thread allocating memory while holding a lock that nfsd might want.
- Fix those other deadlocks by setting PF_FSTRANS or using GFP_NOFS as appropriate.

livelocks:
- identify throttling during reclaim and bypass it when PF_LESS_THROTTLE is set
- only set PF_LESS_THROTTLE for nfsd when handling write requests from the local host.

The last 12 patches address various deadlocks due to locking chains. 11 were found by lockdep, 2 by testing. There is a reasonable chance that there are more, I just need to exercise more code while testing....

There is one issue that lockdep reports which I haven't fixed (I've just hacked the code out for my testing). That issue relates to freeze_super().
I may not be interpreting the lockdep reports perfectly, but I think they are basically saying that if I were to freeze a filesystem that was exported to the local host, then we could end up deadlocking. This is to be expected. The NFS filesystem would need to be frozen first. I don't know how to tell lockdep that I know that is a problem and I don't want to be warned about it. Suggestions welcome. Until this is addressed I cannot really ask others to test the code with lockdep enabled.

There are more subsidiary places that I needed to add PF_FSTRANS than I would have liked. The thought keeps crossing my mind that maybe we can get rid of __GFP_FS and require that memory reclaim never ever block on a filesystem. Then most of these patches go away.

Now that writeback doesn't happen from reclaim (but from kswapd) much of the calls from reclaim to FS are gone.
The ->releasepage call is the only one that I *know* causes me problems so I'd like to just say that that must never block. I don't really understand the consequences of that though.
There are a couple of other places where __GFP_FS is used and I'd need to carefully analyze those. But if someone just said "no, that is impossible", I could be happy and stick with the current approach....

I've cc:ed Peter Zijlstra and Ingo Molnar only on the lockdep-related patches, Ming Lei only on the PF_MEMALLOC_NOIO related patches, and net-dev only on the network-related patches.
There are probably other people I should CC. Apologies if I missed you. I'll ensure better coverage if the nfs/mm/xfs people are reasonably happy.

Comments, criticisms, etc most welcome.

Thanks,
NeilBrown

---

NeilBrown (19):
Promote current_{set,restore}_flags_nested from xfs to global.
lockdep: lockdep_set_current_reclaim_state should save old value
lockdep: improve scenario messages for RECLAIM_FS errors.
Make effect of PF_FSTRANS to disable __GFP_FS universal.
SUNRPC: track whether a request is coming from a loop-back interface.
nfsd: set PF_FSTRANS for nfsd threads.
nfsd and VM: use PF_LESS_THROTTLE to avoid throttle in shrink_inactive_list. Set PF_FSTRANS while write_cache_pages calls ->writepage
XFS: ensure xfs_file_*_read cannot deadlock in memory allocation.
NET: set PF_FSTRANS while holding sk_lock
FS: set PF_FSTRANS while holding mmap_sem in exec.c
NET: set PF_FSTRANS while holding rtnl_lock
MM: set PF_FSTRANS while allocating per-cpu memory to avoid deadlock. driver core: set PF_FSTRANS while holding gdp_mutex
nfsd: set PF_FSTRANS when client_mutex is held.
VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc.
VFS: set PF_FSTRANS while namespace_sem is held.
nfsd: set PF_FSTRANS during nfsd4_do_callback_rpc.
XFS: set PF_FSTRANS while ilock is held in xfs_free_eofblocks

 drivers/base/core.c             |    3 ++
 drivers/base/power/runtime.c    |    6 ++---
 drivers/block/nbd.c             |    6 ++---
 drivers/md/dm-bufio.c           |    6 ++---
 drivers/md/dm-ioctl.c           |    6 ++---
 drivers/mtd/nand/nandsim.c      |   28 ++++++---------------
 drivers/scsi/iscsi_tcp.c        |    6 ++---
 drivers/usb/core/hub.c          |    6 ++---
 fs/dcache.c                     |    4 ++-
 fs/exec.c                       |    6 +++++
 fs/fs-writeback.c               |    5 ++--
 fs/namespace.c                  |    4 +++
 fs/nfs/file.c                   |    3 +-
 fs/nfsd/nfs4callback.c          |    5 ++++
 fs/nfsd/nfs4state.c             |    3 ++
 fs/nfsd/nfssvc.c                |   24 ++++++++++++++----
 fs/nfsd/vfs.c                   |    6 +++++
 fs/xfs/kmem.h                   |    2 --
 fs/xfs/xfs_aops.c               |    7 -----
 fs/xfs/xfs_bmap_util.c          |    4 +++
 fs/xfs/xfs_file.c               |   12 +++++++++
 fs/xfs/xfs_linux.h              |    7 -----
 include/linux/lockdep.h         |    8 +++---
 include/linux/sched.h           |   32 +++++++++---------------
 include/linux/sunrpc/svc.h      |    2 ++
 include/linux/sunrpc/svc_xprt.h |    1 +
 include/net/sock.h              |    1 +
 kernel/locking/lockdep.c        |   51 ++++++++++++++++++++++++++++-----------
 kernel/softirq.c                |    6 ++---
 mm/migrate.c                    |    9 +++----
 mm/page-writeback.c             |    3 ++
 mm/page_alloc.c                 |   18 ++++++++------
 mm/percpu.c                     |    4 +++
 mm/slab.c                       |    2 ++
 mm/slob.c                       |    2 ++
 mm/slub.c                       |    1 +
 mm/vmscan.c                     |   31 +++++++++++++++---------
 net/core/dev.c                  |    6 ++---
 net/core/rtnetlink.c            |    9 ++++++-
 net/core/sock.c                 |    8 ++++--
 net/sunrpc/sched.c              |    5 ++--
 net/sunrpc/svc.c                |    6 +++++
 net/sunrpc/svcsock.c            |   10 ++++++++
 net/sunrpc/xprtrdma/transport.c |    5 ++--
 net/sunrpc/xprtsock.c           |   17 ++++++++-----
 45 files changed, 247 insertions(+), 149 deletions(-)
Signature · 7 lines
Signature

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to [email protected].  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>