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