[Devel] [PATCH RHEL7 COMMIT] ms/nfsd: more robust allocation failure handling in nfsd_reply_cache_init
Konstantin Khorenko
khorenko at virtuozzo.com
Wed May 16 11:18:12 MSK 2018
The commit is pushed to "branch-rh7-3.10.0-693.21.1.vz7.47.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-693.21.1.vz7.47.6
------>
commit ae090f2a94c81548c6bb456eb9fd888b4a8e7d74
Author: Jeff Layton <jlayton at redhat.com>
Date: Wed May 16 11:18:12 2018 +0300
ms/nfsd: more robust allocation failure handling in nfsd_reply_cache_init
Currently, we try to allocate the cache as a single, large chunk, which
can fail if no big chunks of memory are available. We _do_ try to size
it according to the amount of memory in the box, but if the server is
started well after boot time, then the allocation can fail due to memory
fragmentation.
Fall back to doing a vzalloc if the kcalloc fails, and switch the
shutdown code to do a kvfree to handle freeing correctly.
Reported-by: Olaf Hering <olaf at aepfle.de>
Cc: Linus Torvalds <torvalds at linux-foundation.org>
Signed-off-by: Jeff Layton <jlayton at redhat.com>
Signed-off-by: J. Bruce Fields <bfields at redhat.com>
ms commit 8f97514b423a0983e4c600099882a9c6613142d2
https://jira.sw.ru/browse/PSBM-84234
Signed-off-by: Oleg Babin <obabin at virtuozzo.com>
===========================================
Patchset description:
nfsd: use kvzalloc() to allocate memory for drc_hashtbl
The size of drc_hashtbl depends on totalram_pages and totalhigh_pages
mm variables and limited to 96k which means 5th memory order.
Use kvzalloc() for drc_hashtbl allocation to fallback to vmalloc()
in case of high order page is not available at the moment.
https://jira.sw.ru/browse/PSBM-84234
v2: Make use of the mainstream patch which partially fixes the problem.
Jeff Layton (1):
nfsd: more robust allocation failure handling in nfsd_reply_cache_init
Oleg Babin (1):
nfsd: use kvzalloc() to allocate memory for drc_hashtbl
---
fs/nfsd/nfscache.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c
index a4fa08e6acd3..b5c25eaeaae2 100644
--- a/fs/nfsd/nfscache.c
+++ b/fs/nfsd/nfscache.c
@@ -9,6 +9,7 @@
*/
#include <linux/slab.h>
+#include <linux/vmalloc.h>
#include <linux/sunrpc/addr.h>
#include <linux/highmem.h>
#include <linux/log2.h>
@@ -178,8 +179,12 @@ int nfsd_reply_cache_init(void)
goto out_nomem;
drc_hashtbl = kcalloc(hashsize, sizeof(*drc_hashtbl), GFP_KERNEL);
- if (!drc_hashtbl)
- goto out_nomem;
+ if (!drc_hashtbl) {
+ drc_hashtbl = vzalloc(hashsize * sizeof(*drc_hashtbl));
+ if (!drc_hashtbl)
+ goto out_nomem;
+ }
+
for (i = 0; i < hashsize; i++) {
INIT_LIST_HEAD(&drc_hashtbl[i].lru_head);
spin_lock_init(&drc_hashtbl[i].cache_lock);
@@ -209,7 +214,7 @@ void nfsd_reply_cache_shutdown(void)
}
}
- kfree (drc_hashtbl);
+ kvfree(drc_hashtbl);
drc_hashtbl = NULL;
drc_hashsize = 0;
More information about the Devel
mailing list