]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
radix tree test suite: Support aligned kmem caches
authorMatthew Wilcox <willy@infradead.org>
Tue, 27 Nov 2018 20:41:06 +0000 (15:41 -0500)
committerMatthew Wilcox <willy@infradead.org>
Tue, 27 Nov 2018 20:41:06 +0000 (15:41 -0500)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
tools/testing/radix-tree/linux.c
tools/testing/radix-tree/linux/slab.h

index 44a0d1ad4408429d67378bf185773f77b3461ab8..e6384fe2acf0af5af36da9a491874c4c85c5b27c 100644 (file)
@@ -20,6 +20,7 @@ int test_verbose;
 struct kmem_cache {
        pthread_mutex_t lock;
        int size;
+       int align;
        int nr_objs;
        void *objs;
        void (*ctor)(void *);
@@ -27,29 +28,33 @@ struct kmem_cache {
 
 void *kmem_cache_alloc(struct kmem_cache *cachep, int flags)
 {
-       struct radix_tree_node *node;
+       void *p;
 
        if (!(flags & __GFP_DIRECT_RECLAIM))
                return NULL;
 
        pthread_mutex_lock(&cachep->lock);
        if (cachep->nr_objs) {
+               struct radix_tree_node *node = cachep->objs;
                cachep->nr_objs--;
-               node = cachep->objs;
                cachep->objs = node->parent;
                pthread_mutex_unlock(&cachep->lock);
                node->parent = NULL;
+               p = node;
        } else {
                pthread_mutex_unlock(&cachep->lock);
-               node = malloc(cachep->size);
+               if (cachep->align)
+                       posix_memalign(&p, cachep->align, cachep->size);
+               else
+                       p = malloc(cachep->size);
                if (cachep->ctor)
-                       cachep->ctor(node);
+                       cachep->ctor(p);
        }
 
        uatomic_inc(&nr_allocated);
        if (kmalloc_verbose)
-               printf("Allocating %p from slab\n", node);
-       return node;
+               printf("Allocating %p from slab\n", p);
+       return p;
 }
 
 void kmem_cache_free(struct kmem_cache *cachep, void *objp)
@@ -59,7 +64,7 @@ void kmem_cache_free(struct kmem_cache *cachep, void *objp)
        if (kmalloc_verbose)
                printf("Freeing %p to slab\n", objp);
        pthread_mutex_lock(&cachep->lock);
-       if (cachep->nr_objs > 10) {
+       if (cachep->nr_objs > 10 || cachep->align) {
                memset(objp, POISON_FREE, cachep->size);
                free(objp);
        } else {
@@ -98,13 +103,14 @@ void kfree(void *p)
 }
 
 struct kmem_cache *
-kmem_cache_create(const char *name, size_t size, size_t offset,
+kmem_cache_create(const char *name, unsigned int size, unsigned int align,
        unsigned long flags, void (*ctor)(void *))
 {
        struct kmem_cache *ret = malloc(sizeof(*ret));
 
        pthread_mutex_init(&ret->lock, NULL);
        ret->size = size;
+       ret->align = align;
        ret->nr_objs = 0;
        ret->objs = NULL;
        ret->ctor = ctor;
index a037def0dec637ef9a38b034de5ac1fed4d32d8e..e749e68c1d1c9017997dfc4e9f3d51c8182b6d75 100644 (file)
@@ -21,7 +21,7 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, int flags);
 void kmem_cache_free(struct kmem_cache *cachep, void *objp);
 
 struct kmem_cache *
-kmem_cache_create(const char *name, size_t size, size_t offset,
+kmem_cache_create(const char *name, unsigned int size, unsigned int align,
        unsigned long flags, void (*ctor)(void *));
 
 #endif         /* SLAB_H */