diff options
Diffstat (limited to 'arch/x86_64/kernel/smp.c')
-rw-r--r-- | arch/x86_64/kernel/smp.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/x86_64/kernel/smp.c b/arch/x86_64/kernel/smp.c index 4f67697f5036..af1ec4d23cf8 100644 --- a/arch/x86_64/kernel/smp.c +++ b/arch/x86_64/kernel/smp.c | |||
@@ -376,16 +376,20 @@ int smp_call_function_single (int cpu, void (*func) (void *info), void *info, | |||
376 | /* prevent preemption and reschedule on another processor */ | 376 | /* prevent preemption and reschedule on another processor */ |
377 | int me = get_cpu(); | 377 | int me = get_cpu(); |
378 | if (cpu == me) { | 378 | if (cpu == me) { |
379 | WARN_ON(1); | ||
380 | put_cpu(); | 379 | put_cpu(); |
381 | return -EBUSY; | 380 | return 0; |
382 | } | 381 | } |
382 | |||
383 | /* Can deadlock when called with interrupts disabled */ | ||
384 | WARN_ON(irqs_disabled()); | ||
385 | |||
383 | spin_lock_bh(&call_lock); | 386 | spin_lock_bh(&call_lock); |
384 | __smp_call_function_single(cpu, func, info, nonatomic, wait); | 387 | __smp_call_function_single(cpu, func, info, nonatomic, wait); |
385 | spin_unlock_bh(&call_lock); | 388 | spin_unlock_bh(&call_lock); |
386 | put_cpu(); | 389 | put_cpu(); |
387 | return 0; | 390 | return 0; |
388 | } | 391 | } |
392 | EXPORT_SYMBOL(smp_call_function_single); | ||
389 | 393 | ||
390 | /* | 394 | /* |
391 | * this function sends a 'generic call function' IPI to all other CPUs | 395 | * this function sends a 'generic call function' IPI to all other CPUs |