slab.c 981 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <urcu/uatomic.h>
  5. #include <linux/slab.h>
  6. #include <malloc.h>
  7. #include <linux/gfp.h>
  8. int kmalloc_nr_allocated;
  9. int kmalloc_verbose;
  10. void *kmalloc(size_t size, gfp_t gfp)
  11. {
  12. void *ret;
  13. if (!(gfp & __GFP_DIRECT_RECLAIM))
  14. return NULL;
  15. ret = malloc(size);
  16. uatomic_inc(&kmalloc_nr_allocated);
  17. if (kmalloc_verbose)
  18. printf("Allocating %p from malloc\n", ret);
  19. if (gfp & __GFP_ZERO)
  20. memset(ret, 0, size);
  21. return ret;
  22. }
  23. void kfree(void *p)
  24. {
  25. if (!p)
  26. return;
  27. uatomic_dec(&kmalloc_nr_allocated);
  28. if (kmalloc_verbose)
  29. printf("Freeing %p to malloc\n", p);
  30. free(p);
  31. }
  32. void *kmalloc_array(size_t n, size_t size, gfp_t gfp)
  33. {
  34. void *ret;
  35. if (!(gfp & __GFP_DIRECT_RECLAIM))
  36. return NULL;
  37. ret = calloc(n, size);
  38. uatomic_inc(&kmalloc_nr_allocated);
  39. if (kmalloc_verbose)
  40. printf("Allocating %p from calloc\n", ret);
  41. if (gfp & __GFP_ZERO)
  42. memset(ret, 0, n * size);
  43. return ret;
  44. }