From: "Liam R. Howlett" <liam.howl...@oracle.com>

Make testing work for the slab changes that have come in with the
sheaves work. That means support kmem_cache_args with sheaf_capacity.

[vba...@suse.cz: remove kfree_rcu() support, to be added later]
Signed-off-by: Liam R. Howlett <liam.howl...@oracle.com>
Signed-off-by: Vlastimil Babka <vba...@suse.cz>
---
 tools/include/linux/slab.h   | 41 ++++++++++++++++++++++++++++++++++++++---
 tools/testing/shared/linux.c | 12 ++++++++----
 2 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/tools/include/linux/slab.h b/tools/include/linux/slab.h
index 
c87051e2b26f5a7fee0362697fae067076b8e84d..d1444e79f2685edb828adbce8b3fbb500c0f8844
 100644
--- a/tools/include/linux/slab.h
+++ b/tools/include/linux/slab.h
@@ -23,6 +23,12 @@ enum slab_state {
        FULL
 };
 
+struct kmem_cache_args {
+       unsigned int align;
+       unsigned int sheaf_capacity;
+       void (*ctor)(void *);
+};
+
 static inline void *kzalloc(size_t size, gfp_t gfp)
 {
        return kmalloc(size, gfp | __GFP_ZERO);
@@ -37,9 +43,38 @@ static inline 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, unsigned int size,
-                       unsigned int align, unsigned int flags,
-                       void (*ctor)(void *));
+
+struct kmem_cache *
+__kmem_cache_create_args(const char *name, unsigned int size,
+               struct kmem_cache_args *args, unsigned int flags);
+
+/* If NULL is passed for @args, use this variant with default arguments. */
+static inline struct kmem_cache *
+__kmem_cache_default_args(const char *name, unsigned int size,
+               struct kmem_cache_args *args, unsigned int flags)
+{
+       struct kmem_cache_args kmem_default_args = {};
+
+       return __kmem_cache_create_args(name, size, &kmem_default_args, flags);
+}
+
+static inline struct kmem_cache *
+__kmem_cache_create(const char *name, unsigned int size, unsigned int align,
+               unsigned int flags, void (*ctor)(void *))
+{
+       struct kmem_cache_args kmem_args = {
+               .align  = align,
+               .ctor   = ctor,
+       };
+
+       return __kmem_cache_create_args(name, size, &kmem_args, flags);
+}
+
+#define kmem_cache_create(__name, __object_size, __args, ...)           \
+       _Generic((__args),                                              \
+               struct kmem_cache_args *: __kmem_cache_create_args,     \
+               void *: __kmem_cache_default_args,                      \
+               default: __kmem_cache_create)(__name, __object_size, __args, 
__VA_ARGS__)
 
 void kmem_cache_free_bulk(struct kmem_cache *cachep, size_t size, void **list);
 int kmem_cache_alloc_bulk(struct kmem_cache *cachep, gfp_t gfp, size_t size,
diff --git a/tools/testing/shared/linux.c b/tools/testing/shared/linux.c
index 
0f97fb0d19e19c327aa4843a35b45cc086f4f366..04730abe4dffbd6849b848373ec110b87c81bf33
 100644
--- a/tools/testing/shared/linux.c
+++ b/tools/testing/shared/linux.c
@@ -20,6 +20,7 @@ struct kmem_cache {
        pthread_mutex_t lock;
        unsigned int size;
        unsigned int align;
+       unsigned int sheaf_capacity;
        int nr_objs;
        void *objs;
        void (*ctor)(void *);
@@ -234,23 +235,26 @@ int kmem_cache_alloc_bulk(struct kmem_cache *cachep, 
gfp_t gfp, size_t size,
 }
 
 struct kmem_cache *
-kmem_cache_create(const char *name, unsigned int size, unsigned int align,
-               unsigned int flags, void (*ctor)(void *))
+__kmem_cache_create_args(const char *name, unsigned int size,
+                         struct kmem_cache_args *args,
+                         unsigned int flags)
 {
        struct kmem_cache *ret = malloc(sizeof(*ret));
 
        pthread_mutex_init(&ret->lock, NULL);
        ret->size = size;
-       ret->align = align;
+       ret->align = args->align;
+       ret->sheaf_capacity = args->sheaf_capacity;
        ret->nr_objs = 0;
        ret->nr_allocated = 0;
        ret->nr_tallocated = 0;
        ret->objs = NULL;
-       ret->ctor = ctor;
+       ret->ctor = args->ctor;
        ret->non_kernel = 0;
        ret->exec_callback = false;
        ret->callback = NULL;
        ret->private = NULL;
+
        return ret;
 }
 

-- 
2.51.0


Reply via email to