[PATCH v2 0/4] rbtree: declare augmented callbacks per field, fix rb_add_augmented_cached() descent
From: Yiwei Lin <hidden>
Date: 2026-09-29 15:24:50
Also in:
linux-doc, lkml
rbtree_test open-codes the insertion of every flavour of rbtree it exercises, while the generic rb_add*() helpers have been the way most users insert nodes for years now. Patches 1 and 4 make the test use the helpers where the helper does exactly what the test did, so the helpers themselves get covered. Patch 2 is Peter's RB_AUG() rework from the v1 thread: each augmented field is described by its per-node value, its aggregate member and how two aggregates combine, and the template derives every callback from that, per field and in a local; RB_DECLARE_CALLBACKS_MULTI() goes away, RB_DECLARE_CALLBACKS_MAX() becomes a one-line wrapper and its RBCOMPUTE is renamed RBVALUE. One change on top of what was posted: the third argument is a fold(a, b) rather than a "replace?" compare, which keeps the same register-local recompute, lets sums and counts be expressed, and replaces RB_MIN/RB_MAX with the existing min()/max(). Converting the cached augmented test exposed the cost of the "suboptimal" propagate-from-parent path in rb_add_augmented_cached(), 2-12% on the augmented insert+delete benchmark against the documented update-on-the-way-down pattern. Patch 3 adds a ->merge() callback to struct rb_augment_callbacks, derived from the RB_AUG() list, and uses it during the descent, which gets the helper to parity before the test starts relying on it. checkpatch has plenty to say about the RB_FOR_EACH() machinery in patches 2 and 3 (unused macro arguments, values without parentheses); all of it is inherent to the token-pasting dispatch, as for __MAP() in linux/syscalls.h. The tools/ copy of rbtree_augmented.h is left alone. v1: https://lore.kernel.org/r/20260928122611.336351-1-s921975628@gmail.com (local) Changes since v1: - New patch 2: Peter's per-field RB_AUG() templates, taking a fold - ->merge() is derived from the RB_AUG() list instead of being a new template argument; the propagate-from-parent removal is now patch 3 - Numbers re-measured on the final code, on the Pi and on x86 Peter Zijlstra (Intel) (1): rbtree: declare augmented callbacks per field with RB_AUG() Yiwei Lin (3): rbtree_test: use rb_add() and rb_add_cached() for the basic tests rbtree: update augmented data on the way down in rb_add_augmented_cached() rbtree_test: use rb_add_augmented_cached() for the cached augmented test Documentation/core-api/rbtree.rst | 27 ++++- include/linux/rbtree_augmented.h | 192 +++++++++++++++++++++--------- kernel/sched/fair.c | 70 ++--------- lib/rbtree_test.c | 62 ++-------- net/tipc/name_table.c | 7 +- 5 files changed, 179 insertions(+), 179 deletions(-) -- 2.34.1