summaryrefslogtreecommitdiff
path: root/kernel/smp.c
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2016-09-11 10:36:26 +0200
committerIngo Molnar <mingo@kernel.org>2016-09-22 14:49:10 +0200
commit8db549491c4a3ce9e1d509b75f78516e497f48ec (patch)
treeec5514272ff08aada90645c1619d09928cd9d3d3 /kernel/smp.c
parent27046a3ffbb01ba715e6236c170701c84759b61d (diff)
downloadlwn-8db549491c4a3ce9e1d509b75f78516e497f48ec.tar.gz
lwn-8db549491c4a3ce9e1d509b75f78516e497f48ec.zip
smp: Allocate smp_call_on_cpu() workqueue on stack too
The SMP IPI struct descriptor is allocated on the stack except for the workqueue and lockdep complains: INFO: trying to register non-static key. the code is fine but needs lockdep annotation. turning off the locking correctness validator. CPU: 0 PID: 110 Comm: kworker/0:1 Not tainted 4.8.0-rc5+ #14 Hardware name: Dell Inc. Precision T3600/0PTTT9, BIOS A13 05/11/2014 Workqueue: events smp_call_on_cpu_callback ... Call Trace: dump_stack register_lock_class ? __lock_acquire __lock_acquire ? __lock_acquire lock_acquire ? process_one_work process_one_work ? process_one_work worker_thread ? process_one_work ? process_one_work kthread ? kthread_create_on_node ret_from_fork So allocate it on the stack too. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> [ Test and write commit message. ] Signed-off-by: Borislav Petkov <bp@suse.de> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/20160911084323.jhtnpb4b37t5tlno@pd.tnic Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/smp.c')
-rw-r--r--kernel/smp.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/kernel/smp.c b/kernel/smp.c
index f4f6137941cb..bba3b201668d 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -759,13 +759,14 @@ static void smp_call_on_cpu_callback(struct work_struct *work)
int smp_call_on_cpu(unsigned int cpu, int (*func)(void *), void *par, bool phys)
{
struct smp_call_on_cpu_struct sscs = {
- .work = __WORK_INITIALIZER(sscs.work, smp_call_on_cpu_callback),
.done = COMPLETION_INITIALIZER_ONSTACK(sscs.done),
.func = func,
.data = par,
.cpu = phys ? cpu : -1,
};
+ INIT_WORK_ONSTACK(&sscs.work, smp_call_on_cpu_callback);
+
if (cpu >= nr_cpu_ids || !cpu_online(cpu))
return -ENXIO;