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 linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Mon, 19 Sep 2022 11:59:41 +0200 From: Peter Zijlstra <peterz@...radead.org> To: peterz@...radead.org Cc: richard.henderson@...aro.org, ink@...assic.park.msu.ru, mattst88@...il.com, vgupta@...nel.org, linux@...linux.org.uk, ulli.kroll@...glemail.com, linus.walleij@...aro.org, shawnguo@...nel.org, Sascha Hauer <s.hauer@...gutronix.de>, kernel@...gutronix.de, festevam@...il.com, linux-imx@....com, tony@...mide.com, khilman@...nel.org, catalin.marinas@....com, will@...nel.org, guoren@...nel.org, bcain@...cinc.com, chenhuacai@...nel.org, kernel@...0n.name, geert@...ux-m68k.org, sammy@...my.net, monstr@...str.eu, tsbogend@...ha.franken.de, dinguyen@...nel.org, jonas@...thpole.se, stefan.kristiansson@...nalahti.fi, shorne@...il.com, James.Bottomley@...senPartnership.com, deller@....de, mpe@...erman.id.au, npiggin@...il.com, christophe.leroy@...roup.eu, paul.walmsley@...ive.com, palmer@...belt.com, aou@...s.berkeley.edu, hca@...ux.ibm.com, gor@...ux.ibm.com, agordeev@...ux.ibm.com, borntraeger@...ux.ibm.com, svens@...ux.ibm.com, ysato@...rs.sourceforge.jp, dalias@...c.org, davem@...emloft.net, richard@....at, anton.ivanov@...bridgegreys.com, johannes@...solutions.net, tglx@...utronix.de, mingo@...hat.com, bp@...en8.de, dave.hansen@...ux.intel.com, x86@...nel.org, hpa@...or.com, acme@...nel.org, mark.rutland@....com, alexander.shishkin@...ux.intel.com, jolsa@...nel.org, namhyung@...nel.org, jgross@...e.com, srivatsa@...il.mit.edu, amakhalov@...are.com, pv-drivers@...are.com, boris.ostrovsky@...cle.com, chris@...kel.net, jcmvbkbc@...il.com, rafael@...nel.org, lenb@...nel.org, pavel@....cz, gregkh@...uxfoundation.org, mturquette@...libre.com, sboyd@...nel.org, daniel.lezcano@...aro.org, lpieralisi@...nel.org, sudeep.holla@....com, agross@...nel.org, bjorn.andersson@...aro.org, konrad.dybcio@...ainline.org, anup@...infault.org, thierry.reding@...il.com, jonathanh@...dia.com, jacob.jun.pan@...ux.intel.com, atishp@...shpatra.org, Arnd Bergmann <arnd@...db.de>, yury.norov@...il.com, andriy.shevchenko@...ux.intel.com, linux@...musvillemoes.dk, dennis@...nel.org, tj@...nel.org, cl@...ux.com, rostedt@...dmis.org, pmladek@...e.com, senozhatsky@...omium.org, john.ogness@...utronix.de, juri.lelli@...hat.com, vincent.guittot@...aro.org, dietmar.eggemann@....com, bsegall@...gle.com, mgorman@...e.de, bristot@...hat.com, vschneid@...hat.com, fweisbec@...il.com, ryabinin.a.a@...il.com, glider@...gle.com, andreyknvl@...il.com, dvyukov@...gle.com, vincenzo.frascino@....com, Andrew Morton <akpm@...ux-foundation.org>, jpoimboe@...nel.org, linux-alpha@...r.kernel.org, linux-kernel@...r.kernel.org, linux-snps-arc@...ts.infradead.org, linux-omap@...r.kernel.org, linux-csky@...r.kernel.org, linux-hexagon@...r.kernel.org, linux-ia64@...r.kernel.org, loongarch@...ts.linux.dev, linux-m68k@...ts.linux-m68k.org, linux-mips@...r.kernel.org, openrisc@...ts.librecores.org, linux-parisc@...r.kernel.org, linuxppc-dev@...ts.ozlabs.org, linux-riscv@...ts.infradead.org, linux-s390@...r.kernel.org, linux-sh@...r.kernel.org, sparclinux@...r.kernel.org, linux-um@...ts.infradead.org, linux-perf-users@...r.kernel.org, virtualization@...ts.linux-foundation.org, linux-xtensa@...ux-xtensa.org, linux-acpi@...r.kernel.org, linux-pm@...r.kernel.org, linux-clk@...r.kernel.org, linux-arm-msm@...r.kernel.org, linux-tegra@...r.kernel.org, linux-arch@...r.kernel.org, kasan-dev@...glegroups.com, Frederic Weisbecker <frederic@...nel.org>, "Rafael J. Wysocki" <rafael.j.wysocki@...el.com> Subject: [PATCH v2 02/44] x86/idle: Replace x86_idle with a static_call Typical boot time setup; no need to suffer an indirect call for that. Signed-off-by: Peter Zijlstra (Intel) <peterz@...radead.org> Reviewed-by: Frederic Weisbecker <frederic@...nel.org> Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@...el.com> --- arch/x86/kernel/process.c | 50 +++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 22 deletions(-) --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -24,6 +24,7 @@ #include <linux/cpuidle.h> #include <linux/acpi.h> #include <linux/elf-randomize.h> +#include <linux/static_call.h> #include <trace/events/power.h> #include <linux/hw_breakpoint.h> #include <asm/cpu.h> @@ -692,7 +693,23 @@ void __switch_to_xtra(struct task_struct unsigned long boot_option_idle_override = IDLE_NO_OVERRIDE; EXPORT_SYMBOL(boot_option_idle_override); -static void (*x86_idle)(void); +/* + * We use this if we don't have any better idle routine.. + */ +void __cpuidle default_idle(void) +{ + raw_safe_halt(); +} +#if defined(CONFIG_APM_MODULE) || defined(CONFIG_HALTPOLL_CPUIDLE_MODULE) +EXPORT_SYMBOL(default_idle); +#endif + +DEFINE_STATIC_CALL_NULL(x86_idle, default_idle); + +static bool x86_idle_set(void) +{ + return !!static_call_query(x86_idle); +} #ifndef CONFIG_SMP static inline void play_dead(void) @@ -715,28 +732,17 @@ void arch_cpu_idle_dead(void) /* * Called from the generic idle code. */ -void arch_cpu_idle(void) -{ - x86_idle(); -} - -/* - * We use this if we don't have any better idle routine.. - */ -void __cpuidle default_idle(void) +void __cpuidle arch_cpu_idle(void) { - raw_safe_halt(); + static_call(x86_idle)(); } -#if defined(CONFIG_APM_MODULE) || defined(CONFIG_HALTPOLL_CPUIDLE_MODULE) -EXPORT_SYMBOL(default_idle); -#endif #ifdef CONFIG_XEN bool xen_set_default_idle(void) { - bool ret = !!x86_idle; + bool ret = x86_idle_set(); - x86_idle = default_idle; + static_call_update(x86_idle, default_idle); return ret; } @@ -859,20 +865,20 @@ void select_idle_routine(const struct cp if (boot_option_idle_override == IDLE_POLL && smp_num_siblings > 1) pr_warn_once("WARNING: polling idle and HT enabled, performance may degrade\n"); #endif - if (x86_idle || boot_option_idle_override == IDLE_POLL) + if (x86_idle_set() || boot_option_idle_override == IDLE_POLL) return; if (boot_cpu_has_bug(X86_BUG_AMD_E400)) { pr_info("using AMD E400 aware idle routine\n"); - x86_idle = amd_e400_idle; + static_call_update(x86_idle, amd_e400_idle); } else if (prefer_mwait_c1_over_halt(c)) { pr_info("using mwait in idle threads\n"); - x86_idle = mwait_idle; + static_call_update(x86_idle, mwait_idle); } else if (cpu_feature_enabled(X86_FEATURE_TDX_GUEST)) { pr_info("using TDX aware idle routine\n"); - x86_idle = tdx_safe_halt; + static_call_update(x86_idle, tdx_safe_halt); } else - x86_idle = default_idle; + static_call_update(x86_idle, default_idle); } void amd_e400_c1e_apic_setup(void) @@ -925,7 +931,7 @@ static int __init idle_setup(char *str) * To continue to load the CPU idle driver, don't touch * the boot_option_idle_override. */ - x86_idle = default_idle; + static_call_update(x86_idle, default_idle); boot_option_idle_override = IDLE_HALT; } else if (!strcmp(str, "nomwait")) { /*
Powered by blists - more mailing lists