aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2014-09-23 21:28:32 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2014-09-25 08:25:47 -0400
commit1aff52562939485e503936e17934be077ffaea53 (patch)
tree16dba0b5ce0005389ea045e29f69c6b65d133e32 /fs/nfs
parent353db7966288a2f18da22438aeec2b4862c0b241 (diff)
NFS/SUNRPC: Remove other deadlock-avoidance mechanisms in nfs_release_page()
Now that nfs_release_page() doesn't block indefinitely, other deadlock avoidance mechanisms aren't needed. - it doesn't hurt for kswapd to block occasionally. If it doesn't want to block it would clear __GFP_WAIT. The current_is_kswapd() was only added to avoid deadlocks and we have a new approach for that. - memory allocation in the SUNRPC layer can very rarely try to ->releasepage() a page it is trying to handle. The deadlock is removed as nfs_release_page() doesn't block indefinitely. So we don't need to set PF_FSTRANS for sunrpc network operations any more. Signed-off-by: NeilBrown <neilb@suse.de> Acked-by: Jeff Layton <jlayton@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/file.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index 24832d040eb8..6920127c5eb7 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -476,20 +476,18 @@ static int nfs_release_page(struct page *page, gfp_t gfp)
476 dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); 476 dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page);
477 477
478 /* Always try to initiate a 'commit' if relevant, but only 478 /* Always try to initiate a 'commit' if relevant, but only
479 * wait for it if __GFP_WAIT is set and the calling process is 479 * wait for it if __GFP_WAIT is set. Even then, only wait 1
480 * allowed to block. Even then, only wait 1 second and only 480 * second and only if the 'bdi' is not congested.
481 * if the 'bdi' is not congested.
482 * Waiting indefinitely can cause deadlocks when the NFS 481 * Waiting indefinitely can cause deadlocks when the NFS
483 * server is on this machine, and there is no particular need 482 * server is on this machine, when a new TCP connection is
484 * to wait extensively here. A short wait has the benefit 483 * needed and in other rare cases. There is no particular
485 * that someone else can worry about the freezer. 484 * need to wait extensively here. A short wait has the
485 * benefit that someone else can worry about the freezer.
486 */ 486 */
487 if (mapping) { 487 if (mapping) {
488 struct nfs_server *nfss = NFS_SERVER(mapping->host); 488 struct nfs_server *nfss = NFS_SERVER(mapping->host);
489 nfs_commit_inode(mapping->host, 0); 489 nfs_commit_inode(mapping->host, 0);
490 if ((gfp & __GFP_WAIT) && 490 if ((gfp & __GFP_WAIT) &&
491 !current_is_kswapd() &&
492 !(current->flags & PF_FSTRANS) &&
493 !bdi_write_congested(&nfss->backing_dev_info)) { 491 !bdi_write_congested(&nfss->backing_dev_info)) {
494 wait_on_page_bit_killable_timeout(page, PG_private, 492 wait_on_page_bit_killable_timeout(page, PG_private,
495 HZ); 493 HZ);