在2.6.27中,有一个宏DEFINE_PER_CPU(类型,变量)来定义每个cpu变量。
我可以使用此宏在全局范围内定义变量。但如果它是一个结构中的变量,我在编译时会看到错误..
代表:
struct port_stats {
... ....
DEFINE_PER_CPU(long *, stats);
}
我看到的错误是..
* 错误:'per_cpu__stats'不允许使用section属性*
如果它在结构之外,那么相同的定义是可以的。不确定这个错误意味着什么。有什么建议 ?
答案 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);
。