percpu相关-cpu_number 变量和smp_processor_id
1、cpu_number
是一个 percpu 类型的 int 变量,
arch/arm64/include/asm/smp.h。
34 行,声明 percpu 变量 cpu_number . 在 arch/arm64/kernel/smp.c 中定义。
2、raw_smp_processor_id
43 行,就是读取 当前 运行 CPU 的,cpu_number 。 raw_cpu_ptr(ptr)的信息,参考
33 34DECLARE_PER_CPU_READ_MOSTLY(int, cpu_number); 35 36/* 37 * We don't use this_cpu_read(cpu_number) as that has implicit writes to 38 * preempt_count, and associated (compiler) barriers, that we'd like to avoid 39 * the expense of. If we're preemptible, the value can be stale at use anyway. 40 * And we can't use this_cpu_ptr() either, as that winds up recursing back 41 * here under CONFIG_DEBUG_PREEMPT=y. 42 */ 43#define raw_smp_processor_id() (*raw_cpu_ptr(&cpu_number))
arch/arm64/kernel/smp.c
56 57DEFINE_PER_CPU_READ_MOSTLY(int, cpu_number); 58EXPORT_PER_CPU_SYMBOL(cpu_number); 59
3、smp_processor_id
include/linux/smp.h
和raw_smp_processor_id 一样,得到当前cpu的 cpu_number 的值。
上面的 raw_smp_processor_id 是 arch 需要实现的函数,在 arch/arm64/include/asm/smp.h 中。smp_processor_id 则是 linux 平台需要实现的函数,在linux/smp.h 里面。
228#ifndef __smp_processor_id 229#define __smp_processor_id(x) raw_smp_processor_id(x) 230#endif 231 232#ifdef CONFIG_DEBUG_PREEMPT 233 extern unsigned int debug_smp_processor_id(void); 234# define smp_processor_id() debug_smp_processor_id() 235#else 236# define smp_processor_id() __smp_processor_id() 237#endif