Re: [PATCH v2] nfsd: more robust allocation failure handling in nfsd_reply_cache_init

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Oct 26, 2016 at 07:26:40AM -0400, Jeff Layton wrote:
> 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.

Thanks, applying for 4.10.--b.

> 
> Reported-by: Olaf Hering <olaf@xxxxxxxxx>
> Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
> Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
> ---
>  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 54cde9a5864e..d6b97b424ad1 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>
> @@ -174,8 +175,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);
> @@ -204,7 +209,7 @@ void nfsd_reply_cache_shutdown(void)
>  		}
>  	}
>  
> -	kfree (drc_hashtbl);
> +	kvfree(drc_hashtbl);
>  	drc_hashtbl = NULL;
>  	drc_hashsize = 0;
>  
> -- 
> 2.7.4
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux