On Wed, Apr 23, 2014 at 12:40:58PM +1000, NeilBrown wrote: > PF_LESS_THROTTLE has a very specific use case: to avoid deadlocks > and live-locks while writing to the page cache in a loop-back > NFS mount situation. > > It therefore makes sense to *only* set PF_LESS_THROTTLE in this > situation. > We now know when a request came from the local-host so it could be a > loop-back mount. We already know when we are handling write requests, > and when we are doing anything else. > > So combine those two to allow nfsd to still be throttled (like any > other process) in every situation except when it is known to be > problematic. Looks simple enough, ACK.--b. > > Signed-off-by: NeilBrown <neilb@xxxxxxx> > --- > fs/nfsd/nfssvc.c | 6 ------ > fs/nfsd/vfs.c | 12 ++++++++++++ > 2 files changed, 12 insertions(+), 6 deletions(-) > > diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c > index 9a4a5f9e7468..1879e43f2868 100644 > --- a/fs/nfsd/nfssvc.c > +++ b/fs/nfsd/nfssvc.c > @@ -591,12 +591,6 @@ nfsd(void *vrqstp) > nfsdstats.th_cnt++; > mutex_unlock(&nfsd_mutex); > > - /* > - * We want less throttling in balance_dirty_pages() so that nfs to > - * localhost doesn't cause nfsd to lock up due to all the client's > - * dirty pages. > - */ > - current->flags |= PF_LESS_THROTTLE; > set_freezable(); > > /* > diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c > index 6d7be3f80356..2acd00445ad0 100644 > --- a/fs/nfsd/vfs.c > +++ b/fs/nfsd/vfs.c > @@ -913,6 +913,16 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, > int stable = *stablep; > int use_wgather; > loff_t pos = offset; > + unsigned int pflags = current->flags; > + > + if (rqstp->rq_local) > + /* > + * We want less throttling in balance_dirty_pages() > + * and shrink_inactive_list() so that nfs to > + * localhost doesn't cause nfsd to lock up due to all > + * the client's dirty pages or its congested queue. > + */ > + current->flags |= PF_LESS_THROTTLE; > > dentry = file->f_path.dentry; > inode = dentry->d_inode; > @@ -950,6 +960,8 @@ out_nfserr: > err = 0; > else > err = nfserrno(host_err); > + if (rqstp->rq_local) > + tsk_restore_flags(current, pflags, PF_LESS_THROTTLE); > return err; > } > > > -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html