162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <stdio.h>
462306a36Sopenharmony_ci#include <string.h>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <urcu/uatomic.h>
762306a36Sopenharmony_ci#include <linux/slab.h>
862306a36Sopenharmony_ci#include <malloc.h>
962306a36Sopenharmony_ci#include <linux/gfp.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ciint kmalloc_nr_allocated;
1262306a36Sopenharmony_ciint kmalloc_verbose;
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_civoid *kmalloc(size_t size, gfp_t gfp)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	void *ret;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	if (!(gfp & __GFP_DIRECT_RECLAIM))
1962306a36Sopenharmony_ci		return NULL;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	ret = malloc(size);
2262306a36Sopenharmony_ci	uatomic_inc(&kmalloc_nr_allocated);
2362306a36Sopenharmony_ci	if (kmalloc_verbose)
2462306a36Sopenharmony_ci		printf("Allocating %p from malloc\n", ret);
2562306a36Sopenharmony_ci	if (gfp & __GFP_ZERO)
2662306a36Sopenharmony_ci		memset(ret, 0, size);
2762306a36Sopenharmony_ci	return ret;
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_civoid kfree(void *p)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	if (!p)
3362306a36Sopenharmony_ci		return;
3462306a36Sopenharmony_ci	uatomic_dec(&kmalloc_nr_allocated);
3562306a36Sopenharmony_ci	if (kmalloc_verbose)
3662306a36Sopenharmony_ci		printf("Freeing %p to malloc\n", p);
3762306a36Sopenharmony_ci	free(p);
3862306a36Sopenharmony_ci}
39