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");
}
了'for_each_cpu」不過,僅索引的CPU,這意味着對於每一個循環中,我使用的說明,將在當前正在使用的默認核心使用。即我將啓用核心0上的計數器兩次。如果我不在兩個內核上啓用它,那麼當我嘗試使用有關性能計數器的其他指令時,如果指令跳轉到其他計數器不在其他位置的內核,則有可能會收到「非法指令錯誤」啓用。 – 2015-02-06 13:09:23
好的,我明白了,它似乎是開始時的on_each_cpu(_mask),以及來自每個CPU上線的熱插拔人員的東西。 – user4536444 2015-02-09 14:07:27
每個CPU變成在線,對不起 好吧,規則34:[如何在每個CPU上運行代碼](http://stackoverflow.com/questions/17456812/how-to-run-code-on-every-cpu) – user4536444 2015-02-09 14:13:55