作用
在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