perf lock: Make rb_tree helper functions generic

The rb_tree helper functions can be reused for parsing `owner_lock_stat`
into rb tree for sorting.

Signed-off-by: Chun-Tse Shao <ctshao@google.com>
Tested-by: Athira Rajeev <atrajeev@linux.ibm.com>
Link: https://lore.kernel.org/r/20250227003359.732948-4-ctshao@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
Chun-Tse Shao 2025-02-26 16:28:55 -08:00 committed by Namhyung Kim
parent 425bc88352
commit a40ccb7d98

View File

@ -418,16 +418,13 @@ static void combine_lock_stats(struct lock_stat *st)
rb_insert_color(&st->rb, &sorted);
}
static void insert_to_result(struct lock_stat *st,
int (*bigger)(struct lock_stat *, struct lock_stat *))
static void insert_to(struct rb_root *rr, struct lock_stat *st,
int (*bigger)(struct lock_stat *, struct lock_stat *))
{
struct rb_node **rb = &result.rb_node;
struct rb_node **rb = &rr->rb_node;
struct rb_node *parent = NULL;
struct lock_stat *p;
if (combine_locks && st->combined)
return;
while (*rb) {
p = container_of(*rb, struct lock_stat, rb);
parent = *rb;
@ -439,13 +436,21 @@ static void insert_to_result(struct lock_stat *st,
}
rb_link_node(&st->rb, parent, rb);
rb_insert_color(&st->rb, &result);
rb_insert_color(&st->rb, rr);
}
/* returns left most element of result, and erase it */
static struct lock_stat *pop_from_result(void)
static inline void insert_to_result(struct lock_stat *st,
int (*bigger)(struct lock_stat *,
struct lock_stat *))
{
struct rb_node *node = result.rb_node;
if (combine_locks && st->combined)
return;
insert_to(&result, st, bigger);
}
static inline struct lock_stat *pop_from(struct rb_root *rr)
{
struct rb_node *node = rr->rb_node;
if (!node)
return NULL;
@ -453,8 +458,15 @@ static struct lock_stat *pop_from_result(void)
while (node->rb_left)
node = node->rb_left;
rb_erase(node, &result);
rb_erase(node, rr);
return container_of(node, struct lock_stat, rb);
}
/* returns left most element of result, and erase it */
static struct lock_stat *pop_from_result(void)
{
return pop_from(&result);
}
struct trace_lock_handler {