hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/tools/testing/radix-tree/linux.c
....@@ -19,37 +19,44 @@
1919
2020 struct kmem_cache {
2121 pthread_mutex_t lock;
22
- int size;
22
+ unsigned int size;
23
+ unsigned int align;
2324 int nr_objs;
2425 void *objs;
2526 void (*ctor)(void *);
2627 };
2728
28
-void *kmem_cache_alloc(struct kmem_cache *cachep, int flags)
29
+void *kmem_cache_alloc(struct kmem_cache *cachep, int gfp)
2930 {
30
- struct radix_tree_node *node;
31
+ void *p;
3132
32
- if (!(flags & __GFP_DIRECT_RECLAIM))
33
+ if (!(gfp & __GFP_DIRECT_RECLAIM))
3334 return NULL;
3435
3536 pthread_mutex_lock(&cachep->lock);
3637 if (cachep->nr_objs) {
38
+ struct radix_tree_node *node = cachep->objs;
3739 cachep->nr_objs--;
38
- node = cachep->objs;
3940 cachep->objs = node->parent;
4041 pthread_mutex_unlock(&cachep->lock);
4142 node->parent = NULL;
43
+ p = node;
4244 } else {
4345 pthread_mutex_unlock(&cachep->lock);
44
- node = malloc(cachep->size);
46
+ if (cachep->align)
47
+ posix_memalign(&p, cachep->align, cachep->size);
48
+ else
49
+ p = malloc(cachep->size);
4550 if (cachep->ctor)
46
- cachep->ctor(node);
51
+ cachep->ctor(p);
52
+ else if (gfp & __GFP_ZERO)
53
+ memset(p, 0, cachep->size);
4754 }
4855
4956 uatomic_inc(&nr_allocated);
5057 if (kmalloc_verbose)
51
- printf("Allocating %p from slab\n", node);
52
- return node;
58
+ printf("Allocating %p from slab\n", p);
59
+ return p;
5360 }
5461
5562 void kmem_cache_free(struct kmem_cache *cachep, void *objp)
....@@ -59,7 +66,7 @@
5966 if (kmalloc_verbose)
6067 printf("Freeing %p to slab\n", objp);
6168 pthread_mutex_lock(&cachep->lock);
62
- if (cachep->nr_objs > 10) {
69
+ if (cachep->nr_objs > 10 || cachep->align) {
6370 memset(objp, POISON_FREE, cachep->size);
6471 free(objp);
6572 } else {
....@@ -98,13 +105,14 @@
98105 }
99106
100107 struct kmem_cache *
101
-kmem_cache_create(const char *name, size_t size, size_t offset,
102
- unsigned long flags, void (*ctor)(void *))
108
+kmem_cache_create(const char *name, unsigned int size, unsigned int align,
109
+ unsigned int flags, void (*ctor)(void *))
103110 {
104111 struct kmem_cache *ret = malloc(sizeof(*ret));
105112
106113 pthread_mutex_init(&ret->lock, NULL);
107114 ret->size = size;
115
+ ret->align = align;
108116 ret->nr_objs = 0;
109117 ret->objs = NULL;
110118 ret->ctor = ctor;