kernel: clean up USE_GENERIC_SMP_HELPERS
For arch which needs USE_GENERIC_SMP_HELPERS, it has to select USE_GENERIC_SMP_HELPERS, rather than leaving a choice to user, since they don't provide their own implementions. Also, move on_each_cpu() to kernel/smp.c, it is strange to put it in kernel/softirq.c. For arch which doesn't use USE_GENERIC_SMP_HELPERS, e.g. blackfin, only on_each_cpu() is compiled. Signed-off-by: Amerigo Wang <amwang@redhat.com> Cc: David Howells <dhowells@redhat.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@elte.hu> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Yinghai Lu <yinghai@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Randy Dunlap <randy.dunlap@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
b8cb464e4a
commit
351f8f8e64
@@ -203,6 +203,7 @@ endmenu
|
|||||||
config SMP
|
config SMP
|
||||||
bool "Symmetric multi-processing support"
|
bool "Symmetric multi-processing support"
|
||||||
default y
|
default y
|
||||||
|
select USE_GENERIC_SMP_HELPERS
|
||||||
depends on MN10300_PROC_MN2WS0038 || MN10300_PROC_MN2WS0050
|
depends on MN10300_PROC_MN2WS0038 || MN10300_PROC_MN2WS0050
|
||||||
---help---
|
---help---
|
||||||
This enables support for systems with more than one CPU. If you have
|
This enables support for systems with more than one CPU. If you have
|
||||||
@@ -226,11 +227,6 @@ config NR_CPUS
|
|||||||
depends on SMP
|
depends on SMP
|
||||||
default "2"
|
default "2"
|
||||||
|
|
||||||
config USE_GENERIC_SMP_HELPERS
|
|
||||||
bool
|
|
||||||
depends on SMP
|
|
||||||
default y
|
|
||||||
|
|
||||||
source "kernel/Kconfig.preempt"
|
source "kernel/Kconfig.preempt"
|
||||||
|
|
||||||
config MN10300_CURRENT_IN_E2
|
config MN10300_CURRENT_IN_E2
|
||||||
|
@@ -65,6 +65,7 @@ config X86
|
|||||||
select HAVE_SPARSE_IRQ
|
select HAVE_SPARSE_IRQ
|
||||||
select GENERIC_IRQ_PROBE
|
select GENERIC_IRQ_PROBE
|
||||||
select GENERIC_PENDING_IRQ if SMP
|
select GENERIC_PENDING_IRQ if SMP
|
||||||
|
select USE_GENERIC_SMP_HELPERS if SMP
|
||||||
|
|
||||||
config INSTRUCTION_DECODER
|
config INSTRUCTION_DECODER
|
||||||
def_bool (KPROBES || PERF_EVENTS)
|
def_bool (KPROBES || PERF_EVENTS)
|
||||||
@@ -203,10 +204,6 @@ config HAVE_INTEL_TXT
|
|||||||
def_bool y
|
def_bool y
|
||||||
depends on EXPERIMENTAL && DMAR && ACPI
|
depends on EXPERIMENTAL && DMAR && ACPI
|
||||||
|
|
||||||
config USE_GENERIC_SMP_HELPERS
|
|
||||||
def_bool y
|
|
||||||
depends on SMP
|
|
||||||
|
|
||||||
config X86_32_SMP
|
config X86_32_SMP
|
||||||
def_bool y
|
def_bool y
|
||||||
depends on X86_32 && SMP
|
depends on X86_32 && SMP
|
||||||
|
@@ -43,7 +43,7 @@ obj-$(CONFIG_RT_MUTEXES) += rtmutex.o
|
|||||||
obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o
|
obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o
|
||||||
obj-$(CONFIG_RT_MUTEX_TESTER) += rtmutex-tester.o
|
obj-$(CONFIG_RT_MUTEX_TESTER) += rtmutex-tester.o
|
||||||
obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
|
obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
|
||||||
obj-$(CONFIG_USE_GENERIC_SMP_HELPERS) += smp.o
|
obj-$(CONFIG_SMP) += smp.o
|
||||||
ifneq ($(CONFIG_SMP),y)
|
ifneq ($(CONFIG_SMP),y)
|
||||||
obj-y += up.o
|
obj-y += up.o
|
||||||
endif
|
endif
|
||||||
|
19
kernel/smp.c
19
kernel/smp.c
@@ -13,6 +13,7 @@
|
|||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/cpu.h>
|
#include <linux/cpu.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_USE_GENERIC_SMP_HELPERS
|
||||||
static struct {
|
static struct {
|
||||||
struct list_head queue;
|
struct list_head queue;
|
||||||
raw_spinlock_t lock;
|
raw_spinlock_t lock;
|
||||||
@@ -529,3 +530,21 @@ void ipi_call_unlock_irq(void)
|
|||||||
{
|
{
|
||||||
raw_spin_unlock_irq(&call_function.lock);
|
raw_spin_unlock_irq(&call_function.lock);
|
||||||
}
|
}
|
||||||
|
#endif /* USE_GENERIC_SMP_HELPERS */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Call a function on all processors
|
||||||
|
*/
|
||||||
|
int on_each_cpu(void (*func) (void *info), void *info, int wait)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
preempt_disable();
|
||||||
|
ret = smp_call_function(func, info, wait);
|
||||||
|
local_irq_disable();
|
||||||
|
func(info);
|
||||||
|
local_irq_enable();
|
||||||
|
preempt_enable();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(on_each_cpu);
|
||||||
|
@@ -885,25 +885,6 @@ static __init int spawn_ksoftirqd(void)
|
|||||||
}
|
}
|
||||||
early_initcall(spawn_ksoftirqd);
|
early_initcall(spawn_ksoftirqd);
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
/*
|
|
||||||
* Call a function on all processors
|
|
||||||
*/
|
|
||||||
int on_each_cpu(void (*func) (void *info), void *info, int wait)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
preempt_disable();
|
|
||||||
ret = smp_call_function(func, info, wait);
|
|
||||||
local_irq_disable();
|
|
||||||
func(info);
|
|
||||||
local_irq_enable();
|
|
||||||
preempt_enable();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(on_each_cpu);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* [ These __weak aliases are kept in a separate compilation unit, so that
|
* [ These __weak aliases are kept in a separate compilation unit, so that
|
||||||
* GCC does not inline them incorrectly. ]
|
* GCC does not inline them incorrectly. ]
|
||||||
|
Reference in New Issue
Block a user