Bonjour,
Je cherche à lire les compteurs de performances pour un module externe. Pour cela j'ai trouvé les fonctions :
extern struct perf_event *perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu, struct task_struct *task, perf_overflow_handler_t callback);
et
extern u64 perf_event_read_value(struct perf_event *event, u64 *enabled, u64 *running);
dans ./include/linux/perf_event.h. Le problème c'est que les valeurs que je récupère avec perf_event_read_value sont (à priori) erronées...
J'ai récupéré un programme qui lit les registres en espace utilisateur et les valeurs ne sont pas les mêmes...
Dans cette exemple le module m'affiche des valeurs entre 300 et 700, total est toujours inférieurs à enabled et running. A chaque test enabled et running sont égaux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 static void perf_counter(unsigned int cpu){ struct perf_event_attr attr = { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_CPU_CLOCK }; u64 total=0, enabled=0, running=0; struct perf_event *evt = perf_event_create_kernel_counter(&attr, cpu, NULL, f_overflow); total = perf_event_read_value(evt, &enabled, &running); printk(KERN_INFO "cpufreq(%u): governor Govtest perf : %llu %llu %llu", cpu, total, enabled, running); }
Normalement je devrais avoir une valeur proche de 1 000 000 000. Enfin quand je dis proche, c'est à 100 000-200 000 près.
merci d'avance pour votre aide !






Répondre avec citation
Partager