2015-02-05 100 views
3

我需要創建一個內核模塊,以在計算機中的每個內核上啓用ARM PMU計數器。我無法設置cpu親和力。我試過sched_get_affinity,但顯然它只適用於用戶空間進程。我的代碼如下。有任何想法嗎?在可加載的Linux內核模塊上設置cpu親和力

#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, 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"); 
} 

回答

0

CPU親和力是在內核模塊而言毫無意義,只要我能看到你需要一個遍歷CPU的一個初始化PM。

像這樣:

​​
+1

了'for_each_cpu」不過,僅索引的CPU,這意味着對於每一個循環中,我使用的說明,將在當前正在使用的默認核心使用。即我將啓用核心0上的計數器兩次。如果我不在兩個內核上啓用它,那麼當我嘗試使用有關性能計數器的其他指令時,如果指令跳轉到其他計數器不在其他位置的內核,則有可能會收到「非法指令錯誤」啓用。 – 2015-02-06 13:09:23

+0

好的,我明白了,它似乎是開始時的on_each_cpu(_mask),以及來自每個CPU上線的熱插拔人員的東西。 – user4536444 2015-02-09 14:07:27

+0

每個CPU變成在線,對不起 好吧,規則34:[如何在每個CPU上運行代碼](http://stackoverflow.com/questions/17456812/how-to-run-code-on-every-cpu) – user4536444 2015-02-09 14:13:55