| // 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; | |
| } |