1 // SPDX-License-Identifier: GPL-2.0
10 #include <linux/poison.h>
11 #include <linux/slab.h>
12 #include <linux/radix-tree.h>
13 #include <urcu/uatomic.h>
28 void *kmem_cache_alloc(struct kmem_cache *cachep, int flags)
30 struct radix_tree_node *node;
32 if (flags & __GFP_NOWARN)
35 pthread_mutex_lock(&cachep->lock);
36 if (cachep->nr_objs) {
39 cachep->objs = node->parent;
40 pthread_mutex_unlock(&cachep->lock);
43 pthread_mutex_unlock(&cachep->lock);
44 node = malloc(cachep->size);
49 uatomic_inc(&nr_allocated);
51 printf("Allocating %p from slab\n", node);
55 void kmem_cache_free(struct kmem_cache *cachep, void *objp)
58 uatomic_dec(&nr_allocated);
60 printf("Freeing %p to slab\n", objp);
61 pthread_mutex_lock(&cachep->lock);
62 if (cachep->nr_objs > 10) {
63 memset(objp, POISON_FREE, cachep->size);
66 struct radix_tree_node *node = objp;
68 node->parent = cachep->objs;
71 pthread_mutex_unlock(&cachep->lock);
74 void *kmalloc(size_t size, gfp_t gfp)
76 void *ret = malloc(size);
77 uatomic_inc(&nr_allocated);
79 printf("Allocating %p from malloc\n", ret);
87 uatomic_dec(&nr_allocated);
89 printf("Freeing %p to malloc\n", p);
94 kmem_cache_create(const char *name, size_t size, size_t offset,
95 unsigned long flags, void (*ctor)(void *))
97 struct kmem_cache *ret = malloc(sizeof(*ret));
99 pthread_mutex_init(&ret->lock, NULL);