本文将mark下Intel架构下TLB shutdown使用pause指令的相关notes。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void smp_call_function_many_cond(const struct cpumask *mask,
smp_call_func_t func, void *info,
unsigned int scf_flags,
smp_cond_func_t cond_func)
{
...
if (run_remote && wait) {
// 按顺序等各个cpu修改csd的flag,不然死等
for_each_cpu(cpu, cfd->cpumask) {
call_single_data_t *csd;

csd = per_cpu_ptr(cfd->csd, cpu);
csd_lock_wait(csd);
}
}
}

csd_lock_wait会调用到pause命令

1
2
3
4
csd_lock_wait
└── smp_cond_load_relaxed
└── cpu_relax
└── asm volatile("rep; nop")

rep;nop的机器码是f3 90,其实就是pause指令的机器码,相当于pause的一个”别名”。


参考资料:

  1. x86的cpu_relax解析