在可加载的Linux内核模块上设置cpu affinity

我需要创建一个内核模块,在计算机的每个核心上启用ARM PMU计数器。 我在设置cpu亲和性时遇到问题。 我试过sched_get_affinity ,但显然,它只适用于用户空间进程。 我的代码如下。 有任何想法吗?

  #define _GNU_SOURCE #include  /* Needed by all modules */ #include  /* Needed for KERN_INFO */ int init_module(void){ unsigned reg; /* enable user-mode access to the performance counters*/ asm volatile("MRC p15, 0, %0, C9, C14, 0\n\t" : "=r"(reg)); reg |= 1; asm volatile("MCR p15, 0, %0, C9, C14, 0\n\t" :: "r"(reg)); printk(KERN_INFO "User mode Performance Counters are enabled.\n",reg); return 0; } void cleanup_module(void){ unsigned reg; /* disable user-mode access to the performance counters*/ asm volatile("MRC p15, 0, %0, C9, C14, 0\n\t" : "=r"(reg)); reg &= (~0 << 1); asm volatile("MCR p15, 0, %0, C9, C14, 0\n\t" :: "r"(reg)); printk(KERN_INFO "User mode Performance Counters are disabled.\n"); } 

就内核模块而言,cpu亲和力是毫无意义的,据我所知,你需要逐个遍历cpus来初始化PM。

像这样:

 for_each_cpu(cpu, mask) include/linux/cpumask.h +152