IPI通信(SMP)
IPI(Interrupt-Procecesorr Interrupt): 处理中间的中断
主要应用是一个处理器让另一个处理器做特定的事情(function和sched)
1 | +---------------------------+-+ |
在多核处理器中,每一个CPU核有一个mailbox
(相当于邮箱),如果需要进行IPI通信时,其主要通过IPI的中断实现。假设CPU0需要给CPU1发送一个action
(action
I的类型:SMP_CALL_FUNCTION
,SMP_RESCHEDULE_YOURSELF
等)时, 只需要CPU0向CPU1的mailbox
中写于action
的id(相当于信),此时CPU1将产生一个IPI中断(表明收到信),mailbox
的中断处理程序将读取mailbox
(相当于看信)中的action
,判断action
的类型进行相应的处理。
MIPS架构下的IPI通信
- 关闭中断后还会发送IPI
MIPS接口
1 | struct plat_smp_ops { |
IPI通信就是多个处理器之间的
交流
。send_ipi_single
: 一对一聊天send_ipi_mask
: 群发,mask表示群发的成员(CPU)
action类型
1 |
|
file: arch/mips/include/asm/smp.h
- 不同的action(活动)何时将产生?
- 各自都有什么作用?
SMP_RESCHEDULE_YOURSELF
SMP_RESCHEDULE_YOURSELF
将直接调用scheduler_ipi
.将任务插入目标CPU的运行队列。
1 | /* |
file: arch/mips/include/asm/smp.h
SMP_CALL_FUNCTION
SMP_CALL_FUNCTION
:将特定的函数在目标CPU上运行
- 内核回调接口:
1
2
3
4
5
6
7
8
9
10
11
12
13static inline void arch_send_call_function_single_ipi(int cpu)
{
extern struct plat_smp_ops *mp_ops; /* private */
mp_ops->send_ipi_mask(&cpumask_of_cpu(cpu), SMP_CALL_FUNCTION);
}
static inline void arch_send_call_function_ipi_mask(const struct cpumask *mask)
{
extern struct plat_smp_ops *mp_ops; /* private */
mp_ops->send_ipi_mask(mask, SMP_CALL_FUNCTION);
}file: arch/mips/include/asm/smp.h
1 | /* |
file: kernel/smp.c
刷新TLB
多核进行TLB的同步?