lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Wed, 16 Dec 2020 20:45:26 +0000
From:   Dexuan Cui <decui@...rosoft.com>
To:     Peter Zijlstra <peterz@...radead.org>
CC:     Ingo Molnar <mingo@...nel.org>,
        Daniel Bristot de Oliveira <bristot@...hat.com>,
        "kvm@...r.kernel.org" <kvm@...r.kernel.org>,
        "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
        "jeyu@...nel.org" <jeyu@...nel.org>,
        Josh Poimboeuf <jpoimboe@...hat.com>,
        "ardb@...nel.org" <ardb@...nel.org>
Subject: RE: static_branch_enable() does not work from a __init function?

> From: Peter Zijlstra <peterz@...radead.org>
> Sent: Wednesday, December 16, 2020 2:59 AM
> ...
> So I think the reason your above module doesn't work, while the one in
> vmx_init() does work (for 5.10) should be fixed by the completely
> untested below.
> 
> I've no clue about 5.4 and no desire to investigate. That's what distro
> people are for.
> 
> Can you verify?
> 
> ---
> diff --git a/kernel/jump_label.c b/kernel/jump_label.c
> index 015ef903ce8c..c6a39d662935 100644
> --- a/kernel/jump_label.c
> +++ b/kernel/jump_label.c
> @@ -793,6 +793,7 @@ int jump_label_text_reserved(void *start, void *end)
>  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 static_key
> *key)
> 
>  	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

Yes, this patch fixes the issue found by the test module for both
v5.10 and v5.4. 

Thank you, Peter!

Dexuan

Powered by blists - more mailing lists