Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rbtree: inline rb_first()

Patch series "rbree: inline rb_first() and rb_last()".

Inline these two small helpers, heavily used in TCP and FQ packet scheduler,
and in many other places.

This reduces kernel text size, and brings an 1.5 % improvement on network
TCP stress test.


This patch (of 2):

This is a very small function, inlining it saves cpu cycles by reducing
register pressure and removing call/ret overhead.

It also reduces vmlinux text size by 744 bytes on a typical x86_64 build.

Before:

size vmlinux
text data bss dec hex filename
34812525 22177365 5685248 62675138 3bc58c2 vmlinux

After:

size vmlinux
text data bss dec hex filename
34811781 22177365 5685248 62674394 3bc55da vmlinux

[ojeda@kernel.org: fix rust build]
Link: https://lkml.kernel.org/r/20251120085518.1463498-1-ojeda@kernel.org
Link: https://lkml.kernel.org/r/20251114140646.3817319-1-edumazet@google.com
Link: https://lkml.kernel.org/r/20251114140646.3817319-2-edumazet@google.com
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
Reviewed-by: Kuan-Wei Chiu <visitorckw@gmail.com>
Cc: Jakub Kacinski <kuba@kernel.org>
Cc: Neal Cardwell <ncardwell@google.com>
Cc: Paolo Abeni <pabeni@redhat.com>
Cc: Alice Ryhl <aliceryhl@google.com>
Cc: Stehen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Eric Dumazet and committed by
Andrew Morton
c2d2dad2 bc947af6

+20 -17
+15 -1
include/linux/rbtree.h
··· 43 43 /* Find logical next and previous nodes in a tree */ 44 44 extern struct rb_node *rb_next(const struct rb_node *); 45 45 extern struct rb_node *rb_prev(const struct rb_node *); 46 - extern struct rb_node *rb_first(const struct rb_root *); 46 + 47 + /* 48 + * This function returns the first node (in sort order) of the tree. 49 + */ 50 + static inline struct rb_node *rb_first(const struct rb_root *root) 51 + { 52 + struct rb_node *n; 53 + 54 + n = root->rb_node; 55 + if (!n) 56 + return NULL; 57 + while (n->rb_left) 58 + n = n->rb_left; 59 + return n; 60 + } 47 61 extern struct rb_node *rb_last(const struct rb_root *); 48 62 49 63 /* Postorder iteration - always visit the parent after its children */
-16
lib/rbtree.c
··· 460 460 } 461 461 EXPORT_SYMBOL(__rb_insert_augmented); 462 462 463 - /* 464 - * This function returns the first node (in sort order) of the tree. 465 - */ 466 - struct rb_node *rb_first(const struct rb_root *root) 467 - { 468 - struct rb_node *n; 469 - 470 - n = root->rb_node; 471 - if (!n) 472 - return NULL; 473 - while (n->rb_left) 474 - n = n->rb_left; 475 - return n; 476 - } 477 - EXPORT_SYMBOL(rb_first); 478 - 479 463 struct rb_node *rb_last(const struct rb_root *root) 480 464 { 481 465 struct rb_node *n;
+5
rust/helpers/rbtree.c
··· 7 7 { 8 8 rb_link_node(node, parent, rb_link); 9 9 } 10 + 11 + struct rb_node *rust_helper_rb_first(const struct rb_root *root) 12 + { 13 + return rb_first(root); 14 + }