| // SPDX-License-Identifier: GPL-2.0 | 
 | /* | 
 |  * Copyright (c) 2000-2005 Silicon Graphics, Inc. | 
 |  * All Rights Reserved. | 
 |  */ | 
 | #include "xfs.h" | 
 | #include <linux/backing-dev.h> | 
 | #include "xfs_message.h" | 
 | #include "xfs_trace.h" | 
 |  | 
 | void * | 
 | kmem_alloc(size_t size, xfs_km_flags_t flags) | 
 | { | 
 | 	int	retries = 0; | 
 | 	gfp_t	lflags = kmem_flags_convert(flags); | 
 | 	void	*ptr; | 
 |  | 
 | 	trace_kmem_alloc(size, flags, _RET_IP_); | 
 |  | 
 | 	do { | 
 | 		ptr = kmalloc(size, lflags); | 
 | 		if (ptr || (flags & KM_MAYFAIL)) | 
 | 			return ptr; | 
 | 		if (!(++retries % 100)) | 
 | 			xfs_err(NULL, | 
 | 	"%s(%u) possible memory allocation deadlock size %u in %s (mode:0x%x)", | 
 | 				current->comm, current->pid, | 
 | 				(unsigned int)size, __func__, lflags); | 
 | 		congestion_wait(BLK_RW_ASYNC, HZ/50); | 
 | 	} while (1); | 
 | } |