]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
irq_work: Map irq_work_on_queue() to irq_work_on() in !SMP
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Fri, 18 Aug 2017 17:59:16 +0000 (10:59 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 9 Oct 2017 21:24:14 +0000 (14:24 -0700)
Commit 478850160636 ("irq_work: Implement remote queueing") provides
irq_work_on_queue() only for SMP builds.  However, providing it simplifies
code that submits irq_work to lists of CPUs, eliminating the !SMP special
cases.  This commit therefore maps irq_work_on_queue() to irq_work_on()
in !SMP builds, but validating the specified CPU.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
include/linux/irq_work.h
kernel/irq_work.c

index 47b9ebd4a74fc667601d76476645fefbdb3c36f6..d8c9876d5da4208da9a00d75a864fdb4aa584c95 100644 (file)
@@ -33,10 +33,7 @@ void init_irq_work(struct irq_work *work, void (*func)(struct irq_work *))
 #define DEFINE_IRQ_WORK(name, _f) struct irq_work name = { .func = (_f), }
 
 bool irq_work_queue(struct irq_work *work);
-
-#ifdef CONFIG_SMP
 bool irq_work_queue_on(struct irq_work *work, int cpu);
-#endif
 
 void irq_work_tick(void);
 void irq_work_sync(struct irq_work *work);
index bcf107ce085450552c17d6b045816cd4656e97c0..9f20f6c725790bfab33c6e9c90a9cbca2200b832 100644 (file)
@@ -56,7 +56,6 @@ void __weak arch_irq_work_raise(void)
         */
 }
 
-#ifdef CONFIG_SMP
 /*
  * Enqueue the irq_work @work on @cpu unless it's already pending
  * somewhere.
@@ -68,6 +67,8 @@ bool irq_work_queue_on(struct irq_work *work, int cpu)
        /* All work should have been flushed before going offline */
        WARN_ON_ONCE(cpu_is_offline(cpu));
 
+#ifdef CONFIG_SMP
+
        /* Arch remote IPI send/receive backend aren't NMI safe */
        WARN_ON_ONCE(in_nmi());
 
@@ -78,10 +79,12 @@ bool irq_work_queue_on(struct irq_work *work, int cpu)
        if (llist_add(&work->llnode, &per_cpu(raised_list, cpu)))
                arch_send_call_function_single_ipi(cpu);
 
+#else /* #ifdef CONFIG_SMP */
+       irq_work_queue(work);
+#endif /* #else #ifdef CONFIG_SMP */
+
        return true;
 }
-EXPORT_SYMBOL_GPL(irq_work_queue_on);
-#endif
 
 /* Enqueue the irq work @work on the current CPU */
 bool irq_work_queue(struct irq_work *work)