作用
在Linux操作系统中,特别是针对SMP或者NUMA架构的多CPU系统的时候,描述每个CPU的私有数据的时候,Linux操作系统提供了per_cpu机制。per_cpu机制就是让每个CPU都有自己的私有数据段,便于保护与访问。
声明
DEFINE_PER_CPU(struct cpuidle_device *, cpuidle_devices);
如何存取每个CPU的私有变量?
/**
* __cpuidle_register_device - internal register function called before register
* and enable routines
* @dev: the cpu
*
* cpuidle_lock mutex must be held before this is called
*/
static int __cpuidle_register_device(struct cpuidle_device *dev)
{
int ret;
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev);
if (!try_module_get(drv->owner))
return -EINVAL;
per_cpu(cpuidle_devices, dev->cpu) = dev; /* 获取dev->cpu的“私有”变量cpuidle_devices,并为其赋值为dev */
list_add(&dev->device_list, &cpuidle_detected_devices);
ret = cpuidle_coupled_register_device(dev);
if (ret)
__cpuidle_unregister_device(dev);
else
dev->registered = 1;
return ret;
}
通过per_cpu(var, cpu)宏来获取,cpu是int型,代表CPU index;var代表将要访问的CPU的那一份数据(变量)。
上面例子的截取自:drivers\cpuidle\cpuidle.c,在多核系统中,每个CPU会对应一个cpuidle_device,因此cpuidle_register_device每被执行一次,就会注册一个不同的设备。如果cpuidle需要将它们分别记录下来,就要借助per-CPU变量。使用方法如下:per_cpu(cpuidle_devices, dev->cpu) = dev
参考链接
https://www.cnblogs.com/M-book/archive/2011/08/24/2152057.html