| From c6959b0e77c144d483d10c6cb64240dd8ee03e11 Mon Sep 17 00:00:00 2001 |
| From: "J. Bruce Fields" <bfields@redhat.com> |
| Date: Tue, 19 Sep 2017 19:25:41 -0400 |
| Subject: nfsd: give out fewer session slots as limit approaches |
| |
| [ Upstream commit de766e570413bd0484af0b580299b495ada625c3 ] |
| |
| Instead of granting client's full requests until we hit our DRC size |
| limit and then failing CREATE_SESSIONs (and hence mounts) completely, |
| start granting clients smaller slot tables as we approach the limit. |
| |
| The factor chosen here is pretty much arbitrary. |
| |
| Signed-off-by: J. Bruce Fields <bfields@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/nfsd/nfs4state.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c |
| index ba27a5ff8677..eb0f8af5203a 100644 |
| --- a/fs/nfsd/nfs4state.c |
| +++ b/fs/nfsd/nfs4state.c |
| @@ -1396,6 +1396,11 @@ static u32 nfsd4_get_drc_mem(struct nfsd4_channel_attrs *ca) |
| spin_lock(&nfsd_drc_lock); |
| avail = min((unsigned long)NFSD_MAX_MEM_PER_SESSION, |
| nfsd_drc_max_mem - nfsd_drc_mem_used); |
| + /* |
| + * 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); |
| num = min_t(int, num, avail / slotsize); |
| nfsd_drc_mem_used += num * slotsize; |
| spin_unlock(&nfsd_drc_lock); |
| -- |
| 2.20.1 |
| |