From: Peter Zijlstra <peterz@infradead.org>
To: Dexuan Cui <decui@microsoft.com>
Cc: Ingo Molnar <mingo@kernel.org>,
Daniel Bristot de Oliveira <bristot@redhat.com>,
"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
jeyu@kernel.org, Josh Poimboeuf <jpoimboe@redhat.com>,
ardb@kernel.org
Subject: [PATCH] jump_label: Fix usage in module __init
Date: Wed, 16 Dec 2020 14:54:35 +0100 [thread overview]
Message-ID: <20201216135435.GV3092@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20201216105926.GS3092@hirez.programming.kicks-ass.net>
Final patch looks like this.
---
Subject: jump_label: Fix usage in module __init
From: Peter Zijlstra <peterz@infradead.org>
Date: Wed Dec 16 12:21:36 CET 2020
When the static_key is part of the module, and the module calls
static_key_inc/enable() from it's __init section *AND* has a
static_branch_*() user in that very same __init section, things go
wobbly.
If the static_key lives outside the module, jump_label_add_module()
would append this module's sites to the key and jump_label_update()
would take the static_key_linked() branch and all would be fine.
If all the sites are outside of __init, then everything will be fine
too.
However, when all is aligned just as described above,
jump_label_update() calls __jump_label_update(.init = false) and we'll
not update sites in __init text.
Fixes: 19483677684b ("jump_label: Annotate entries that operate on __init code earlier")
Reported-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Tested-by: Jessica Yu <jeyu@kernel.org>
---
kernel/jump_label.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
--- a/kernel/jump_label.c
+++ b/kernel/jump_label.c
@@ -793,6 +793,7 @@ int jump_label_text_reserved(void *start
static void jump_label_update(struct static_key *key)
{
struct jump_entry *stop = __stop___jump_table;
+ bool init = system_state < SYSTEM_RUNNING;
struct jump_entry *entry;
#ifdef CONFIG_MODULES
struct module *mod;
@@ -804,15 +805,16 @@ static void jump_label_update(struct sta
preempt_disable();
mod = __module_address((unsigned long)key);
- if (mod)
+ if (mod) {
stop = mod->jump_entries + mod->num_jump_entries;
+ init = mod->state == MODULE_STATE_COMING;
+ }
preempt_enable();
#endif
entry = static_key_entries(key);
/* if there are no users, entry can be NULL */
if (entry)
- __jump_label_update(key, entry, stop,
- system_state < SYSTEM_RUNNING);
+ __jump_label_update(key, entry, stop, init);
}
#ifdef CONFIG_STATIC_KEYS_SELFTEST
next prev parent reply other threads:[~2020-12-16 13:55 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-16 3:54 static_branch_enable() does not work from a __init function? Dexuan Cui
2020-12-16 9:26 ` Peter Zijlstra
2020-12-16 10:59 ` Peter Zijlstra
2020-12-16 13:30 ` [RFC][PATCH] jump_label/static_call: Add MAINTAINERS Peter Zijlstra
2020-12-16 13:42 ` Peter Zijlstra
2020-12-16 14:23 ` Steven Rostedt
2020-12-16 16:19 ` Josh Poimboeuf
2020-12-16 16:19 ` Ard Biesheuvel
2020-12-16 21:16 ` Jason Baron
2020-12-18 16:02 ` [tip: locking/urgent] " tip-bot2 for Peter Zijlstra
2020-12-16 13:54 ` Peter Zijlstra [this message]
2020-12-16 16:36 ` [PATCH] jump_label: Fix usage in module __init Josh Poimboeuf
2020-12-18 16:02 ` [tip: locking/urgent] " tip-bot2 for Peter Zijlstra
2020-12-16 20:45 ` static_branch_enable() does not work from a __init function? Dexuan Cui
2020-12-16 11:55 ` Jessica Yu
2020-12-16 12:47 ` Peter Zijlstra
2020-12-16 13:10 ` Jessica Yu
2020-12-16 13:23 ` Peter Zijlstra
2020-12-16 13:27 ` Jessica Yu
2020-12-16 12:38 ` Jessica Yu
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=20201216135435.GV3092@hirez.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=ardb@kernel.org \
--cc=bristot@redhat.com \
--cc=decui@microsoft.com \
--cc=jeyu@kernel.org \
--cc=jpoimboe@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.