mirror of
https://github.com/torvalds/linux.git
synced 2026-10-23 15:32:04 +02:00
rb_add_augmented_cached() links the new node and then calls
->propagate() from the parent up to the root to bring the augmented
data of the ancestors up to date. It marks that as "suboptimal": every
augmented user that open-codes its insertion (interval trees, vmalloc,
drm_mm, gpu buddy, ...) instead folds the new node's value into each
ancestor while walking down, which touches no sibling and needs no
second pass. ->propagate() has to read both children of every
ancestor until it finds one whose value did not change.
Add a ->merge() callback to struct rb_augment_callbacks that folds the
augmented data of a node being inserted into one of its future
ancestors, and use it on the descent. RB_DECLARE_CALLBACKS() derives
it from the RB_AUG() list, so every user of the template gets it for
free, and sched/eevdf, the only caller of the helper, needs no change.
The new node's augmented data must describe the node alone before the
call. That was already required, since ->propagate() read it, and
sched/eevdf sets it up that way.
Measured with rbtree_test's cached augmented test switched to
rb_add_augmented_cached() (next patch), nnodes cached insert+delete,
median of 5 runs, for reference also the open-coded descent used by
augmented test 1. Raspberry Pi 4 Model B (Cortex-A72, 1.8 GHz), arch
timer ticks (54 MHz):
nnodes open-coded before after
100 459 500 442 (-11.6%)
10000 182046 186144 180208 (-3.2%)
100000 5533679 5711647
|
||
|---|---|---|
| .. | ||
| irq | ||
| kho | ||
| real-time | ||
| wrappers | ||
| asm-annotations.rst | ||
| assoc_array.rst | ||
| boot-time-mm.rst | ||
| cachetlb.rst | ||
| cgroup.rst | ||
| circular-buffers.rst | ||
| cleanup.rst | ||
| cpu_hotplug.rst | ||
| debug-objects.rst | ||
| debugging-via-ohci1394.rst | ||
| dma-api-howto.rst | ||
| dma-api.rst | ||
| dma-attributes.rst | ||
| dma-isa-lpc.rst | ||
| entry.rst | ||
| errseq.rst | ||
| floating-point.rst | ||
| folio_queue.rst | ||
| genalloc.rst | ||
| generic-radix-tree.rst | ||
| genericirq.rst | ||
| gfp_mask-from-fs-io.rst | ||
| housekeeping.rst | ||
| idr.rst | ||
| index.rst | ||
| kernel-api.rst | ||
| kobject.rst | ||
| kref.rst | ||
| librs.rst | ||
| list.rst | ||
| liveupdate.rst | ||
| local_ops.rst | ||
| maple_tree.rst | ||
| memory-allocation.rst | ||
| memory-hotplug.rst | ||
| min_heap.rst | ||
| mm-api.rst | ||
| netlink.rst | ||
| packing.rst | ||
| padata.rst | ||
| parser.rst | ||
| pin_user_pages.rst | ||
| printk-basics.rst | ||
| printk-formats.rst | ||
| printk-index.rst | ||
| protection-keys.rst | ||
| rbtree.rst | ||
| refcount-vs-atomic.rst | ||
| SMP.rst | ||
| swiotlb.rst | ||
| symbol-namespaces.rst | ||
| this_cpu_ops.rst | ||
| timekeeping.rst | ||
| tracepoint.rst | ||
| unaligned-memory-access.rst | ||
| union_find.rst | ||
| watch_queue.rst | ||
| workqueue.rst | ||
| xarray.rst | ||