mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-25 10:19:47 +00:00
![Peter Zijlstra](/assets/img/avatar_default.png)
The current NFS client congestion logic is severly broken, it marks the backing device congested during each nfs_writepages() call but doesn't mirror this in nfs_writepage() which makes for deadlocks. Also it implements its own waitqueue. Replace this by a more regular congestion implementation that puts a cap on the number of active writeback pages and uses the bdi congestion waitqueue. Also always use an interruptible wait since it makes sense to be able to SIGKILL the process even for mounts without 'intr'. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Acked-by: Trond Myklebust <trond.myklebust@fys.uio.no> Cc: Christoph Lameter <clameter@engr.sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
96 lines
2.1 KiB
C
96 lines
2.1 KiB
C
/*
|
|
* linux/fs/nfs/sysctl.c
|
|
*
|
|
* Sysctl interface to NFS parameters
|
|
*/
|
|
#include <linux/types.h>
|
|
#include <linux/linkage.h>
|
|
#include <linux/ctype.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/sysctl.h>
|
|
#include <linux/module.h>
|
|
#include <linux/nfs4.h>
|
|
#include <linux/nfs_idmap.h>
|
|
#include <linux/nfs_fs.h>
|
|
|
|
#include "callback.h"
|
|
|
|
static const int nfs_set_port_min = 0;
|
|
static const int nfs_set_port_max = 65535;
|
|
static struct ctl_table_header *nfs_callback_sysctl_table;
|
|
|
|
static ctl_table nfs_cb_sysctls[] = {
|
|
#ifdef CONFIG_NFS_V4
|
|
{
|
|
.ctl_name = CTL_UNNUMBERED,
|
|
.procname = "nfs_callback_tcpport",
|
|
.data = &nfs_callback_set_tcpport,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = &proc_dointvec_minmax,
|
|
.extra1 = (int *)&nfs_set_port_min,
|
|
.extra2 = (int *)&nfs_set_port_max,
|
|
},
|
|
{
|
|
.ctl_name = CTL_UNNUMBERED,
|
|
.procname = "idmap_cache_timeout",
|
|
.data = &nfs_idmap_cache_timeout,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = &proc_dointvec_jiffies,
|
|
.strategy = &sysctl_jiffies,
|
|
},
|
|
#endif
|
|
{
|
|
.ctl_name = CTL_UNNUMBERED,
|
|
.procname = "nfs_mountpoint_timeout",
|
|
.data = &nfs_mountpoint_expiry_timeout,
|
|
.maxlen = sizeof(nfs_mountpoint_expiry_timeout),
|
|
.mode = 0644,
|
|
.proc_handler = &proc_dointvec_jiffies,
|
|
.strategy = &sysctl_jiffies,
|
|
},
|
|
{
|
|
.ctl_name = CTL_UNNUMBERED,
|
|
.procname = "nfs_congestion_kb",
|
|
.data = &nfs_congestion_kb,
|
|
.maxlen = sizeof(nfs_congestion_kb),
|
|
.mode = 0644,
|
|
.proc_handler = &proc_dointvec,
|
|
},
|
|
{ .ctl_name = 0 }
|
|
};
|
|
|
|
static ctl_table nfs_cb_sysctl_dir[] = {
|
|
{
|
|
.ctl_name = CTL_UNNUMBERED,
|
|
.procname = "nfs",
|
|
.mode = 0555,
|
|
.child = nfs_cb_sysctls,
|
|
},
|
|
{ .ctl_name = 0 }
|
|
};
|
|
|
|
static ctl_table nfs_cb_sysctl_root[] = {
|
|
{
|
|
.ctl_name = CTL_FS,
|
|
.procname = "fs",
|
|
.mode = 0555,
|
|
.child = nfs_cb_sysctl_dir,
|
|
},
|
|
{ .ctl_name = 0 }
|
|
};
|
|
|
|
int nfs_register_sysctl(void)
|
|
{
|
|
nfs_callback_sysctl_table = register_sysctl_table(nfs_cb_sysctl_root);
|
|
if (nfs_callback_sysctl_table == NULL)
|
|
return -ENOMEM;
|
|
return 0;
|
|
}
|
|
|
|
void nfs_unregister_sysctl(void)
|
|
{
|
|
unregister_sysctl_table(nfs_callback_sysctl_table);
|
|
nfs_callback_sysctl_table = NULL;
|
|
}
|