xref: /openbmc/linux/fs/xfs/kmem.c (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
10b61f8a4SDave Chinner // SPDX-License-Identifier: GPL-2.0
2c59d87c4SChristoph Hellwig /*
3c59d87c4SChristoph Hellwig  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
4c59d87c4SChristoph Hellwig  * All Rights Reserved.
5c59d87c4SChristoph Hellwig  */
60ad95687SDave Chinner #include "xfs.h"
7c59d87c4SChristoph Hellwig #include "xfs_message.h"
80ad95687SDave Chinner #include "xfs_trace.h"
9c59d87c4SChristoph Hellwig 
10c59d87c4SChristoph Hellwig void *
kmem_alloc(size_t size,xfs_km_flags_t flags)1177ba7877SAl Viro kmem_alloc(size_t size, xfs_km_flags_t flags)
12c59d87c4SChristoph Hellwig {
13c59d87c4SChristoph Hellwig 	int	retries = 0;
14c59d87c4SChristoph Hellwig 	gfp_t	lflags = kmem_flags_convert(flags);
15c59d87c4SChristoph Hellwig 	void	*ptr;
16c59d87c4SChristoph Hellwig 
170ad95687SDave Chinner 	trace_kmem_alloc(size, flags, _RET_IP_);
180ad95687SDave Chinner 
19c59d87c4SChristoph Hellwig 	do {
20c59d87c4SChristoph Hellwig 		ptr = kmalloc(size, lflags);
21707e0ddaSTetsuo Handa 		if (ptr || (flags & KM_MAYFAIL))
22c59d87c4SChristoph Hellwig 			return ptr;
23c59d87c4SChristoph Hellwig 		if (!(++retries % 100))
24c59d87c4SChristoph Hellwig 			xfs_err(NULL,
25847f9f68SEric Sandeen 	"%s(%u) possible memory allocation deadlock size %u in %s (mode:0x%x)",
265bf97b1cSTetsuo Handa 				current->comm, current->pid,
27847f9f68SEric Sandeen 				(unsigned int)size, __func__, lflags);
28*4034247aSNeilBrown 		memalloc_retry_wait(lflags);
29c59d87c4SChristoph Hellwig 	} while (1);
30c59d87c4SChristoph Hellwig }
31