Michel Lespinasse
fff3fd8a12
rbtree: add prio tree and interval tree tests
...
Patch 1 implements support for interval trees, on top of the augmented
rbtree API. It also adds synthetic tests to compare the performance of
interval trees vs prio trees. Short answers is that interval trees are
slightly faster (~25%) on insert/erase, and much faster (~2.4 - 3x)
on search. It is debatable how realistic the synthetic test is, and I have
not made such measurements yet, but my impression is that interval trees
would still come out faster.
Patch 2 uses a preprocessor template to make the interval tree generic,
and uses it as a replacement for the vma prio_tree.
Patch 3 takes the other prio_tree user, kmemleak, and converts it to use
a basic rbtree. We don't actually need the augmented rbtree support here
because the intervals are always non-overlapping.
Patch 4 removes the now-unused prio tree library.
Patch 5 proposes an additional optimization to rb_erase_augmented, now
providing it as an inline function so that the augmented callbacks can be
inlined in. This provides an additional 5-10% performance improvement
for the interval tree insert/erase benchmark. There is a maintainance cost
as it exposes augmented rbtree users to some of the rbtree library internals;
however I think this cost shouldn't be too high as I expect the augmented
rbtree will always have much less users than the base rbtree.
I should probably add a quick summary of why I think it makes sense to
replace prio trees with augmented rbtree based interval trees now. One of
the drivers is that we need augmented rbtrees for Rik's vma gap finding
code, and once you have them, it just makes sense to use them for interval
trees as well, as this is the simpler and more well known algorithm. prio
trees, in comparison, seem *too* clever: they impose an additional 'heap'
constraint on the tree, which they use to guarantee a faster worst-case
complexity of O(k+log N) for stabbing queries in a well-balanced prio
tree, vs O(k*log N) for interval trees (where k=number of matches,
N=number of intervals). Now this sounds great, but in practice prio trees
don't realize this theorical benefit. First, the additional constraint
makes them harder to update, so that the kernel implementation has to
simplify things by balancing them like a radix tree, which is not always
ideal. Second, the fact that there are both index and heap properties
makes both tree manipulation and search more complex, which results in a
higher multiplicative time constant. As it turns out, the simple interval
tree algorithm ends up running faster than the more clever prio tree.
This patch:
Add two test modules:
- prio_tree_test measures the performance of lib/prio_tree.c, both for
insertion/removal and for stabbing searches
- interval_tree_test measures the performance of a library of equivalent
functionality, built using the augmented rbtree support.
In order to support the second test module, lib/interval_tree.c is
introduced. It is kept separate from the interval_tree_test main file
for two reasons: first we don't want to provide an unfair advantage
over prio_tree_test by having everything in a single compilation unit,
and second there is the possibility that the interval tree functionality
could get some non-test users in kernel over time.
Signed-off-by: Michel Lespinasse <walken@google.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Hillf Danton <dhillf@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2012-10-09 16:22:39 +09:00
..
lzo
mpi
Remove unused code from MPI library
2012-05-26 11:51:03 +10:00
raid6
lib/raid6: fix sparse warnings in recovery functions
2012-05-28 14:10:22 +10:00
reed_solomon
xz
zlib_deflate
zlib_inflate
.gitignore
argv_split.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
atomic64.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
atomic64_test.c
atomic64_test: simplify the #ifdef for atomic64_dec_if_positive() test
2012-07-30 17:25:16 -07:00
audit.c
average.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
bcd.c
usb/core: use bin2bcd() for bcdDevice in RH
2012-09-10 11:13:16 -07:00
bch.c
bitmap.c
lib/bitmap.c: fix documentation for scnprintf() functions
2012-05-29 16:22:32 -07:00
bitrev.c
bsearch.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
btree.c
btree: catch NULL value before it does harm
2012-06-07 14:43:55 -07:00
bug.c
bugs, x86: Fix printk levels for panic, softlockups and stack dumps
2012-01-26 21:28:45 +01:00
bust_spinlocks.c
check_signature.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
checksum.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
clz_tab.c
lib: Fix multiple definitions of clz_tab
2012-02-02 10:34:23 +11:00
cmdline.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
cordic.c
Docs: wording: functions -> algorithm
2011-10-29 21:20:22 +02:00
cpu-notifier-error-inject.c
cpu: rewrite cpu-notifier-error-inject module
2012-07-30 17:25:22 -07:00
cpu_rmap.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
cpumask.c
lib/cpumask.c: remove __any_online_cpu()
2012-03-28 17:14:35 -07:00
crc-ccitt.c
crc-itu-t.c
crc-t10dif.c
crc7.c
crc8.c
crc16.c
crc32.c
sections: fix const sections for crc32 table
2012-10-06 03:04:46 +09:00
crc32defs.h
crc32: select an algorithm via Kconfig
2012-03-23 16:58:38 -07:00
ctype.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
debug_locks.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
debugobjects.c
debugobjects: Fill_pool() returns void now
2012-04-18 13:38:48 +02:00
dec_and_lock.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
decompress.c
lib/decompress.c add __init to decompress_method and data
2012-10-06 03:05:32 +09:00
decompress_bunzip2.c
decompress_bunzip2: remove invalid vi modeline
2011-12-06 10:00:05 +01:00
decompress_inflate.c
decompress_unlzma.c
treewide: Fix comment and string typo 'bufer'
2011-12-06 09:53:40 +01:00
decompress_unlzo.c
unlzo: fix input buffer free
2012-01-12 20:13:13 -08:00
decompress_unxz.c
devres.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
digsig.c
digsig: add hash size comparision on signature verification
2012-09-13 09:13:02 +08:00
div64.c
lib: correct link to the original source for div64_u64
2012-06-28 11:51:39 +02:00
dma-debug.c
dma-debug: Remove local BUS_NOTIFY_UNBOUND_DRIVER define
2012-10-02 12:10:27 +02:00
dump_stack.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
dynamic_debug.c
device and dynamic_debug: Use dev_vprintk_emit and dev_printk_emit
2012-09-17 06:10:05 -07:00
dynamic_queue_limits.c
bql: Avoid possible inconsistent calculation.
2012-05-31 18:18:17 -04:00
extable.c
fault-inject.c
fault-inject: avoid call to random32() if fault injection is disabled
2012-06-20 14:39:36 -07:00
fdt.c
of/lib: Allow scripts/dtc/libfdt to be used from kernel code
2012-07-23 13:54:52 +01:00
fdt_ro.c
of/lib: Allow scripts/dtc/libfdt to be used from kernel code
2012-07-23 13:54:52 +01:00
fdt_rw.c
of/lib: Allow scripts/dtc/libfdt to be used from kernel code
2012-07-23 13:54:52 +01:00
fdt_strerror.c
of/lib: Allow scripts/dtc/libfdt to be used from kernel code
2012-07-23 13:54:52 +01:00
fdt_sw.c
of/lib: Allow scripts/dtc/libfdt to be used from kernel code
2012-07-23 13:54:52 +01:00
fdt_wip.c
of/lib: Allow scripts/dtc/libfdt to be used from kernel code
2012-07-23 13:54:52 +01:00
find_last_bit.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
find_next_bit.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
flex_array.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
flex_proportions.c
lib/flex_proportions.c: fix corruption of denominator in flexible proportions
2012-09-25 08:59:21 -07:00
gcd.c
lib/gcd.c: prevent possible div by 0
2012-10-06 03:04:57 +09:00
gen_crc32table.c
sections: fix const sections for crc32 table
2012-10-06 03:04:46 +09:00
genalloc.c
genalloc: make it possible to use a custom allocation algorithm
2012-10-06 03:04:57 +09:00
halfmd4.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
hexdump.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
hweight.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
idr.c
idr: rename MAX_LEVEL to MAX_IDR_LEVEL
2012-10-06 03:04:56 +09:00
inflate.c
int_sqrt.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
interval_tree.c
rbtree: add prio tree and interval tree tests
2012-10-09 16:22:39 +09:00
interval_tree_test_main.c
rbtree: add prio tree and interval tree tests
2012-10-09 16:22:39 +09:00
iomap.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
iomap_copy.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
iommu-helper.c
The following text was taken from the original review request:
2012-03-24 10:24:31 -07:00
ioremap.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
irq_regs.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
is_single_threaded.c
jedec_ddr_data.c
ddr: add LPDDR2 data from JESD209-2
2012-05-02 00:04:06 -07:00
kasprintf.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
Kconfig
Merge branch 'akpm' (Andrew's patch-bomb)
2012-07-30 17:25:34 -07:00
Kconfig.debug
rbtree: add prio tree and interval tree tests
2012-10-09 16:22:39 +09:00
Kconfig.kgdb
Kconfig.kmemcheck
klist.c
Revert "driver core: check start node in klist_iter_init_node"
2012-04-19 19:17:30 -07:00
kobject.c
kobject: fix the uncorrect comment
2012-05-07 16:51:19 -07:00
kobject_uevent.c
netlink: hide struct module parameter in netlink_kernel_create
2012-09-08 18:46:30 -04:00
kstrtox.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
kstrtox.h
lib/kstrtox: common code between kstrto*() and simple_strto*() functions
2011-10-31 17:30:56 -07:00
lcm.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
libcrc32c.c
list_debug.c
rcu: Fix broken strings in RCU's source code.
2012-07-06 06:01:49 -07:00
list_sort.c
llist.c
Disintegrate and delete asm/system.h
2012-03-28 15:58:21 -07:00
locking-selftest-hardirq.h
locking-selftest-mutex.h
locking-selftest-rlock-hardirq.h
locking-selftest-rlock-softirq.h
locking-selftest-rlock.h
locking-selftest-rsem.h
locking-selftest-softirq.h
locking-selftest-spin-hardirq.h
locking-selftest-spin-softirq.h
locking-selftest-spin.h
locking-selftest-wlock-hardirq.h
locking-selftest-wlock-softirq.h
locking-selftest-wlock.h
locking-selftest-wsem.h
locking-selftest.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
lru_cache.c
Makefile
rbtree: add prio tree and interval tree tests
2012-10-09 16:22:39 +09:00
md5.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
memory-notifier-error-inject.c
memory: memory notifier error injection module
2012-07-30 17:25:22 -07:00
memweight.c
string: introduce memweight()
2012-07-30 17:25:16 -07:00
nlattr.c
netlink: add minlen validation for the new signed types
2012-08-30 13:11:46 -04:00
notifier-error-inject.c
fault-injection: notifier error injection
2012-07-30 17:25:22 -07:00
notifier-error-inject.h
fault-injection: notifier error injection
2012-07-30 17:25:22 -07:00
parser.c
lib/parser.c: avoid overflow in match_number()
2012-10-06 03:04:56 +09:00
pci_iomap.c
lib: add NO_GENERIC_PCI_IOPORT_MAP
2012-01-31 23:19:47 +02:00
percpu_counter.c
switch the protection of percpu_counter list to spinlock
2012-07-31 09:28:31 +04:00
plist.c
lib/plist.c: make plist test announcements KERN_DEBUG
2012-10-06 03:04:58 +09:00
pm-notifier-error-inject.c
PM: PM notifier error injection module
2012-07-30 17:25:22 -07:00
prio_heap.c
prio_tree.c
rbtree: add prio tree and interval tree tests
2012-10-09 16:22:39 +09:00
prio_tree_test.c
rbtree: add prio tree and interval tree tests
2012-10-09 16:22:39 +09:00
proportions.c
pSeries-reconfig-notifier-error-inject.c
powerpc: pSeries reconfig notifier error injection module
2012-07-30 17:25:22 -07:00
radix-tree.c
radix-tree: fix contiguous iterator
2012-06-05 10:46:40 -07:00
random32.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
ratelimit.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
rational.c
lib: Change mail address of Oskar Schirmer
2012-05-17 15:18:37 +02:00
rbtree.c
rbtree: remove prior augmented rbtree implementation
2012-10-09 16:22:38 +09:00
rbtree_test.c
rbtree: add RB_DECLARE_CALLBACKS() macro
2012-10-09 16:22:38 +09:00
reciprocal_div.c
sch_red: Adaptative RED AQM
2011-12-08 19:52:43 -05:00
rwsem-spinlock.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
rwsem.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
scatterlist.c
scatterlist: atomic sg_mapping_iter() no longer needs disabled IRQs
2012-10-06 03:04:58 +09:00
sha1.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
show_mem.c
smp_processor_id.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
sort.c
spinlock_debug.c
lib/spinlock_debug: avoid livelock in do_raw_spin_lock()
2012-10-06 03:04:57 +09:00
stmp_device.c
lib: add support for stmp-style devices
2012-04-20 23:27:08 +02:00
string.c
The following text was taken from the original review request:
2012-03-24 10:24:31 -07:00
string_helpers.c
lib/string_helpers.c: make arrays static
2012-05-29 16:22:32 -07:00
strncpy_from_user.c
word-at-a-time: make the interfaces truly generic
2012-05-26 11:33:40 -07:00
strnlen_user.c
lib: Fix generic strnlen_user for 32-bit big-endian machines
2012-05-27 20:59:46 -07:00
swiotlb.c
swiotlb: add the late swiotlb initialization function with iotlb memory
2012-08-21 14:47:25 -04:00
syscall.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
test-kstrtox.c
lib/test-kstrtox.c: mark const init data with __initconst instead of __initdata
2012-05-29 16:22:32 -07:00
textsearch.c
timerqueue.c
The following text was taken from the original review request:
2012-03-24 10:24:31 -07:00
ts_bm.c
ts_fsm.c
ts_kmp.c
uuid.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
vsprintf.c
lib/vsprintf.c: improve standard conformance of sscanf()
2012-10-06 03:04:58 +09:00