From: Tomas Jedlicka Date: Fri, 25 Aug 2017 13:46:26 +0000 (-0400) Subject: dtrace: cyclics taking lock in atomic context X-Git-Tag: v4.1.12-111.0.20170918_2215~182^2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=a88f79f741d6d452edabc6f0a051287d0563de2d;p=users%2Fjedix%2Flinux-maple.git 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 --- 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);