diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2020-04-01 17:35:47 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2020-04-01 17:35:47 -0700 |
commit | 193bc55b6d4e0a7b4ad0216ed9794252bee6436e (patch) | |
tree | d99d1b440d3a143bf986dc10d54d5302e7b5cabf /tools/testing/radix-tree/linux.c | |
parent | 668f1e9267415153e30bea03828c0530874e92e4 (diff) | |
parent | 7e934cf5ace1dceeb804f7493fa28bb697ed3c52 (diff) | |
download | linux-193bc55b6d4e0a7b4ad0216ed9794252bee6436e.tar.bz2 |
Merge tag 'xarray-5.7' of git://git.infradead.org/users/willy/linux-dax
Pull XArray updates from Matthew Wilcox:
- Fix two bugs which affected multi-index entries larger than 2^26
indices
- Fix some documentation
- Remove unused IDA macros
- Add a small optimisation for tiny configurations
- Fix a bug which could cause an RCU walker to terminate a marked walk
early
* tag 'xarray-5.7' of git://git.infradead.org/users/willy/linux-dax:
xarray: Fix early termination of xas_for_each_marked
radix tree test suite: Support kmem_cache alignment
XArray: Optimise xas_sibling() if !CONFIG_XARRAY_MULTI
ida: remove abandoned macros
XArray: Fix incorrect comment in header file
XArray: Fix xas_pause for large multi-index entries
XArray: Fix xa_find_next for large multi-index entries
Diffstat (limited to 'tools/testing/radix-tree/linux.c')
-rw-r--r-- | tools/testing/radix-tree/linux.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/tools/testing/radix-tree/linux.c b/tools/testing/radix-tree/linux.c index 44a0d1ad4408..2d9c59df60de 100644 --- a/tools/testing/radix-tree/linux.c +++ b/tools/testing/radix-tree/linux.c @@ -19,37 +19,44 @@ int test_verbose; struct kmem_cache { pthread_mutex_t lock; - int size; + unsigned int size; + unsigned int align; int nr_objs; void *objs; void (*ctor)(void *); }; -void *kmem_cache_alloc(struct kmem_cache *cachep, int flags) +void *kmem_cache_alloc(struct kmem_cache *cachep, int gfp) { - struct radix_tree_node *node; + void *p; - if (!(flags & __GFP_DIRECT_RECLAIM)) + if (!(gfp & __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); + else if (gfp & __GFP_ZERO) + memset(p, 0, cachep->size); } 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 +66,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 +105,14 @@ void kfree(void *p) } struct kmem_cache * -kmem_cache_create(const char *name, size_t size, size_t offset, - unsigned long flags, void (*ctor)(void *)) +kmem_cache_create(const char *name, unsigned int size, unsigned int align, + unsigned int 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; |