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

你可能感兴趣的:(内核)