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

rbtree: inline rb_last()

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

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

Before:

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

After:

size vmlinux
text data bss dec hex filename
34811659 22177365 5685248 62674272 3bc5560 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-3-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
94984bfe c2d2dad2

+20 -14
+15 -1
include/linux/rbtree.h
··· 58 58 n = n->rb_left; 59 59 return n; 60 60 } 61 - extern struct rb_node *rb_last(const struct rb_root *); 61 + 62 + /* 63 + * This function returns the last node (in sort order) of the tree. 64 + */ 65 + static inline struct rb_node *rb_last(const struct rb_root *root) 66 + { 67 + struct rb_node *n; 68 + 69 + n = root->rb_node; 70 + if (!n) 71 + return NULL; 72 + while (n->rb_right) 73 + n = n->rb_right; 74 + return n; 75 + } 62 76 63 77 /* Postorder iteration - always visit the parent after its children */ 64 78 extern struct rb_node *rb_first_postorder(const struct rb_root *);
-13
lib/rbtree.c
··· 460 460 } 461 461 EXPORT_SYMBOL(__rb_insert_augmented); 462 462 463 - struct rb_node *rb_last(const struct rb_root *root) 464 - { 465 - struct rb_node *n; 466 - 467 - n = root->rb_node; 468 - if (!n) 469 - return NULL; 470 - while (n->rb_right) 471 - n = n->rb_right; 472 - return n; 473 - } 474 - EXPORT_SYMBOL(rb_last); 475 - 476 463 struct rb_node *rb_next(const struct rb_node *node) 477 464 { 478 465 struct rb_node *parent;
+5
rust/helpers/rbtree.c
··· 12 12 { 13 13 return rb_first(root); 14 14 } 15 + 16 + struct rb_node *rust_helper_rb_last(const struct rb_root *root) 17 + { 18 + return rb_last(root); 19 + }