162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2000-2005 Silicon Graphics, Inc. 462306a36Sopenharmony_ci * All Rights Reserved. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#include "xfs.h" 762306a36Sopenharmony_ci#include "xfs_message.h" 862306a36Sopenharmony_ci#include "xfs_trace.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_civoid * 1162306a36Sopenharmony_cikmem_alloc(size_t size, xfs_km_flags_t flags) 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci int retries = 0; 1462306a36Sopenharmony_ci gfp_t lflags = kmem_flags_convert(flags); 1562306a36Sopenharmony_ci void *ptr; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci trace_kmem_alloc(size, flags, _RET_IP_); 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci do { 2062306a36Sopenharmony_ci ptr = kmalloc(size, lflags); 2162306a36Sopenharmony_ci if (ptr || (flags & KM_MAYFAIL)) 2262306a36Sopenharmony_ci return ptr; 2362306a36Sopenharmony_ci if (!(++retries % 100)) 2462306a36Sopenharmony_ci xfs_err(NULL, 2562306a36Sopenharmony_ci "%s(%u) possible memory allocation deadlock size %u in %s (mode:0x%x)", 2662306a36Sopenharmony_ci current->comm, current->pid, 2762306a36Sopenharmony_ci (unsigned int)size, __func__, lflags); 2862306a36Sopenharmony_ci memalloc_retry_wait(lflags); 2962306a36Sopenharmony_ci } while (1); 3062306a36Sopenharmony_ci} 31