Messages in this thread Patch in this message | | | From | Mark-PK Tsai <> | Subject | [PATCH] clk: make clk_core_lookup faster by using clk name hash | Date | Tue, 5 Oct 2021 14:59:49 +0800 |
| |
Compare hash value before strcmp the full name to make clk_core_lookup faster.
It make clk driver probe 30 percent faster on the platform have 1483 registered clks and average clock name length 20.
Signed-off-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com> --- drivers/clk/clk.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 65508eb89ec9..d5f65fda3db8 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -89,6 +89,7 @@ struct clk_core { struct hlist_node debug_node; #endif struct kref ref; + unsigned int hash; }; #define CREATE_TRACE_POINTS @@ -292,16 +293,17 @@ struct clk_hw *clk_hw_get_parent(const struct clk_hw *hw) EXPORT_SYMBOL_GPL(clk_hw_get_parent); static struct clk_core *__clk_lookup_subtree(const char *name, + unsigned int hash, struct clk_core *core) { struct clk_core *child; struct clk_core *ret; - if (!strcmp(core->name, name)) + if (hash == core->hash && !strcmp(core->name, name)) return core; hlist_for_each_entry(child, &core->children, child_node) { - ret = __clk_lookup_subtree(name, child); + ret = __clk_lookup_subtree(name, hash, child); if (ret) return ret; } @@ -313,20 +315,22 @@ static struct clk_core *clk_core_lookup(const char *name) { struct clk_core *root_clk; struct clk_core *ret; + unsigned int hash; if (!name) return NULL; + hash = full_name_hash(NULL, name, strlen(name)); /* search the 'proper' clk tree first */ hlist_for_each_entry(root_clk, &clk_root_list, child_node) { - ret = __clk_lookup_subtree(name, root_clk); + ret = __clk_lookup_subtree(name, hash, root_clk); if (ret) return ret; } /* if not found, then search the orphan tree */ hlist_for_each_entry(root_clk, &clk_orphan_list, child_node) { - ret = __clk_lookup_subtree(name, root_clk); + ret = __clk_lookup_subtree(name, hash, root_clk); if (ret) return ret; } @@ -3827,6 +3831,7 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw) goto fail_name; } + core->hash = full_name_hash(NULL, core->name, strlen(core->name)); if (WARN_ON(!init->ops)) { ret = -EINVAL; goto fail_ops; -- 2.18.0
| |