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...

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);
}
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.
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 !