#include<linux/percpu.h>int*A;int*B;/*
* 每个CPU都拥有int大小的空间
* A并不一定是当前CPU拥有的
* int空间的地址,因此不直接调用。
*/
A =alloc_percpu(int);if(!A)return-ENOMEM;/* get_cpu() & put_cpu(),内部实现了禁止抢占 */
B =per_cpu_ptr(A,get_cpu());*B =1;put_cpu();/* 验证为什么不能直接使用A */printk(KERN_INFO "A = %p\n", A);printk(KERN_INFO "B = %p\n", B);free_percpu(A);
结构体中包含per-cpu变量:
#include<linux/percpu.h>typedefstructport_stats{.......long __percpu **stats;}long**stats;structport_stats pstats;
pstats.stats =alloc_percpu(long*);if(!pstats.stats)return-ENOMEM;
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);