c-在可加载的linux内核模块上设置cpu相关性



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

 #define _GNU_SOURCE
 #include <linux/module.h>  /* Needed by all modules */
 #include <linux/kernel.h>  /* 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, 0nt" : "=r"(reg));
        reg |= 1;
        asm volatile("MCR p15, 0, %0, C9, C14, 0nt" :: "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, 0nt" : "=r"(reg));
    reg &= (~0 << 1);
    asm volatile("MCR p15, 0, %0, C9, C14, 0nt" :: "r"(reg));

    printk(KERN_INFO "User mode Performance Counters are disabled.n");
}

cpu亲和性在内核模块方面非常没有意义,据我所见,您需要逐个遍历cpu来初始化PM。

像这样:

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

最新更新