summaryrefslogtreecommitdiffstats
path: root/fs/nfsd
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2019-02-21 10:47:00 -0500
committerJ. Bruce Fields <bfields@redhat.com>2019-02-21 10:47:00 -0500
commitc54f24e338ed2a35218f117a4a1afb5f9e2b4e64 (patch)
tree49958ea45d072adb41954bbd5b8b273284eaf889 /fs/nfsd
parentb7e5034cbecf5a65b7bfdc2b20a8378039577706 (diff)
nfsd: fix performance-limiting session calculation
We're unintentionally limiting the number of slots per nfsv4.1 session to 10. Often more than 10 simultaneous RPCs are needed for the best performance. This calculation was meant to prevent any one client from using up more than a third of the limit we set for total memory use across all clients and sessions. Instead, it's limiting the client to a third of the maximum for a single session. Fix this. Reported-by: Chris Tracy <ctracy@engr.scu.edu> Cc: stable@vger.kernel.org Fixes: de766e570413 "nfsd: give out fewer session slots as limit approaches" Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd')
-rw-r--r--fs/nfsd/nfs4state.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index fb3c9844c82a..6a45fb00c5fc 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1544,16 +1544,16 @@ static u32 nfsd4_get_drc_mem(struct nfsd4_channel_attrs *ca)
1544{ 1544{
1545 u32 slotsize = slot_bytes(ca); 1545 u32 slotsize = slot_bytes(ca);
1546 u32 num = ca->maxreqs; 1546 u32 num = ca->maxreqs;
1547 int avail; 1547 unsigned long avail, total_avail;
1548 1548
1549 spin_lock(&nfsd_drc_lock); 1549 spin_lock(&nfsd_drc_lock);
1550 avail = min((unsigned long)NFSD_MAX_MEM_PER_SESSION, 1550 total_avail = nfsd_drc_max_mem - nfsd_drc_mem_used;
1551 nfsd_drc_max_mem - nfsd_drc_mem_used); 1551 avail = min((unsigned long)NFSD_MAX_MEM_PER_SESSION, total_avail);
1552 /* 1552 /*
1553 * Never use more than a third of the remaining memory, 1553 * Never use more than a third of the remaining memory,
1554 * unless it's the only way to give this client a slot: 1554 * unless it's the only way to give this client a slot:
1555 */ 1555 */
1556 avail = clamp_t(int, avail, slotsize, avail/3); 1556 avail = clamp_t(int, avail, slotsize, total_avail/3);
1557 num = min_t(int, num, avail / slotsize); 1557 num = min_t(int, num, avail / slotsize);
1558 nfsd_drc_mem_used += num * slotsize; 1558 nfsd_drc_mem_used += num * slotsize;
1559 spin_unlock(&nfsd_drc_lock); 1559 spin_unlock(&nfsd_drc_lock);