一、 为什么要有 per_cpu
1、 在多CPU的前提下,每个core有各自的数据,不会进行交互,但是对这些数据有共同的处理方法。
2、为了保持每个cpu独立的处理自己的任务,不给其他cpu带来困扰。对于共同结构的数据,进行per_cpu 编程处理,有自己私有的数据段。
3、如果没有 per_cpu 变量,当多个cpu要对同一个数据进行处理时,需要在处理时加锁,有了per_cpu,就省去了加锁步骤。
二、 几个 API
1、devm_alloc_percpu
#define devm_alloc_percpu(dev, type) \
((typeof(type) __percpu *)__devm_alloc_percpu((dev), sizeof(type), \
__alignof__(type)))
解释:动态分配PerCPU变量,返回指针。分配类型是type的per cpu变量,返回per cpu变量的地址(注意:不是各个CPU上的副本)
举例:在 a_func 函数中实现
struct sgo *sgo_array;
sgo_array = devm_alloc_percpu(dev, struct sgo);
动态分配一个 struct sgo 类型的 per_cpu变量。per_cpu 变量的类型是自己设定的。
2、per_cpu_ptr
per_cpu_ptr(ptr, cpu)
解释: 获取指定CPU上 percpu 变量的指针,percpu 变量指针作为参数,一般用于动态分配的 percpu 变量。
举例:在 b_func 中实现
在这之前,可以对 sgo_array 数据内容进行赋值,填充等
struct sgo *sgo_array_b = per_cpu_ptr(sgo_array, smp_processor_id());
获取第smp_processor_id()个cpu上的 sgo_array 这个 percpu 变量的指针 sgo_array_b 。
3、smp_processor_id
unsigned int smp_processor_id(void);
解释: 获取当前CPU的ID。
4、num_possible_cpus()
可用的 CPU 数量,因为热插拔的特性,这个宏得到的结果可能和 num_online_cpus() 不一致。