nfsd: fix performance-limiting session calculation [Linux 4.9.187]

This Linux kernel change "nfsd: fix performance-limiting session calculation" is included in the Linux 4.9.187 release. This change is authored by J. Bruce Fields <bfields [at]> on Thu Feb 21 10:47:00 2019 -0500. The commit for this change in Linux stable tree is cdc106c (patch) which is from upstream commit c54f24e. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream c54f24e.

nfsd: fix performance-limiting session calculation

[ Upstream commit c54f24e338ed2a35218f117a4a1afb5f9e2b4e64 ]

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

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 <>
Fixes: de766e570413 "nfsd: give out fewer session slots as limit approaches"
Signed-off-by: J. Bruce Fields <>
Signed-off-by: Sasha Levin <>

There are 8 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 fs/nfsd/nfs4state.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 0aacd1c..c4762d8 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1502,16 +1502,16 @@ static u32 nfsd4_get_drc_mem(struct nfsd4_channel_attrs *ca)
    u32 slotsize = slot_bytes(ca);
    u32 num = ca->maxreqs;
-   int avail;
+   unsigned long avail, total_avail;

-   avail = min((unsigned long)NFSD_MAX_MEM_PER_SESSION,
-           nfsd_drc_max_mem - nfsd_drc_mem_used);
+   total_avail = nfsd_drc_max_mem - nfsd_drc_mem_used;
+   avail = min((unsigned long)NFSD_MAX_MEM_PER_SESSION, total_avail);
     * Never use more than a third of the remaining memory,
     * unless it's the only way to give this client a slot:
-   avail = clamp_t(int, avail, slotsize, avail/3);
+   avail = clamp_t(int, avail, slotsize, total_avail/3);
    num = min_t(int, num, avail / slotsize);
    nfsd_drc_mem_used += num * slotsize;

Leave a Reply

Your email address will not be published. Required fields are marked *