一、 为什么要有 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() 不一致。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐