per_cpu的用法

作用

在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章