From a88f79f741d6d452edabc6f0a051287d0563de2d Mon Sep 17 00:00:00 2001 From: Tomas Jedlicka Date: Fri, 25 Aug 2017 09:46:26 -0400 Subject: [PATCH] dtrace: cyclics taking lock in atomic context The spin_lock_irqsave() makes cpu notifier addition run in atomic context which may block. The fix is to move this to module init time that should be run only once and before DTrace comes around during kernel boot. Orabug: 26782572 Signed-off-by: Tomas Jedlicka Reviewed-by: Nick Alcock --- kernel/dtrace/cyclic.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/kernel/dtrace/cyclic.c b/kernel/dtrace/cyclic.c index 953245b6ee67..822bb3c6fbea 100644 --- a/kernel/dtrace/cyclic.c +++ b/kernel/dtrace/cyclic.c @@ -25,7 +25,6 @@ #include #include -static DEFINE_SPINLOCK(cyclic_lock); static int omni_enabled = 0; #define _CYCLIC_CPU_UNDEF (-1) @@ -345,15 +344,6 @@ cyclic_id_t cyclic_add_omni(cyc_omni_handler_t *omni) for_each_online_cpu(cpu) cyclic_omni_start(cyc, cpu); -#ifdef CONFIG_HOTPLUG_CPU - spin_lock_irqsave(&cyclic_lock, flags); - if (!omni_enabled) { - register_cpu_notifier(&cpu_notifier); - omni_enabled = 1; - } - spin_unlock_irqrestore(&cyclic_lock, flags); -#endif - return (cyclic_id_t)cyc; } EXPORT_SYMBOL(cyclic_add_omni); @@ -542,9 +532,17 @@ static const struct file_operations proc_cyclicinfo_ops = { .release = seq_release, }; -static int __init proc_cyclicinfo_init(void) +static int __init cyclic_init(void) { proc_create("cyclicinfo", S_IRUSR, NULL, &proc_cyclicinfo_ops); + +#ifdef CONFIG_HOTPLUG_CPU + if (!omni_enabled) { + register_cpu_notifier(&cpu_notifier); + omni_enabled = 1; + } +#endif + return 0; } -module_init(proc_cyclicinfo_init); +module_init(cyclic_init); -- 2.50.1