From: Zhen Lei <thunder.leizhen@huawei.com>
To: Josh Poimboeuf <jpoimboe@kernel.org>,
Jiri Kosina <jikos@kernel.org>, Miroslav Benes <mbenes@suse.cz>,
Petr Mladek <pmladek@suse.com>,
Joe Lawrence <joe.lawrence@redhat.com>,
<live-patching@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
Masahiro Yamada <masahiroy@kernel.org>,
Alexei Starovoitov <ast@kernel.org>, Jiri Olsa <jolsa@kernel.org>,
Kees Cook <keescook@chromium.org>,
Andrew Morton <akpm@linux-foundation.org>,
"Luis Chamberlain" <mcgrof@kernel.org>,
<linux-modules@vger.kernel.org>
Cc: Zhen Lei <thunder.leizhen@huawei.com>
Subject: [PATCH 7/7] livepatch: Improve the search performance of module_kallsyms_on_each_symbol()
Date: Thu, 8 Sep 2022 21:09:36 +0800 [thread overview]
Message-ID: <20220908130936.674-8-thunder.leizhen@huawei.com> (raw)
In-Reply-To: <20220908130936.674-1-thunder.leizhen@huawei.com>
Currently we traverse all symbols of all modules to find the specified
function for the specified module. But in reality, we just need to find
the given module and then traverse all the symbols in it.
In order to achieve this purpose, split the call to hook 'fn' into two
phases:
1. Finds the given module. Pass pointer 'mod'. Hook 'fn' directly returns
the comparison result of the module name without comparing the function
name.
2. Finds the given function in that module. Pass pointer 'mod = NULL'.
Hook 'fn' skip the comparison of module name and directly compare
function names.
Phase1: mod1-->mod2..(subsequent modules do not need to be compared)
|
Phase2: -->f1-->f2-->f3
Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
---
kernel/livepatch/core.c | 7 ++-----
kernel/module/kallsyms.c | 13 ++++++++++++-
2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
index 31b57ccf908017e..98e23137e4133bc 100644
--- a/kernel/livepatch/core.c
+++ b/kernel/livepatch/core.c
@@ -130,15 +130,12 @@ static int klp_find_callback(void *data, const char *name,
{
struct klp_find_arg *args = data;
- if ((mod && !args->objname) || (!mod && args->objname))
- return 0;
+ if (mod)
+ return strcmp(args->objname, mod->name);
if (strcmp(args->name, name))
return 0;
- if (args->objname && strcmp(args->objname, mod->name))
- return 0;
-
args->addr = addr;
args->count++;
diff --git a/kernel/module/kallsyms.c b/kernel/module/kallsyms.c
index f5c5c9175333df7..b033613e6c7e3bb 100644
--- a/kernel/module/kallsyms.c
+++ b/kernel/module/kallsyms.c
@@ -510,6 +510,11 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
if (mod->state == MODULE_STATE_UNFORMED)
continue;
+ /* check mod->name first */
+ ret = fn(data, NULL, mod, 0);
+ if (ret)
+ continue;
+
/* Use rcu_dereference_sched() to remain compliant with the sparse tool */
preempt_disable();
kallsyms = rcu_dereference_sched(mod->kallsyms);
@@ -522,10 +527,16 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
continue;
ret = fn(data, kallsyms_symbol_name(kallsyms, i),
- mod, kallsyms_symbol_value(sym));
+ NULL, kallsyms_symbol_value(sym));
if (ret != 0)
goto out;
}
+
+ /*
+ * The given module is found, the subsequent modules do not
+ * need to be compared.
+ */
+ break;
}
out:
mutex_unlock(&module_mutex);
--
2.25.1
next prev parent reply other threads:[~2022-09-08 13:10 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-08 13:09 [PATCH 0/7] kallsyms: Optimizes the performance of lookup symbols Zhen Lei
2022-09-08 13:09 ` [PATCH 1/7] scripts/kallsyms: don't compress symbol type when CONFIG_KALLSYMS_ALL=y Zhen Lei
2022-09-08 13:09 ` [PATCH 2/7] scripts/kallsyms: rename build_initial_tok_table() Zhen Lei
2022-09-08 13:09 ` [PATCH 3/7] kallsyms: Adjust the types of some local variables Zhen Lei
2022-09-08 13:09 ` [PATCH 4/7] kallsyms: Improve the performance of kallsyms_lookup_name() Zhen Lei
2022-09-08 13:09 ` [PATCH 5/7] kallsyms: Add helper kallsyms_on_each_match_symbol() Zhen Lei
2022-09-08 13:09 ` [PATCH 6/7] livepatch: Use kallsyms_on_each_match_symbol() to improve performance Zhen Lei
2022-09-08 13:09 ` Zhen Lei [this message]
2022-09-09 0:07 ` [PATCH 0/7] kallsyms: Optimizes the performance of lookup symbols Luis Chamberlain
2022-09-09 1:17 ` Leizhen (ThunderTown)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220908130936.674-8-thunder.leizhen@huawei.com \
--to=thunder.leizhen@huawei.com \
--cc=akpm@linux-foundation.org \
--cc=ast@kernel.org \
--cc=jikos@kernel.org \
--cc=joe.lawrence@redhat.com \
--cc=jolsa@kernel.org \
--cc=jpoimboe@kernel.org \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-modules@vger.kernel.org \
--cc=live-patching@vger.kernel.org \
--cc=masahiroy@kernel.org \
--cc=mbenes@suse.cz \
--cc=mcgrof@kernel.org \
--cc=pmladek@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).