Merge branch 'generic-ipi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'generic-ipi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (22 commits) generic-ipi: more merge fallout generic-ipi: merge fix x86, visws: use mach-default/entry_arch.h x86, visws: fix generic-ipi build generic-ipi: fixlet generic-ipi: fix s390 build bug generic-ipi: fix linux-next tree build failure fix: "smp_call_function: get rid of the unused nonatomic/retry argument" fix: "smp_call_function: get rid of the unused nonatomic/retry argument" fix "smp_call_function: get rid of the unused nonatomic/retry argument" on_each_cpu(): kill unused 'retry' parameter smp_call_function: get rid of the unused nonatomic/retry argument sh: convert to generic helpers for IPI function calls parisc: convert to generic helpers for IPI function calls mips: convert to generic helpers for IPI function calls m32r: convert to generic helpers for IPI function calls arm: convert to generic helpers for IPI function calls alpha: convert to generic helpers for IPI function calls ia64: convert to generic helpers for IPI function calls powerpc: convert to generic helpers for IPI function calls ... Fix trivial conflicts due to rcu updates in kernel/rcupdate.c manually
This commit is contained in:
@@ -47,12 +47,13 @@ extern struct cpuinfo_alpha cpu_data[NR_CPUS];
|
||||
extern int smp_num_cpus;
|
||||
#define cpu_possible_map cpu_present_map
|
||||
|
||||
int smp_call_function_on_cpu(void (*func) (void *info), void *info,int retry, int wait, cpumask_t cpu);
|
||||
extern void arch_send_call_function_single_ipi(int cpu);
|
||||
extern void arch_send_call_function_ipi(cpumask_t mask);
|
||||
|
||||
#else /* CONFIG_SMP */
|
||||
|
||||
#define hard_smp_processor_id() 0
|
||||
#define smp_call_function_on_cpu(func,info,retry,wait,cpu) ({ 0; })
|
||||
#define smp_call_function_on_cpu(func,info,wait,cpu) ({ 0; })
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
|
||||
@@ -101,6 +101,9 @@ extern void platform_cpu_die(unsigned int cpu);
|
||||
extern int platform_cpu_kill(unsigned int cpu);
|
||||
extern void platform_cpu_enable(unsigned int cpu);
|
||||
|
||||
extern void arch_send_call_function_single_ipi(int cpu);
|
||||
extern void arch_send_call_function_ipi(cpumask_t mask);
|
||||
|
||||
/*
|
||||
* Local timer interrupt handling function (can be IPI'ed).
|
||||
*/
|
||||
|
||||
@@ -38,9 +38,6 @@ ia64_get_lid (void)
|
||||
return lid.f.id << 8 | lid.f.eid;
|
||||
}
|
||||
|
||||
extern int smp_call_function_mask(cpumask_t mask, void (*func)(void *),
|
||||
void *info, int wait);
|
||||
|
||||
#define hard_smp_processor_id() ia64_get_lid()
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
@@ -124,11 +121,12 @@ extern void __init init_smp_config (void);
|
||||
extern void smp_do_timer (struct pt_regs *regs);
|
||||
|
||||
extern void smp_send_reschedule (int cpu);
|
||||
extern void lock_ipi_calllock(void);
|
||||
extern void unlock_ipi_calllock(void);
|
||||
extern void identify_siblings (struct cpuinfo_ia64 *);
|
||||
extern int is_multithreading_enabled(void);
|
||||
|
||||
extern void arch_send_call_function_single_ipi(int cpu);
|
||||
extern void arch_send_call_function_ipi(cpumask_t mask);
|
||||
|
||||
#else /* CONFIG_SMP */
|
||||
|
||||
#define cpu_logical_id(i) 0
|
||||
|
||||
@@ -89,6 +89,9 @@ static __inline__ unsigned int num_booting_cpus(void)
|
||||
extern void smp_send_timer(void);
|
||||
extern unsigned long send_IPI_mask_phys(cpumask_t, int, int);
|
||||
|
||||
extern void arch_send_call_function_single_ipi(int cpu);
|
||||
extern void arch_send_call_function_ipi(cpumask_t mask);
|
||||
|
||||
#endif /* not __ASSEMBLY__ */
|
||||
|
||||
#define NO_PROC_ID (0xff) /* No processor magic marker */
|
||||
@@ -104,6 +107,7 @@ extern unsigned long send_IPI_mask_phys(cpumask_t, int, int);
|
||||
#define LOCAL_TIMER_IPI (M32R_IRQ_IPI3-M32R_IRQ_IPI0)
|
||||
#define INVALIDATE_CACHE_IPI (M32R_IRQ_IPI4-M32R_IRQ_IPI0)
|
||||
#define CPU_BOOT_IPI (M32R_IRQ_IPI5-M32R_IRQ_IPI0)
|
||||
#define CALL_FUNC_SINGLE_IPI (M32R_IRQ_IPI6-M32R_IRQ_IPI0)
|
||||
|
||||
#define IPI_SHIFT (0)
|
||||
#define NR_IPIS (8)
|
||||
|
||||
+3
-10
@@ -35,16 +35,6 @@ extern int __cpu_logical_map[NR_CPUS];
|
||||
|
||||
#define NO_PROC_ID (-1)
|
||||
|
||||
struct call_data_struct {
|
||||
void (*func)(void *);
|
||||
void *info;
|
||||
atomic_t started;
|
||||
atomic_t finished;
|
||||
int wait;
|
||||
};
|
||||
|
||||
extern struct call_data_struct *call_data;
|
||||
|
||||
#define SMP_RESCHEDULE_YOURSELF 0x1 /* XXX braindead */
|
||||
#define SMP_CALL_FUNCTION 0x2
|
||||
|
||||
@@ -67,4 +57,7 @@ static inline void smp_send_reschedule(int cpu)
|
||||
|
||||
extern asmlinkage void smp_call_function_interrupt(void);
|
||||
|
||||
extern void arch_send_call_function_single_ipi(int cpu);
|
||||
extern void arch_send_call_function_ipi(cpumask_t mask);
|
||||
|
||||
#endif /* __ASM_SMP_H */
|
||||
|
||||
@@ -30,6 +30,9 @@ extern cpumask_t cpu_online_map;
|
||||
extern void smp_send_reschedule(int cpu);
|
||||
extern void smp_send_all_nop(void);
|
||||
|
||||
extern void arch_send_call_function_single_ipi(int cpu);
|
||||
extern void arch_send_call_function_ipi(cpumask_t mask);
|
||||
|
||||
#endif /* !ASSEMBLY */
|
||||
|
||||
/*
|
||||
|
||||
@@ -67,10 +67,7 @@ DECLARE_PER_CPU(cpumask_t, cpu_sibling_map);
|
||||
* in /proc/interrupts will be wrong!!! --Troy */
|
||||
#define PPC_MSG_CALL_FUNCTION 0
|
||||
#define PPC_MSG_RESCHEDULE 1
|
||||
/* This is unused now */
|
||||
#if 0
|
||||
#define PPC_MSG_MIGRATE_TASK 2
|
||||
#endif
|
||||
#define PPC_MSG_CALL_FUNC_SINGLE 2
|
||||
#define PPC_MSG_DEBUGGER_BREAK 3
|
||||
|
||||
void smp_init_iSeries(void);
|
||||
@@ -117,6 +114,9 @@ extern void smp_generic_take_timebase(void);
|
||||
|
||||
extern struct smp_ops_t *smp_ops;
|
||||
|
||||
extern void arch_send_call_function_single_ipi(int cpu);
|
||||
extern void arch_send_call_function_ipi(cpumask_t mask);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
+4
-10
@@ -26,18 +26,10 @@ extern int __cpu_logical_map[NR_CPUS];
|
||||
|
||||
#define NO_PROC_ID (-1)
|
||||
|
||||
struct smp_fn_call_struct {
|
||||
spinlock_t lock;
|
||||
atomic_t finished;
|
||||
void (*fn)(void *);
|
||||
void *data;
|
||||
};
|
||||
|
||||
extern struct smp_fn_call_struct smp_fn_call;
|
||||
|
||||
#define SMP_MSG_FUNCTION 0
|
||||
#define SMP_MSG_RESCHEDULE 1
|
||||
#define SMP_MSG_NR 2
|
||||
#define SMP_MSG_FUNCTION_SINGLE 2
|
||||
#define SMP_MSG_NR 3
|
||||
|
||||
void plat_smp_setup(void);
|
||||
void plat_prepare_cpus(unsigned int max_cpus);
|
||||
@@ -46,6 +38,8 @@ void plat_start_cpu(unsigned int cpu, unsigned long entry_point);
|
||||
void plat_send_ipi(unsigned int cpu, unsigned int message);
|
||||
int plat_register_ipi_handler(unsigned int message,
|
||||
void (*handler)(void *), void *arg);
|
||||
extern void arch_send_call_function_single_ipi(int cpu);
|
||||
extern void arch_send_call_function_ipi(cpumask_t mask);
|
||||
|
||||
#else
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ static inline void xc5(smpfunc_t func, unsigned long arg1, unsigned long arg2,
|
||||
unsigned long arg3, unsigned long arg4, unsigned long arg5)
|
||||
{ smp_cross_call(func, arg1, arg2, arg3, arg4, arg5); }
|
||||
|
||||
static inline int smp_call_function(void (*func)(void *info), void *info, int nonatomic, int wait)
|
||||
static inline int smp_call_function(void (*func)(void *info), void *info, int wait)
|
||||
{
|
||||
xc1((smpfunc_t)func, (unsigned long)info);
|
||||
return 0;
|
||||
|
||||
@@ -48,6 +48,7 @@ extern void irq_move_cleanup_interrupt(void);
|
||||
extern void threshold_interrupt(void);
|
||||
|
||||
extern void call_function_interrupt(void);
|
||||
extern void call_function_single_interrupt(void);
|
||||
|
||||
/* PIC specific functions */
|
||||
extern void disable_8259A_irq(unsigned int irq);
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
# define INVALIDATE_TLB_VECTOR 0xfd
|
||||
# define RESCHEDULE_VECTOR 0xfc
|
||||
# define CALL_FUNCTION_VECTOR 0xfb
|
||||
# define CALL_FUNCTION_SINGLE_VECTOR 0xfa
|
||||
# define THERMAL_APIC_VECTOR 0xf0
|
||||
|
||||
#else
|
||||
@@ -72,6 +73,7 @@
|
||||
#define ERROR_APIC_VECTOR 0xfe
|
||||
#define RESCHEDULE_VECTOR 0xfd
|
||||
#define CALL_FUNCTION_VECTOR 0xfc
|
||||
#define CALL_FUNCTION_SINGLE_VECTOR 0xfb
|
||||
#define THERMAL_APIC_VECTOR 0xfa
|
||||
#define THRESHOLD_APIC_VECTOR 0xf9
|
||||
#define INVALIDATE_TLB_VECTOR_END 0xf7
|
||||
@@ -143,6 +145,7 @@
|
||||
#define VIC_RESCHEDULE_CPI 4
|
||||
#define VIC_ENABLE_IRQ_CPI 5
|
||||
#define VIC_CALL_FUNCTION_CPI 6
|
||||
#define VIC_CALL_FUNCTION_SINGLE_CPI 7
|
||||
|
||||
/* Now the QIC CPIs: Since we don't need the two initial levels,
|
||||
* these are 2 less than the VIC CPIs */
|
||||
@@ -152,9 +155,10 @@
|
||||
#define QIC_RESCHEDULE_CPI (VIC_RESCHEDULE_CPI - QIC_CPI_OFFSET)
|
||||
#define QIC_ENABLE_IRQ_CPI (VIC_ENABLE_IRQ_CPI - QIC_CPI_OFFSET)
|
||||
#define QIC_CALL_FUNCTION_CPI (VIC_CALL_FUNCTION_CPI - QIC_CPI_OFFSET)
|
||||
#define QIC_CALL_FUNCTION_SINGLE_CPI (VIC_CALL_FUNCTION_SINGLE_CPI - QIC_CPI_OFFSET)
|
||||
|
||||
#define VIC_START_FAKE_CPI VIC_TIMER_CPI
|
||||
#define VIC_END_FAKE_CPI VIC_CALL_FUNCTION_CPI
|
||||
#define VIC_END_FAKE_CPI VIC_CALL_FUNCTION_SINGLE_CPI
|
||||
|
||||
/* this is the SYS_INT CPI. */
|
||||
#define VIC_SYS_INT 8
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
BUILD_INTERRUPT(reschedule_interrupt,RESCHEDULE_VECTOR)
|
||||
BUILD_INTERRUPT(invalidate_interrupt,INVALIDATE_TLB_VECTOR)
|
||||
BUILD_INTERRUPT(call_function_interrupt,CALL_FUNCTION_VECTOR)
|
||||
BUILD_INTERRUPT(call_function_single_interrupt,CALL_FUNCTION_SINGLE_VECTOR)
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,23 +1,5 @@
|
||||
/*
|
||||
* The following vectors are part of the Linux architecture, there
|
||||
* is no hardware IRQ pin equivalent for them, they are triggered
|
||||
* through the ICC by us (IPIs)
|
||||
* VISWS uses the standard Linux entry points:
|
||||
*/
|
||||
#ifdef CONFIG_X86_SMP
|
||||
BUILD_INTERRUPT(reschedule_interrupt,RESCHEDULE_VECTOR)
|
||||
BUILD_INTERRUPT(invalidate_interrupt,INVALIDATE_TLB_VECTOR)
|
||||
BUILD_INTERRUPT(call_function_interrupt,CALL_FUNCTION_VECTOR)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* every pentium local APIC has two 'local interrupts', with a
|
||||
* soft-definable vector attached to both interrupts, one of
|
||||
* which is a timer interrupt, the other one is error counter
|
||||
* overflow. Linux uses the local APIC timer interrupt to get
|
||||
* a much simpler SMP time architecture:
|
||||
*/
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
BUILD_INTERRUPT(apic_timer_interrupt,LOCAL_TIMER_VECTOR)
|
||||
BUILD_INTERRUPT(error_interrupt,ERROR_APIC_VECTOR)
|
||||
BUILD_INTERRUPT(spurious_interrupt,SPURIOUS_APIC_VECTOR)
|
||||
#endif
|
||||
#include "../mach-default/entry_arch.h"
|
||||
|
||||
@@ -23,4 +23,4 @@ BUILD_INTERRUPT(qic_invalidate_interrupt, QIC_INVALIDATE_CPI);
|
||||
BUILD_INTERRUPT(qic_reschedule_interrupt, QIC_RESCHEDULE_CPI);
|
||||
BUILD_INTERRUPT(qic_enable_irq_interrupt, QIC_ENABLE_IRQ_CPI);
|
||||
BUILD_INTERRUPT(qic_call_function_interrupt, QIC_CALL_FUNCTION_CPI);
|
||||
|
||||
BUILD_INTERRUPT(qic_call_function_single_interrupt, QIC_CALL_FUNCTION_SINGLE_CPI);
|
||||
|
||||
+12
-9
@@ -50,9 +50,9 @@ struct smp_ops {
|
||||
|
||||
void (*smp_send_stop)(void);
|
||||
void (*smp_send_reschedule)(int cpu);
|
||||
int (*smp_call_function_mask)(cpumask_t mask,
|
||||
void (*func)(void *info), void *info,
|
||||
int wait);
|
||||
|
||||
void (*send_call_func_ipi)(cpumask_t mask);
|
||||
void (*send_call_func_single_ipi)(int cpu);
|
||||
};
|
||||
|
||||
/* Globals due to paravirt */
|
||||
@@ -94,17 +94,22 @@ static inline void smp_send_reschedule(int cpu)
|
||||
smp_ops.smp_send_reschedule(cpu);
|
||||
}
|
||||
|
||||
static inline int smp_call_function_mask(cpumask_t mask,
|
||||
void (*func) (void *info), void *info,
|
||||
int wait)
|
||||
static inline void arch_send_call_function_single_ipi(int cpu)
|
||||
{
|
||||
return smp_ops.smp_call_function_mask(mask, func, info, wait);
|
||||
smp_ops.send_call_func_single_ipi(cpu);
|
||||
}
|
||||
|
||||
static inline void arch_send_call_function_ipi(cpumask_t mask)
|
||||
{
|
||||
smp_ops.send_call_func_ipi(mask);
|
||||
}
|
||||
|
||||
void native_smp_prepare_boot_cpu(void);
|
||||
void native_smp_prepare_cpus(unsigned int max_cpus);
|
||||
void native_smp_cpus_done(unsigned int max_cpus);
|
||||
int native_cpu_up(unsigned int cpunum);
|
||||
void native_send_call_func_ipi(cpumask_t mask);
|
||||
void native_send_call_func_single_ipi(int cpu);
|
||||
|
||||
extern int __cpu_disable(void);
|
||||
extern void __cpu_die(unsigned int cpu);
|
||||
@@ -197,7 +202,5 @@ static inline int hard_smp_processor_id(void)
|
||||
extern void cpu_uninit(void);
|
||||
#endif
|
||||
|
||||
extern void lock_ipi_call_lock(void);
|
||||
extern void unlock_ipi_call_lock(void);
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
enum ipi_vector {
|
||||
XEN_RESCHEDULE_VECTOR,
|
||||
XEN_CALL_FUNCTION_VECTOR,
|
||||
XEN_CALL_FUNCTION_SINGLE_VECTOR,
|
||||
|
||||
XEN_NR_IPIS,
|
||||
};
|
||||
|
||||
+38
-8
@@ -7,9 +7,18 @@
|
||||
*/
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/cpumask.h>
|
||||
|
||||
extern void cpu_idle(void);
|
||||
|
||||
struct call_single_data {
|
||||
struct list_head list;
|
||||
void (*func) (void *info);
|
||||
void *info;
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
#include <linux/preempt.h>
|
||||
@@ -52,15 +61,34 @@ extern void smp_cpus_done(unsigned int max_cpus);
|
||||
/*
|
||||
* Call a function on all other processors
|
||||
*/
|
||||
int smp_call_function(void(*func)(void *info), void *info, int retry, int wait);
|
||||
|
||||
int smp_call_function(void(*func)(void *info), void *info, int wait);
|
||||
int smp_call_function_mask(cpumask_t mask, void(*func)(void *info), void *info,
|
||||
int wait);
|
||||
int smp_call_function_single(int cpuid, void (*func) (void *info), void *info,
|
||||
int retry, int wait);
|
||||
int wait);
|
||||
void __smp_call_function_single(int cpuid, struct call_single_data *data);
|
||||
|
||||
/*
|
||||
* Generic and arch helpers
|
||||
*/
|
||||
#ifdef CONFIG_USE_GENERIC_SMP_HELPERS
|
||||
void generic_smp_call_function_single_interrupt(void);
|
||||
void generic_smp_call_function_interrupt(void);
|
||||
void init_call_single_data(void);
|
||||
void ipi_call_lock(void);
|
||||
void ipi_call_unlock(void);
|
||||
void ipi_call_lock_irq(void);
|
||||
void ipi_call_unlock_irq(void);
|
||||
#else
|
||||
static inline void init_call_single_data(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Call a function on all processors
|
||||
*/
|
||||
int on_each_cpu(void (*func) (void *info), void *info, int retry, int wait);
|
||||
int on_each_cpu(void (*func) (void *info), void *info, int wait);
|
||||
|
||||
#define MSG_ALL_BUT_SELF 0x8000 /* Assume <32768 CPU's */
|
||||
#define MSG_ALL 0x8001
|
||||
@@ -90,9 +118,9 @@ static inline int up_smp_call_function(void (*func)(void *), void *info)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#define smp_call_function(func, info, retry, wait) \
|
||||
#define smp_call_function(func, info, wait) \
|
||||
(up_smp_call_function(func, info))
|
||||
#define on_each_cpu(func,info,retry,wait) \
|
||||
#define on_each_cpu(func,info,wait) \
|
||||
({ \
|
||||
local_irq_disable(); \
|
||||
func(info); \
|
||||
@@ -102,7 +130,7 @@ static inline int up_smp_call_function(void (*func)(void *), void *info)
|
||||
static inline void smp_send_reschedule(int cpu) { }
|
||||
#define num_booting_cpus() 1
|
||||
#define smp_prepare_boot_cpu() do {} while (0)
|
||||
#define smp_call_function_single(cpuid, func, info, retry, wait) \
|
||||
#define smp_call_function_single(cpuid, func, info, wait) \
|
||||
({ \
|
||||
WARN_ON(cpuid != 0); \
|
||||
local_irq_disable(); \
|
||||
@@ -112,7 +140,9 @@ static inline void smp_send_reschedule(int cpu) { }
|
||||
})
|
||||
#define smp_call_function_mask(mask, func, info, wait) \
|
||||
(up_smp_call_function(func, info))
|
||||
|
||||
static inline void init_call_single_data(void)
|
||||
{
|
||||
}
|
||||
#endif /* !SMP */
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user