diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-03-18 22:26:54 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-03-18 22:26:54 -0400 |
| commit | 814a2bf957739f367cbebfa1b60237387b72d0ee (patch) | |
| tree | 8d65c38d14beb8d6d2dc5b9d7f8dbe63c7cad31a /tools/testing | |
| parent | 237045fc3c67d44088f767dca5a9fa30815eba62 (diff) | |
| parent | f9310b2f9a19b7f16c7b1c1558f8b649b9b933c1 (diff) | |
Merge branch 'akpm' (patches from Andrew)
Merge second patch-bomb from Andrew Morton:
- a couple of hotfixes
- the rest of MM
- a new timer slack control in procfs
- a couple of procfs fixes
- a few misc things
- some printk tweaks
- lib/ updates, notably to radix-tree.
- add my and Nick Piggin's old userspace radix-tree test harness to
tools/testing/radix-tree/. Matthew said it was a godsend during the
radix-tree work he did.
- a few code-size improvements, switching to __always_inline where gcc
screwed up.
- partially implement character sets in sscanf
* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (118 commits)
sscanf: implement basic character sets
lib/bug.c: use common WARN helper
param: convert some "on"/"off" users to strtobool
lib: add "on"/"off" support to kstrtobool
lib: update single-char callers of strtobool()
lib: move strtobool() to kstrtobool()
include/linux/unaligned: force inlining of byteswap operations
include/uapi/linux/byteorder, swab: force inlining of some byteswap operations
include/asm-generic/atomic-long.h: force inlining of some atomic_long operations
usb: common: convert to use match_string() helper
ide: hpt366: convert to use match_string() helper
ata: hpt366: convert to use match_string() helper
power: ab8500: convert to use match_string() helper
power: charger_manager: convert to use match_string() helper
drm/edid: convert to use match_string() helper
pinctrl: convert to use match_string() helper
device property: convert to use match_string() helper
lib/string: introduce match_string() helper
radix-tree tests: add test for radix_tree_iter_next
radix-tree tests: add regression3 test
...
Diffstat (limited to 'tools/testing')
37 files changed, 2231 insertions, 0 deletions
diff --git a/tools/testing/radix-tree/.gitignore b/tools/testing/radix-tree/.gitignore new file mode 100644 index 000000000000..11d888ca6a92 --- /dev/null +++ b/tools/testing/radix-tree/.gitignore | |||
| @@ -0,0 +1,2 @@ | |||
| 1 | main | ||
| 2 | radix-tree.c | ||
diff --git a/tools/testing/radix-tree/Makefile b/tools/testing/radix-tree/Makefile new file mode 100644 index 000000000000..604212db9d4b --- /dev/null +++ b/tools/testing/radix-tree/Makefile | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | |||
| 2 | CFLAGS += -I. -g -Wall -D_LGPL_SOURCE | ||
| 3 | LDFLAGS += -lpthread -lurcu | ||
| 4 | TARGETS = main | ||
| 5 | OFILES = main.o radix-tree.o linux.o test.o tag_check.o find_next_bit.o \ | ||
| 6 | regression1.o regression2.o regression3.o | ||
| 7 | |||
| 8 | targets: $(TARGETS) | ||
| 9 | |||
| 10 | main: $(OFILES) | ||
| 11 | $(CC) $(CFLAGS) $(LDFLAGS) $(OFILES) -o main | ||
| 12 | |||
| 13 | clean: | ||
| 14 | $(RM) -f $(TARGETS) *.o radix-tree.c | ||
| 15 | |||
| 16 | $(OFILES): *.h */*.h | ||
| 17 | |||
| 18 | radix-tree.c: ../../../lib/radix-tree.c | ||
| 19 | sed -e 's/^static //' -e 's/__always_inline //' -e 's/inline //' < $< > $@ | ||
diff --git a/tools/testing/radix-tree/find_next_bit.c b/tools/testing/radix-tree/find_next_bit.c new file mode 100644 index 000000000000..d1c2178bb2d4 --- /dev/null +++ b/tools/testing/radix-tree/find_next_bit.c | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | /* find_next_bit.c: fallback find next bit implementation | ||
| 2 | * | ||
| 3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
| 4 | * Written by David Howells (dhowells@redhat.com) | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License | ||
| 8 | * as published by the Free Software Foundation; either version | ||
| 9 | * 2 of the License, or (at your option) any later version. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/types.h> | ||
| 13 | #include <linux/bitops.h> | ||
| 14 | |||
| 15 | #define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) | ||
| 16 | |||
| 17 | /* | ||
| 18 | * Find the next set bit in a memory region. | ||
| 19 | */ | ||
| 20 | unsigned long find_next_bit(const unsigned long *addr, unsigned long size, | ||
| 21 | unsigned long offset) | ||
| 22 | { | ||
| 23 | const unsigned long *p = addr + BITOP_WORD(offset); | ||
| 24 | unsigned long result = offset & ~(BITS_PER_LONG-1); | ||
| 25 | unsigned long tmp; | ||
| 26 | |||
| 27 | if (offset >= size) | ||
| 28 | return size; | ||
| 29 | size -= result; | ||
| 30 | offset %= BITS_PER_LONG; | ||
| 31 | if (offset) { | ||
| 32 | tmp = *(p++); | ||
| 33 | tmp &= (~0UL << offset); | ||
| 34 | if (size < BITS_PER_LONG) | ||
| 35 | goto found_first; | ||
| 36 | if (tmp) | ||
| 37 | goto found_middle; | ||
| 38 | size -= BITS_PER_LONG; | ||
| 39 | result += BITS_PER_LONG; | ||
| 40 | } | ||
| 41 | while (size & ~(BITS_PER_LONG-1)) { | ||
| 42 | if ((tmp = *(p++))) | ||
| 43 | goto found_middle; | ||
| 44 | result += BITS_PER_LONG; | ||
| 45 | size -= BITS_PER_LONG; | ||
| 46 | } | ||
| 47 | if (!size) | ||
| 48 | return result; | ||
| 49 | tmp = *p; | ||
| 50 | |||
| 51 | found_first: | ||
| 52 | tmp &= (~0UL >> (BITS_PER_LONG - size)); | ||
| 53 | if (tmp == 0UL) /* Are any bits set? */ | ||
| 54 | return result + size; /* Nope. */ | ||
| 55 | found_middle: | ||
| 56 | return result + __ffs(tmp); | ||
| 57 | } | ||
diff --git a/tools/testing/radix-tree/linux.c b/tools/testing/radix-tree/linux.c new file mode 100644 index 000000000000..154823737b20 --- /dev/null +++ b/tools/testing/radix-tree/linux.c | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | #include <stdlib.h> | ||
| 2 | #include <string.h> | ||
| 3 | #include <malloc.h> | ||
| 4 | #include <unistd.h> | ||
| 5 | #include <assert.h> | ||
| 6 | |||
| 7 | #include <linux/mempool.h> | ||
| 8 | #include <linux/slab.h> | ||
| 9 | #include <urcu/uatomic.h> | ||
| 10 | |||
| 11 | int nr_allocated; | ||
| 12 | |||
| 13 | void *mempool_alloc(mempool_t *pool, int gfp_mask) | ||
| 14 | { | ||
| 15 | return pool->alloc(gfp_mask, pool->data); | ||
| 16 | } | ||
| 17 | |||
| 18 | void mempool_free(void *element, mempool_t *pool) | ||
| 19 | { | ||
| 20 | pool->free(element, pool->data); | ||
| 21 | } | ||
| 22 | |||
| 23 | mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, | ||
| 24 | mempool_free_t *free_fn, void *pool_data) | ||
| 25 | { | ||
| 26 | mempool_t *ret = malloc(sizeof(*ret)); | ||
| 27 | |||
| 28 | ret->alloc = alloc_fn; | ||
| 29 | ret->free = free_fn; | ||
| 30 | ret->data = pool_data; | ||
| 31 | return ret; | ||
| 32 | } | ||
| 33 | |||
| 34 | void *kmem_cache_alloc(struct kmem_cache *cachep, int flags) | ||
| 35 | { | ||
| 36 | void *ret = malloc(cachep->size); | ||
| 37 | if (cachep->ctor) | ||
| 38 | cachep->ctor(ret); | ||
| 39 | uatomic_inc(&nr_allocated); | ||
| 40 | return ret; | ||
| 41 | } | ||
| 42 | |||
| 43 | void kmem_cache_free(struct kmem_cache *cachep, void *objp) | ||
| 44 | { | ||
| 45 | assert(objp); | ||
| 46 | uatomic_dec(&nr_allocated); | ||
| 47 | memset(objp, 0, cachep->size); | ||
| 48 | free(objp); | ||
| 49 | } | ||
| 50 | |||
| 51 | struct kmem_cache * | ||
| 52 | kmem_cache_create(const char *name, size_t size, size_t offset, | ||
| 53 | unsigned long flags, void (*ctor)(void *)) | ||
| 54 | { | ||
| 55 | struct kmem_cache *ret = malloc(sizeof(*ret)); | ||
| 56 | |||
