2015-02-05 4 views
3

Мне нужно создать модуль ядра, который позволяет использовать счетчики ARM PMU на каждом ядре на компьютере. У меня проблемы с настройкой cpu. Ive попробовал sched_get_affinity, но, видимо, он работает только для процессов пользовательского пространства. Мой код ниже. Есть идеи?Установить привязку cpu на загружаемом модуле ядра Linux

#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

процессор сродства довольно бессмысленно с точки зрения модуля ядра, насколько я могу видеть, что Вы должны пройти один ЦП по одному для инициализации PM.

так:

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

'for_each_cpu», хотя, только индексирует процессоры, а это означает, что для каждого цикла, инструкции, которые я использую, будет использоваться на ядре по умолчанию, который используется в настоящее время. i.e i дважды включит счетчики на сердечнике 0. Если я не включу его на обоих ядрах, тогда, когда я пытаюсь использовать другие инструкции в отношении счетчиков производительности, есть вероятность, что я получу «ошибку незаконной инструкции», если инструкции перейдут на другое ядро, где счетчики не включен. –

+0

ОК, я вижу, похоже, что это начало on_each_cpu (_mask) в начале и что-то от сотрудников hotplug для каждого процессора, выходящего онлайн. – user4536444

+0

для каждого процессора становится онлайн, извините ну, правило 34: [Как запустить код на каждом CPU] (http://stackoverflow.com/questions/17456812/how-to-run-code-on-every-cpu) – user4536444

 Смежные вопросы

  • Нет связанных вопросов^_^