summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorYiwei Lin <s921975628@gmail.com>2026-10-05 17:32:35 +0800
committerPeter Zijlstra <peterz@infradead.org>2026-10-13 13:51:27 +0200
commitcd047867ee5fc7c47cf9461c8a59c7117de9f680 (patch)
treeb66a13302675dd78807b03d11bb73f2800f0f903 /kernel
parentc2c620f4345c50006af90c37fd104fed8e9dea14 (diff)
downloadlinux-cd047867ee5fc7c47cf9461c8a59c7117de9f680.tar.gz
linux-cd047867ee5fc7c47cf9461c8a59c7117de9f680.zip
rbtree: Update augmented data on the way down in rb_add_augmented_cached()
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 5579444 (-2.3%) x86-64 KVM guest (Intel i7-13800H), cycles: nnodes open-coded before after 100 7657 7622 7059 (-7.4%) 10000 4738075 5075847 4627462 (-8.8%) 100000 75618429 79840335 71324700 (-10.7%) The other rbtree_test numbers are unchanged and the augmented invariant checks still pass on both. Signed-off-by: Yiwei Lin <s921975628@gmail.com> Assisted-by: LLM Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://patch.msgid.link/20261005093236.62702-4-s921975628@gmail.com
Diffstat (limited to 'kernel')
0 files changed, 0 insertions, 0 deletions