]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - kernel/smp.c
Merge branch 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[mirror_ubuntu-hirsute-kernel.git] / kernel / smp.c
index d155374632eba70533081b37fdf7ba0597c46af9..7dbcb402c2fc0af441d75d13eeaef7a642f4fd57 100644 (file)
@@ -34,7 +34,7 @@ struct call_function_data {
        cpumask_var_t           cpumask_ipi;
 };
 
-static DEFINE_PER_CPU_SHARED_ALIGNED(struct call_function_data, cfd_data);
+static DEFINE_PER_CPU_ALIGNED(struct call_function_data, cfd_data);
 
 static DEFINE_PER_CPU_SHARED_ALIGNED(struct llist_head, call_single_queue);
 
@@ -291,6 +291,14 @@ int smp_call_function_single(int cpu, smp_call_func_t func, void *info,
        WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled()
                     && !oops_in_progress);
 
+       /*
+        * When @wait we can deadlock when we interrupt between llist_add() and
+        * arch_send_call_function_ipi*(); when !@wait we can deadlock due to
+        * csd_lock() on because the interrupt context uses the same csd
+        * storage.
+        */
+       WARN_ON_ONCE(!in_task());
+
        csd = &csd_stack;
        if (!wait) {
                csd = this_cpu_ptr(&csd_data);
@@ -416,6 +424,14 @@ void smp_call_function_many(const struct cpumask *mask,
        WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled()
                     && !oops_in_progress && !early_boot_irqs_disabled);
 
+       /*
+        * When @wait we can deadlock when we interrupt between llist_add() and
+        * arch_send_call_function_ipi*(); when !@wait we can deadlock due to
+        * csd_lock() on because the interrupt context uses the same csd
+        * storage.
+        */
+       WARN_ON_ONCE(!in_task());
+
        /* Try to fastpath.  So, what's a CPU they want? Ignoring this one. */
        cpu = cpumask_first_and(mask, cpu_online_mask);
        if (cpu == this_cpu)
@@ -487,13 +503,11 @@ EXPORT_SYMBOL(smp_call_function_many);
  * You must not call this function with disabled interrupts or from a
  * hardware interrupt handler or from a bottom half handler.
  */
-int smp_call_function(smp_call_func_t func, void *info, int wait)
+void smp_call_function(smp_call_func_t func, void *info, int wait)
 {
        preempt_disable();
        smp_call_function_many(cpu_online_mask, func, info, wait);
        preempt_enable();
-
-       return 0;
 }
 EXPORT_SYMBOL(smp_call_function);
 
@@ -594,18 +608,16 @@ void __init smp_init(void)
  * early_boot_irqs_disabled is set.  Use local_irq_save/restore() instead
  * of local_irq_disable/enable().
  */
-int on_each_cpu(void (*func) (void *info), void *info, int wait)
+void on_each_cpu(void (*func) (void *info), void *info, int wait)
 {
        unsigned long flags;
-       int ret = 0;
 
        preempt_disable();
-       ret = smp_call_function(func, info, wait);
+       smp_call_function(func, info, wait);
        local_irq_save(flags);
        func(info);
        local_irq_restore(flags);
        preempt_enable();
-       return ret;
 }
 EXPORT_SYMBOL(on_each_cpu);