Linux内核2.6.27中的per-cpu变量定义

时间:2014-02-20 23:48:19

标签: linux linux-kernel

在2.6.27中,有一个宏DEFINE_PER_CPU(类型,变量)来定义每个cpu变量。

我可以使用此宏在全局范围内定义变量。但如果它是一个结构中的变量,我在编译时会看到错误..

代表:

struct port_stats {
    ... ....
    DEFINE_PER_CPU(long *, stats);
}

我看到的错误是..

* 错误:'per_cpu__stats'不允许使用section属性*

如果它在结构之外,那么相同的定义是可以的。不确定这个错误意味着什么。有什么建议 ?

1 个答案:

答案 0 :(得分:2)

如果要在Linux内核中的struct内定义per-cpu变量,则需要使其成为指向所需类型的指针(在本例中为long **__percpu属性:

struct port_stats {
    ... ....
    long __percpu **stats;
}

(在缺少__percpu宏的较旧内核上,只需将其声明为long **stats;,并注释它是指向每个cpu变量数组的指针。

然后,当您创建结构的实例时,使用alloc_percpu()分配per-cpu变量(可能会失败):

pstats->stats = alloc_percpu(long *);

if (!pstats->stats)
    return -ENOMEM;

要访问percpu实例,您需要使用get_cpu()put_cpu()

long **stats;

stats = per_cpu_ptr(pstats->stats, get_cpu());

/* Read or write *stats, the per-cpu (long *) value for this cpu */

put_cpu();

释放结构时,您还必须执行free_percpu(pstats->stats);