root/tools/lib/slab.c
// SPDX-License-Identifier: GPL-2.0

#include <stdio.h>
#include <string.h>

#include <urcu/uatomic.h>
#include <linux/slab.h>
#include <malloc.h>
#include <linux/gfp.h>

int kmalloc_nr_allocated;
int kmalloc_verbose;

void *kmalloc(size_t size, gfp_t gfp)
{
        void *ret;

        if (!(gfp & __GFP_DIRECT_RECLAIM))
                return NULL;

        ret = malloc(size);
        uatomic_inc(&kmalloc_nr_allocated);
        if (kmalloc_verbose)
                printf("Allocating %p from malloc\n", ret);
        if (gfp & __GFP_ZERO)
                memset(ret, 0, size);
        return ret;
}

void kfree(void *p)
{
        if (!p)
                return;
        uatomic_dec(&kmalloc_nr_allocated);
        if (kmalloc_verbose)
                printf("Freeing %p to malloc\n", p);
        free(p);
}

void *kmalloc_array(size_t n, size_t size, gfp_t gfp)
{
        void *ret;

        if (!(gfp & __GFP_DIRECT_RECLAIM))
                return NULL;

        ret = calloc(n, size);
        uatomic_inc(&kmalloc_nr_allocated);
        if (kmalloc_verbose)
                printf("Allocating %p from calloc\n", ret);
        if (gfp & __GFP_ZERO)
                memset(ret, 0, n * size);
        return ret;
}