nfsd: fix performance-limiting session calculation
commitc54f24e338
upstream. 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:de766e5704
"nfsd: give out fewer session slots as limit approaches" Signed-off-by: J. Bruce Fields <bfields@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
2c648caf63
Коммит
10a68cdf10
|
@ -1514,16 +1514,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;
|
||||
|
||||
spin_lock(&nfsd_drc_lock);
|
||||
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;
|
||||
spin_unlock(&nfsd_drc_lock);
|
||||
|
|
Загрузка…
Ссылка в новой задаче