Provided by: manpages-fr-dev_4.15.0-9_all bug

NOM

       perf_event_open - Définir la surveillance des performances

SYNOPSIS

       #include <linux/perf_event.h>    /* Definition of PERF_* constants */
       #include <linux/hw_breakpoint.h> /* Definition of HW_* constants */
       #include <sys/syscall.h>         /* Definition of SYS_* constants */
       #include <unistd.h>

       int syscall(SYS_perf_event_open, struct perf_event_attr *attr,
                   pid_t pid, int cpu, int group_fd, unsigned long flags);

       Note:   glibc  provides  no  wrapper  for  perf_event_open(),  necessitating  the  use  of
       syscall(2).

DESCRIPTION

       À partir d'une liste de paramètres, perf_event_open() renvoie un descripteur  de  fichier,
       pour  une  utilisation  dans  les  appels  système  suivants  (read(2), mmap(2), prctl(2),
       fcntl(2), etc.).

       Un appel de perf_event_open() crée un descripteur de fichier qui  permet  de  mesurer  les
       renseignements  de performance. Tous les descripteurs de fichier correspondent chacun à un
       événement  mesuré ;  ils  peuvent  être  regroupés  pour  mesurer   plusieurs   événements
       simultanément.

       Les événements peuvent être activés et désactivés de deux façons : à l'aide de ioctl(2) ou
       de prctl(2). Quand un événement est désactivé, il ne décompte ni ne génère de dépassement,
       mais continue vraiment d'exister et maintient sa valeur de décompte.

       Les  événements sont de deux types : comptage et échantillonnage. Un événement de comptage
       sert à comptabiliser le nombre total d'événements  qui  se  produisent.  En  général,  les
       résultats  d'un  événement de comptage sont recueillis avec un appel read(2). Un événement
       d'échantillonnage écrit périodiquement les mesures dans un tampon qui  peut  ensuite  être
       accédé à l'aide de mmap(2).

   Arguments
       Les  arguments  pid  et  cpu  permettent  d’indiquer  le  processus  et  le  processeur  à
       surveiller :

       pid == 0 et cpu == -1
              Cela mesure le processus ou thread appelant sur tous les processeurs.

       pid == 0 et cpu >= 0
              Cela ne mesure le processus ou thread appelant que s’il est  en  cours  d’exécution
              sur le processeur indiqué.

       pid > 0 et cpu == -1
              Cela mesure le processus ou thread indiqué sur tous les processeurs.

       pid > 0 et cpu >= 0
              Cela ne mesure le processus ou thread indiqué que s’il est en cours d’exécution sur
              le processeur indiqué.

       pid == -1 et cpu >= 0
              Cela mesure tous les processus et threads du processeur indiqué. Cela nécessite  la
              capacité   CAP_PERFMON   (depuis   Linux 5.8)   ou   CAP_SYS_ADMIN  ou  une  valeur
              /proc/sys/kernel/perf_event_paranoid strictement inférieure à 1.

       pid == -1 et cpu == -1
              Ce réglage est incorrect et renverra une erreur.

       Quand pid est supérieur à zéro, le droit  d'effectuer  cet  appel  système  est  géré  par
       CAP_PERFMON  (depuis  Linux 5.9)  et  une  vérification PTRACE_MODE_READ_REALCREDS du mode
       d'accès ptrace sur les anciennes versions du noyau ; voir ptrace(2).

       L'argument group_fd permet aux groupes d'événements d'être créés. Un groupe d'événements a
       un  événement  qui est le leader de groupe. Le leader est d'abord créé avec group_fd = -1.
       Les autres membres du groupe sont créés par les appels  perf_event_open()  suivants,  avec
       group_fd  défini  au  descripteur de fichier du leader de groupe (un événement unique créé
       avec group_fd = -1 est considéré comme formant un groupe d'un seul membre).  Un  événement
       de  groupe  est  programmé  dans  le  processeur  comme  un  bloc : il ne sera mis dans le
       processeur que si tous les événements du groupe peuvent être mis dans le processeur.  Cela
       veut  dire  que  les  valeurs  des  événements  de tous les membres peuvent être comparées
       — ajoutées,  divisées  (pour   obtenir   des   rapports), etc. —   ensemble   de   manière
       significative,  puisqu'elles  ont  compté  les  événements  pendant les mêmes instructions
       exécutées.

       L'argument flags est constitué  d’un  OU  binaire  entre  une  ou  plusieurs  des  valeurs
       suivantes.

       PERF_FLAG_FD_CLOEXEC (depuis Linux 3.14)
              Cet  attribut active l’attribut « close-on-exec » pour le descripteur de fichier de
              l’événement créé, de telle sorte que le descripteur de fichier est  automatiquement
              fermé  par  execve(2). L’attribution de « close-on-exec » au moment de la création,
              plutôt qu’ensuite avec fcntl(2), évite de potentielles situations de compétition où
              le  thread  appelant invoque perf_event_open() et fcntl() en même temps qu’un autre
              thread appelle fork(2) puis execve(2).

       PERF_FLAG_FD_NO_GROUP
              Cet  attribut  dit  à  l'événement  d'ignorer  le  paramètre  group_fd,  sauf  pour
              initialiser    la    redirection    de    la   sortie   en   utilisant   l'attribut
              PERF_FLAG_FD_OUTPUT.

       PERF_FLAG_FD_OUTPUT (cassé depuis Linux 2.6.35)
              Cet attribut redirige la sortie échantillonnée de l'événement vers le  tampon  mmap
              de l'événement indiqué par group_fd.

       PERF_FLAG_PID_CGROUP (depuis Linux 2.6.39)
              Cet attribut active la surveillance par conteneur sur tout le système. Un conteneur
              est une abstraction qui isole un ensemble de ressources à contrôler  plus  finement
              (processeurs,  mémoire, etc.).  Dans  ce  mode,  l'événement n'est mesuré que si le
              thread  exécuté  sur  le  processeur  surveillé  appartient  au  conteneur  désigné
              (cgroup).  Le  cgroup est identifié en passant un fichier au descripteur de fichier
              ouvert sur son répertoire dans le système de fichiers cgroupfs. Par exemple, si  le
              cgroup  à  surveiller  est  appelé test, alors un descripteur de fichier ouvert sur
              /dev/cgroup/test (en supposant que cgroupfs est monté sur  /dev/cgroup)  doit  être
              passé  au  paramètre  pid.  La surveillance de cgroup n'est disponible que pour les
              événements  sur  tout  le  système  et  pourrait   donc   nécessiter   des   droits
              supplémentaires.

       La  structure  perf_event_attr  fournit des renseignements de configuration détaillés pour
       les événements en cours de création.

           struct perf_event_attr {
               __u32 type;         /* Type d'événement */
               __u32 size;         /* Taille de la structure d'attributs */
               __u64 config;       /* Configuration spécifique au type */

               union {
                   __u64 sample_period;    /* Période d'échantillonnage */
                   __u64 sample_freq;      /* Fréquence d'échantillonnage */
               };

               __u64 sample_type;  /* Indique les valeurs incluses dans
                                      l’échantillon */
               __u64 read_format;  /* Indique les valeurs renvoyées en
                                      lecture */

               __u64 disabled       : 1,   /* désactivé par défaut */
                     inherit        : 1,   /* les enfants en héritent */
                     pinned         : 1,   /* doit toujours être en PMU */
                     exclusive      : 1,   /* ne regrouper qu'en PMU */
                     exclude_user   : 1,   /* ne pas compter l'utilisateur */
                     exclude_kernel : 1,   /* ne pas compter le noyau */
                     exclude_hv     : 1,   /* ne pas compter l'hyperviseur */
                     exclude_idle   : 1,   /* ne pas compter quand inactif */
                     mmap           : 1,   /* inclure les données mmap */
                     comm           : 1,   /* inclure les données comm */
                     freq           : 1,   /* utiliser la fréquence, pas la
                                              période */
                     inherit_stat   : 1,   /* décomptes par tâche */
                     enable_on_exec : 1,   /* prochain exec activé */
                     task           : 1,   /* tracer la création d’enfant
                                              et la fin */
                     watermark      : 1,   /* wakeup_watermark */
                     precise_ip     : 2,   /* contrainte de dérapage */
                     mmap_data      : 1,   /* données mmap non exécutées */
                     sample_id_all  : 1,   /* tous les événements sample_type */
                     exclude_host   : 1,   /* ne pas compter dans l'hôte */
                     exclude_guest  : 1,   /* ne pas compter dans l'invité */
                     exclude_callchain_kernel : 1,
                                           /* exclure les appels en chaîne
                                              du noyau */
                     exclude_callchain_user   : 1,
                                           /* exclure les appels en chaîne
                                              d’utilisateur */
                     mmap2          :  1,  /* inclure mmap avec les données d'inœud */
                     comm_exec      :  1,  /* événements flag comm devant être
                                              exécutés */
                     use_clockid    :  1,  /* utiliser clockid pour les champs de temps */
                     context_switch :  1,  /* données de changement de contexte */
                     write_backward :  1,  /* Écrire le tampon circulaire de la fin
                                              vers le début */
                     namespaces     :  1,  /* inclure les données des espaces de noms */
                     ksymbol        :  1,  /* inclure les événements ksymbol */
                     bpf_event      :  1,  /* inclure les événements BPF */
                     aux_output     :  1,  /* générer les enregistrements AUX au lieu des
                                              événements */
                     cgroup         :  1,  /* inclure les événements cgroup */
                     text_poke      :  1,  /* inclure les événements de poke de texte */

                     __reserved_1   : 30;

               union {
                   __u32 wakeup_events;    /* réveil tous les n événements */
                   __u32 wakeup_watermark; /* octets avant le réveil */
               };

               __u32     bp_type;          /* type de point d'arrêt */

               union {
                   __u64 bp_addr;          /* adresse de point d'arrêt */
                   __u64 kprobe_func;      /* pour perf_kprobe */
                   __u64 uprobe_path;      /* pour perf_uprobe */
                   __u64 config1;          /* extension de config */
               };

               union {
                   __u64 bp_len;           /* taille de point d'arrêt */
                   __u64 kprobe_addr;      /* avec  kprobe_func == NULL */
                   __u64 probe_offset;     /* pour perf_[k,u]probe */
                   __u64 config2;          /* extension de config1 */
               };
               __u64 branch_sample_type;   /* enum perf_branch_sample_type */
               __u64 sample_regs_user;     /* registres utilisateur à renvoyer
                                              dans les échantillons */
               __u32 sample_stack_user;    /* taille de pile à renvoyer dans
                                              les échantillons */
               __s32 clockid;              /* horloge à utiliser pour les champs
                                              de temps */
               __u64 sample_regs_intr;     /* registres à renvoyer dans les
                                              échantillons */
               __u32 aux_watermark;        /* octets supp. avant le réveil */
               __u16 sample_max_stack;     /* nombre maximal de trames dans la
                                              chaîne d'appel */
               __u32 __reserved_2;         /* aligner sur u64 */

           };

       Les champs de la structure perf_event_attr sont décrits en détail ci-dessous.

       type   Ce champ indique le type d'événement dans  son  ensemble.  Il  a  une  des  valeurs
              suivantes :

              PERF_TYPE_HARDWARE
                     Cela  indique  un  des  événements  matériels « généralisés » fournis par le
                     noyau. Consultez la définition du champ config pour plus de précisions.

              PERF_TYPE_SOFTWARE
                     Cela indique un des événements logiciels  fournis  par  le  noyau  (même  si
                     aucune prise en charge matérielle n'est disponible).

              PERF_TYPE_TRACEPOINT
                     Cela indique un point de trace fourni par l'infrastructure de point de trace
                     du noyau.

              PERF_TYPE_HW_CACHE
                     Cela indique un événement de cache matériel. Cela a un encodage  particulier
                     décrit dans la définition du champ config.

              PERF_TYPE_RAW
                     Cela  indique  un  événement  « brut » spécifique à l'implémentation dans le
                     champ config.

              PERF_TYPE_BREAKPOINT (depuis Linux 2.6.33)
                     Cela indique un point d'arrêt matériel tel que fourni par le processeur. Les
                     points d'arrêt peuvent être des accès en lecture ou écriture sur une adresse
                     ainsi que l'exécution d'une adresse d'instruction.

              PMU dynamique
                     Depuis Linux 2.6.38, perf_event_open() permet de gérer plusieurs  PMU.  Pour
                     activer  cela,  une  valeur exportée par le noyau peut être utilisée dans le
                     champ type pour indiquer la  PMU  à  utiliser.  La  valeur  à  utiliser  est
                     trouvable  dans le système de fichiers sysfs : un sous-répertoire existe par
                     instance PMU sous /sys/bus/event_source/devices. Le fichier type dans chaque
                     sous-répertoire contient un entier qui peut être utilisé dans le champ type.
                     Par exemple, /sys/bus/event_source/devices/cpu/type contient  la  valeur  de
                     PMU du processeur principal, c'est-à-dire 4 en général.

              kprobe et uprobe (depuis Linux 4.17)
                     Ces  deux  PMU  dynamiques  créent  un  kprobe/uprobe  et le rattachent à un
                     descripteur  de  fichier  généré  par  perf_event_open.  kprobe/uprobe  sera
                     détruit  lors  de  la destruction du descripteur de fichier. Voir les champs
                     kprobe_func, uprobe_path, kprobe_addr et probe_offset pour plus de détails.

       size   La taille  de  la  structure  perf_event_attr  pour  compatibilités  ascendante  et
              descendante.   Définissez-la   en  utilisant  sizeof(struct  perf_event_attr)  pour
              permettre au noyau de voir la taille de struct au moment de la compilation.

              Le PERF_ATTR_SIZE_VER0 relatif est défini à 64 ; c'était la taille de  la  première
              struct  publiée.  PERF_ATTR_SIZE_VER1 est 72, correspondant à l'addition des points
              d'arrêts dans Linux 2.6.33. PERF_ATTR_SIZE_VER2 est 80, correspondant à  l'addition
              d'échantillonnage   de  branchement  dans  Linux 3.4.  PERF_ATR_SIZE_VER3  est  96,
              correspondant à l'addition de sample_regs_user et sample_stack_user dans Linux 3.7.
              PERF_ATTR_SIZE_VER4  vaut  104,  correspondant  à  l'ajout de sample_regs_intr dans
              Linux 3.19. PERF_ATTR_SIZE_VER5 vaut 112, correspondant à l'ajout de  aux_watermark
              dans Linux 4.1.

       config Cela  indique  l'événement  voulu,  en  conjonction  avec le champ type. Les champs
              config1 et config2 sont aussi pris en compte dans les cas où 64 bits  ne  suffisent
              pas  pour  spécifier  complètement  l'événement. L'encodage de ces champs dépend de
              l'événement.

              Le champ config peut être défini de différentes façons, en fonction de la valeur du
              champ  type précédemment décrit. Suivent les divers réglages possibles pour config,
              distingués par type.

              Si type est PERF_TYPE_HARDWARE, un des événements  processeur  matériel  généralisé
              est mesuré. Ils ne sont pas tous disponibles sur toutes les plateformes. Définissez
              config à une des valeurs suivantes :

                   PERF_COUNT_HW_CPU_CYCLES
                          Nombre total de cycles.  Méfiez-vous  de  ce  qui  arrive  lors  de  la
                          variation de fréquence du processeur.

                   PERF_COUNT_HW_INSTRUCTIONS
                          Instructions  retirées.  Prenez garde, elles peuvent être affectées par
                          plusieurs  problèmes,  en  particulier  les  décomptes  d'interruptions
                          matérielles.

                   PERF_COUNT_HW_CACHE_REFERENCES
                          Accès  au cache. En général, cela indique les accès au cache de dernier
                          niveau, mais cela peut dépendre du processeur.  Cela  pourrait  inclure
                          des messages de prélecture et de cohérence ; cela dépend toujours de la
                          conception du processeur.

                   PERF_COUNT_HW_CACHE_MISSES
                          Absences dans le cache. Cela indique généralement les absences dans  le
                          cache  de  dernier  niveau, c'est destiné à être utilisé en conjonction
                          avec l'événement PERF_COUNT_HW_CACHE_REFERENCES pour calculer  le  taux
                          d’absence du cache.

                   PERF_COUNT_HW_BRANCH_INSTRUCTIONS
                          Instructions   de   branchements   retirés.  Avant  Linux 2.6.34,  cela
                          utilisait l’événement incorrect sur les processeurs AMD.

                   PERF_COUNT_HW_BRANCH_MISSES
                          Instructions de branchements mal prédits.

                   PERF_COUNT_HW_BUS_CYCLES
                          Cycles de bus, ce qui peut être différent du décompte total de cycles.

                   PERF_COUNT_HW_STALLED_CYCLES_FRONTEND (depuis Linux 3.0)
                          Cycles bloqués pendant un problème.

                   PERF_COUNT_HW_STALLED_CYCLES_BACKEND (depuis Linux 3.0)
                          Cycles bloqués pendant un retrait.

                   PERF_COUNT_HW_REF_CPU_CYCLES (depuis Linux 3.3)
                          Nombre total de cycles ; non affecté par la variation de  fréquence  du
                          processeur.

              Si  type est PERF_TYPE_SOFTWARE, les événements logiciels fournis par le noyau sont
              mesurés. Définissez config à une des valeurs suivantes :

                   PERF_COUNT_SW_CPU_CLOCK
                          Cela rend compte de  l'horloge  du  processeur,  un  temporisateur  par
                          processeur à haute résolution.

                   PERF_COUNT_SW_TASK_CLOCK
                          Cela   rend  compte  de  l'horloge  spécifique  à  la  tâche  en  cours
                          d'exécution.

                   PERF_COUNT_SW_PAGE_FAULTS
                          Cela rend compte du nombre d'erreurs de pagination.

                   PERF_COUNT_SW_CONTEXT_SWITCHES
                          Cela compte les changements  de  contexte.  Jusqu'à  Linux 2.6.34,  ils
                          étaient  tous  signalés comme des événements en espace utilisateur, ils
                          sont maintenant signalés comme ayant lieu dans le noyau.

                   PERF_COUNT_SW_CPU_MIGRATIONS
                          Cela rend compte du nombre de fois où le  processus  a  migré  vers  un
                          nouveau processeur.

                   PERF_COUNT_SW_PAGE_FAULTS_MIN
                          Cela compte le nombre d'erreurs mineures de pagination. Elles n'ont pas
                          nécessité d'entrées ou sorties du disque pour les traiter.

                   PERF_COUNT_SW_PAGE_FAULTS_MAJ
                          Cela compte le nombre  d'erreurs  majeures  de  pagination.  Elles  ont
                          nécessité des entrées ou sorties de disque pour les traiter.

                   PERF_COUNT_SW_ALIGNMENT_FAULTS (depuis Linux 2.6.33)
                          Cela  compte  le  nombre  de  défauts  d'alignement.  Ils ont lieu lors
                          d'accès non alignés en mémoire ; le noyau peut les  traiter  mais  cela
                          réduit  les performances. Cela n'arrive que sur certaines architectures
                          (jamais sur x86).

                   PERF_COUNT_SW_EMULATION_FAULTS (depuis Linux 2.6.33)
                          Cela compte le nombre  de  défauts  d'émulation.  Le  noyau  intercepte
                          parfois  des  instructions  non implémentées et les émule pour l'espace
                          utilisateur.  Cela  peut  avoir  des  conséquences  négatives  sur  les
                          performances.

                   PERF_COUNT_SW_DUMMY (depuis Linux 3.12)
                          C’est   un   événement   fictif   qui   ne   compte   rien.  Les  types
                          d’enregistrement  d’échantillonnage  informatif  comme  mmap  ou   comm
                          doivent  être  associés  à  un  événement  actif. Cet événement factice
                          permet  de  récupérer  ce  genre  d’enregistrements   sans   nécessiter
                          d’événement de comptage.

              Si  type est PERF_TYPE_TRACEPOINT, alors les points de trace du noyau sont mesurés.
              La valeur à utiliser dans config peut être obtenue depuis tracing/events/*/*/id  de
              debugfs si ftrace est activé dans le noyau.

              Si  type est PERF_TYPE_HW_CACHE, alors un événement de cache du processeur matériel
              est mesuré. Utilisez l'équation suivante pour calculer la valeur config appropriée.

                      config = (perf_hw_cache_id) |
                               (perf_hw_cache_op_id << 8) |
                               (perf_hw_cache_op_result_id << 16);

                  où perf_hw_cache_id peut être :

                      PERF_COUNT_HW_CACHE_L1D
                             pour mesurer le cache de données de niveau 1 ;

                      PERF_COUNT_HW_CACHE_L1I
                             pour mesurer le cache d'instructions de niveau 1 ;

                      PERF_COUNT_HW_CACHE_LL
                             pour mesurer le cache de dernier niveau ;

                      PERF_COUNT_HW_CACHE_DTLB
                             pour mesurer les données TLB ;

                      PERF_COUNT_HW_CACHE_ITLB
                             pour mesurer les instructions TLB ;

                      PERF_COUNT_HW_CACHE_BPU
                             pour mesurer l'unité de prédiction de branchement ;

                      PERF_COUNT_HW_CACHE_NODE (depuis Linux 3.1)
                             pour mesurer les accès à la mémoire locale.

                  et perf_hw_cache_op_id est parmi :

                      PERF_COUNT_HW_CACHE_OP_READ
                             pour les accès en lecture ;

                      PERF_COUNT_HW_CACHE_OP_WRITE
                             pour les accès en écriture ;

                      PERF_COUNT_HW_CACHE_OP_PREFETCH
                             pour les accès de prélecture ;

                  et perf_hw_cache_op_result_id peut être :

                      PERF_COUNT_HW_CACHE_RESULT_ACCESS
                             pour mesurer les accès ;

                      PERF_COUNT_HW_CACHE_RESULT_MISS
                             pour mesurer les échecs.

              Si type est PERF_TYPE_RAW, alors une  valeur  config  « brute »  personnalisée  est
              nécessaire.  La  plupart  des  processeurs  gèrent  les  événements qui ne sont pas
              couverts  par  les   événements   « généralisés ».   Ceux-ci   sont   définis   par
              l'implémentation ;  consultez le manuel du processeur (par exemple la documentation
              Intel Volume 3B ou le guide du développeur de BIOS et noyau AMD).  La  bibliothèque
              libpfm4  peut  être utilisée pour traduire le nom, dans les manuels architecturaux,
              en valeur hexadécimale brute que perf_event_open() attend dans ce champ.

              Si  type  est  PERF_TYPE_BREAKPOINT,  alors  laissez  config  défini  à  zéro.  Ses
              paramètres sont définis ailleurs.

              Si   type   est  kprobe  ou  uprobe,  définir  retprobe  (bit  0  de  config,  voir
              /sys/bus/event_source/devices/[k,u]probe/format/retprobe) pour kretprobe/uretprobe.
              Voir  les champs kprobe_func, uprobe_path, kprobe_addr et probe_offset pour plus de
              détails.

       kprobe_func, uprobe_path, kprobe_addr et probe_offset
              Ces champs décrivent les kprobe/uprobe pour les PMU dynamiques  kprobe  et  uprobe.
              Pour  kprobe  utilisez kprobe_func et probe_offset ou alors utilisez kprobe_addr et
              laissez  le  champ  kprobe_func  à  NULL.  Pour  uprobe,  utilisez  uprobe_path  et
              probe_offset.

       sample_period, sample_freq
              Un  compteur  d'« échantillonnage » génère une notification de dépassement tous les
              N événements, où N est donné par sample_period.  Un  compteur  d'échantillonnage  a
              sample_period > 0.   Quand  un  dépassement  arrive,  les  données  demandées  sont
              enregistrées dans le tampon mmap. Le champ sample_type  contrôle  les  données  qui
              sont enregistrées à chaque dépassement.

              sample_freq  permet  d'utiliser  la  fréquence  au lieu de la période. Dans ce cas,
              l'attribut freq doit être défini. Le noyau ajustera  la  période  d'échantillonnage
              pour essayer d'atteindre le taux voulu. Le taux d'ajustement est un tic d'horloge.

       sample_type
              Les  divers  bits  de  ce champ indiquent les valeurs à inclure dans l'échantillon.
              Elles  seront  enregistrées  dans  un  tampon  circulaire,  disponible  en   espace
              utilisateur  avec mmap(2). L'ordre de sauvegarde des valeurs dans l'échantillon est
              documenté dans la sous-section Disposition MMAP ci-dessous ; ce n'est  pas  l'ordre
              enum perf_event_sample_format.

              PERF_SAMPLE_IP
                     Enregistrement de pointeur d'instruction.

              PERF_SAMPLE_TID
                     Enregistrement des identifiants de processus et de thread.

              PERF_SAMPLE_TIME
                     Enregistrement d'un horodatage.

              PERF_SAMPLE_ADDR
                     Enregistrement d'une adresse, si applicable.

              PERF_SAMPLE_READ
                     Enregistrement  des  valeurs de décompte de tous les événements d'un groupe,
                     pas seulement du leader de groupe.

              PERF_SAMPLE_CALLCHAIN
                     Enregistrement de l'appel en chaîne (backtrace de pile).

              PERF_SAMPLE_ID
                     Enregistrement d'un identifiant unique pour le leader de groupe d'événements
                     ouvert.

              PERF_SAMPLE_CPU
                     Enregistrement de numéro de processeur.

              PERF_SAMPLE_PERIOD
                     Enregistrement de la période d'échantillonnage actuelle.

              PERF_SAMPLE_STREAM_ID
                     Enregistrement    d'un   identifiant   unique   pour   l'événement   ouvert.
                     Contrairement à PERF_SAMPLE_ID, le véritable identifiant  est  renvoyé,  pas
                     celui du leader de groupe. Cet identifiant est le même que celui renvoyé par
                     PERF_FORMAT_ID.

              PERF_SAMPLE_RAW
                     Enregistrement  de  données  supplémentaires,  si  applicable.   Normalement
                     renvoyées par les événements de point de trace.

              PERF_SAMPLE_BRANCH_STACK (depuis Linux 3.4)
                     Cela  fournit  un  enregistrement des derniers branchements tels que fournis
                     par le matériel d’échantillonnage de branchement processeur  (comme  le  LBR
                     – Last  Branch  Record –  d’Intel).  Les  matériels  ne prennent pas tous en
                     charge cette fonctionnalité.

                     Consultez  le  champ  branch_sample_type  pour  la  façon  de  filtrer   les
                     branchements signalés.

              PERF_SAMPLE_REGS_USER (depuis Linux 3.7)
                     Enregistrement de l’état actuel du registre processeur au niveau utilisateur
                     (les valeurs dans le processus avant d’appeler le noyau).

              PERF_SAMPLE_STACK_USER (depuis Linux 3.7)
                     Enregistrement de la pile au niveau utilisateur, permettant le défilement de
                     la pile.

              PERF_SAMPLE_WEIGHT (depuis Linux 3.10)
                     Enregistrement  d’une valeur de poids fournie par le matériel qui exprime le
                     coût de l’événement d’échantillonnage. Cela permet au matériel de mettre  en
                     valeur les événements coûteux dans un profil.

              PERF_SAMPLE_DATA_SRC (depuis Linux 3.10)
                     Enregistrement des sources de données : d’où viennent, dans la hiérarchie de
                     mémoire, les données associées à l’instruction d’échantillonnage.  Ce  n’est
                     disponible   que   si   le   matériel  sous-jacent  prend  en  charge  cette
                     fonctionnalité.

              PERF_SAMPLE_IDENTIFIER (depuis Linux 3.12)
                     Placement de la valeur SAMPLE_ID à un endroit fixe de l’enregistrement, soit
                     au début (pour les événements d’échantillonnage), soit à la fin (si ce n’est
                     pas un événement d’échantillonnage).

                     C’était nécessaire parce qu’un flux  d’échantillonnage  pourrait  avoir  des
                     enregistrements  provenant  de  différentes  sources  d’événements  avec des
                     réglages de sample_type différents. L’analyse correcte du flux  d’événements
                     n’était   pas  possible  parce  que  le  format  de  l’enregistrement  était
                     nécessaire pour trouver SAMPLE_ID, mais le format ne pouvait pas être trouvé
                     sans  savoir  à quel événement l’échantillonnage appartenait (provoquant une
                     dépendance circulaire).

                     Ce nouveau réglage PERF_SAMPLE_IDENTIFIER rend le flux d’événements toujours
                     analysable  en  plaçant  SAMPLE_ID  à une position fixe, même si cela a pour
                     conséquence de dupliquer les valeurs SAMPLE_ID dans les enregistrements.

              PERF_SAMPLE_TRANSACTION (depuis Linux 3.13)
                     Enregistrement  des  raisons  pour  les  événements  d’abandon  de   mémoire
                     transactionnelle  (venant  par  exemple  de  la  prise  en charge de mémoire
                     transactionnelle TSX Intel).

                     Le réglage precise_ip doit être positif et un événement d’abandon de mémoire
                     transactionnelle  doit  être mesuré sinon aucune valeur ne sera enregistrée.
                     Remarquez également que certaines mesures perf_event, comme le  comptage  de
                     cycles d’échantillonnage, peuvent provoquer des abandons supplémentaires (en
                     provoquant une interruption lors d’une transaction).

              PERF_SAMPLE_REGS_INTR (depuis Linux 3.19)
                     Enregistrer un sous-ensemble de l'état  actuel  du  registre  du  processeur
                     comme  indiqué  par sample_regs_intr. Contrairement à PERF_SAMPLE_REGS_USER,
                     les valeurs du registre  renverront  l'état  du  registre  du  noyau  si  le
                     dépassement  s'est  produit  alors  que  le  code  du  noyau  est  en  cours
                     d'exécution. Si le processeur gère l'échantillonnage matériel de  l'état  du
                     registre  (à  savoir  PEBS  sur  Intel x86) et si precise_ip est supérieur à
                     zéro, les valeurs du  registre  renvoyées  sont  celles  récupérées  par  le
                     matériel au moment du retrait de l'instruction échantillonnée.

              PERF_SAMPLE_PHYS_ADDR (depuis Linux 4.13)
                     Enregistrer l'adresse physique des données comme avec PERF_SAMPLE_ADDR.

              PERF_SAMPLE_CGROUP (depuis Linux 5.7)
                     Enregistrer  (perf_event) l'identifiant cgroup du processus. Cela correspond
                     au champ id de l'événement PERF_RECORD_CGROUP.

       read_format
              Ce champ indique le format des données renvoyées par read(2) sur un descripteur  de
              fichier perf_event_open().

              PERF_FORMAT_TOTAL_TIME_ENABLED
                     Ajout  du  champ  time_enabled  de  64 bits. Cela peut servir à calculer les
                     totaux estimés si la PMU est surutilisée et qu'il y a multiplexage.

              PERF_FORMAT_TOTAL_TIME_RUNNING
                     Ajout du champ time_running de 64 bits. Cela peut servir pour  calculer  les
                     totaux estimés si la PMU est surutilisée et qu'il y a multiplexage.

              PERF_FORMAT_ID
                     Ajout d'une valeur unique de 64 bits qui correspond au groupe d’événements.

              PERF_FORMAT_GROUP
                     Permettre  à  toutes les valeurs de décompte d'un groupe d'événements d'être
                     lues en une seule lecture.

       disabled
              Le bit disabled indique si le compteur commence désactivé ou activé. Si  désactivé,
              l'événement peut être activé plus tard par ioctl(2), prctl(2) ou enable_on_exec.

              Lors  de la création d’un groupe d’événements, le leader de groupe est généralement
              initialisé avec disabled défini à 1 et tous les événements enfants sont initialisés
              avec  disabled  défini  à  0.  Bien  que disabled soit 0, les événements enfants ne
              démarrent pas avant que le leader de groupe ne soit activé.

       inherit
              Le bit inherit indique que le compteur devrait compter les  événements  des  tâches
              enfant  comme les tâches indiquées. Cela ne s'applique qu'aux nouveaux enfants, pas
              à ceux existants au moment où le compteur est créé (ni  aux  nouveaux  enfants  des
              enfants existants).

              L'héritage  ne  fonctionne  pas  pour  certaines combinaisons de read_format, comme
              PERF_FORMAT_GROUP.

       pinned Le bit pinned indique que le compteur devrait toujours être sur  le  processeur  si
              c'est  possible.  Cela  ne  s'applique  qu'aux compteurs matériels et seulement aux
              leaders de groupe. Si un compteur épinglé ne peut pas être mis dans  le  processeur
              (par  exemple  s'il n'y a pas assez de compteurs matériels ou en cas de confit avec
              n'importe quel autre événement), alors le compteur arrive en état d'« erreur »,  où
              les  lectures  renvoient  une  fin  de fichier (c'est-à-dire que read(2) renvoie 0)
              jusqu'à ce que le compteur soit ensuite activé ou désactivé.

       exclusive
              Le bit exclusive indique que si ce groupe du compteur est  sur  le  processeur,  il
              devrait  être  le  seul groupe utilisant les compteurs du processeur. Cela pourrait
              permettre à l'avenir de surveiller des programmes pour  gérer  les  fonctionnalités
              PMU qui doivent fonctionner seules, sans perturber d'autres compteurs matériels.

              Remarquez  que  de  nombreuses  situations  non  attendues  pourraient  empêcher de
              démarrer les événements avec le  bit  exclusive  défini.  Cela  concerne  tous  les
              utilisateurs  exécutant  des  mesures  au  niveau  du  système ainsi que toutes les
              utilisations par le noyau des compteurs de performance (y compris  l’interface  NMI
              Watchdog Timer habituellemen activée).

       exclude_user
              Si  ce bit est défini, le décompte exclut les événements qui arrivent dans l'espace
              utilisateur.

       exclude_kernel
              Si ce bit est défini, le décompte exclut les événements qui arrivent dans  l'espace
              du noyau.

       exclude_hv
              Si  ce  bit  est  défini,  le  décompte  exclut  les  événements  qui arrivent dans
              l'hyperviseur. C'est surtout pour les PMU avec prise en  charge  intégrée  de  leur
              traitement  (comme  POWER).  Une prise en charge supplémentaire est nécessaire pour
              traiter les mesures d'hyperviseur sur la plupart des machines.

       exclude_idle
              S'il est défini, ne pas décompter quand le processeur exécute la tâche inactive. Si
              vous  pouvez actuellement activer cela pour n'importe quel type d'événement, il est
              ignoré pour tous, sauf ceux de type logiciel.

       mmap   Le bit mmap active la génération des échantillons PERF_RECORD_MMAP  pour  tous  les
              appels  mmap(2)  qui  ont  PROT_EXEC défini. Cela permet aux outils de remarquer le
              nouveau  code  exécutable  en  train  d’être  associé  dans   un   programme   (les
              bibliothèques  partagées  dynamiques  par  exemple) de telle sorte que les adresses
              peuvent être réassociées au code d’origine.

       comm   The comm bit enables tracking of process command name as modified by the  execve(2)
              and  prctl(PR_SET_NAME)  system calls as well as writing to /proc/self/comm. If the
              comm_exec flag is also successfully set (possible since Linux 3.16), then the  misc
              flag  PERF_RECORD_MISC_COMM_EXEC  can  be  used to differentiate the execve(2) case
              from the others.

       freq   Si ce bit est activé, alors sample_frequency est utilisé au lieu  de  sample_period
              lors du réglage de l'intervalle d'échantillonnage.

       inherit_stat
              Ce  bit  active  la  sauvegarde  des  décomptes  d'événements lors du changement de
              contexte pour les tâches héritées. Cela n'a de sens que si  le  champ  inherit  est
              défini.

       enable_on_exec
              If this bit is set, a counter is automatically enabled after a call to execve(2).

       task   Si  ce  bit est défini, alors les notifications de création d’enfant et de fin sont
              inclues au tampon circulaire.

       watermark
              Si défini, une notification de débordement arrive lors du passage de  la  frontière
              wakeup_watermark.   Sinon,   les  notifications  arrivent  après  les  échantillons
              wakeup_events.

       precise_ip (depuis Linux 2.6.35)
              Cela contrôle la quantité de dérapage. Le dérapage est le nombre d'instructions qui
              s'exécutent  entre l'arrivée d'un événement d'intérêt et la possibilité du noyau de
              s'arrêter pour enregistrer l'événement. Les plus petits dérapages sont meilleurs et
              permettent   d'associer   plus   précisément   les   événements  correspondant  aux
              instructions, mais le matériel est souvent limité par leur taille.

              Les valeurs possibles du champ sont les suivantes :

              0  SAMPLE_IP peut avoir un dérapage arbitraire ;

              1  SAMPLE_IP doit avoir un dérapage constant ;

              2  SAMPLE_IP a demandé un dérapage nul ;

              3  SAMPLE_IP doit  avoir  un  dérapage  nul.  Consultez  aussi  la  description  de
                 PERF_RECORD_MISC_EXACT_IP.

       mmap_data (depuis Linux 2.6.36)
              L’opposé du champ mmap. Cela active la génération des échantillons PERF_RECORD_MMAP
              pour les appels mmap(2) qui n’ont pas PROT_EXEC défini (par exemple les données  et
              la mémoire partagée SysV).

       sample_id_all (depuis Linux 2.6.38)
              Si  défini,  alors TID, TIME, ID, STREAM_ID et CPU peuvent de plus être inclus dans
              les non PERF_RECORD_SAMPLE si le sample_type correspondant est sélectionné.

              Si   PERF_SAMPLE_IDENTIFIER   est   indiqué,   alors   une   valeur   d’identifiant
              supplémentaire  est  incluse  en  dernière  valeur pour faciliter l’analyse du flux
              d’enregistrement. Cela peut avoir pour conséquence de voir apparaître la valeur  id
              deux fois.

              La disposition est décrite par cette pseudostructure :

                  struct sample_id {
                      { u32 pid, tid; } /* si PERF_SAMPLE_TID est défini        */
                      { u64 time;     } /* si PERF_SAMPLE_TIME est défini       */
                      { u64 id;       } /* si PERF_SAMPLE_ID est défini         */
                      { u64 stream_id;} /* si PERF_SAMPLE_STREAM_ID est défini  */
                      { u32 cpu, res; } /* si PERF_SAMPLE_CPU est défini        */
                      { u64 id;       } /* si PERF_SAMPLE_IDENTIFIER est défini */
                  };

       exclude_host (depuis Linux 3.2)
              Quand  on  prend des mesures comprenant les processus exécutant des instances de VM
              (à savoir si on exécute ioctl(2) KVM_RUN),  ne  mesurer  que  les  événements  dans
              l'instance  de  l'invité.  Cela  n'a  de  sens  qu'à  l'extérieur  de l'invité ; ce
              paramètre ne modifie pas les compteurs à  l'intérieur  d'un  invité.  Actuellement,
              cette fonctionnalité n'existe que sur x86.

       exclude_guest (depuis Linux 3.2)
              Quand  on  prend des mesures comprenant les processus exécutant des instances de VM
              (à savoir si on exécute ioctl(2) KVM_RUN),  ne  pas  mesurer  les  événements  dans
              l'instance  de  l'invité.  Cela  n'a  de  sens  qu'à  l'extérieur  de l'invité ; ce
              paramètre ne modifie pas les compteurs à  l'intérieur  d'un  invité.  Actuellement,
              cette fonctionnalité n'existe que sur x86.

       exclude_callchain_kernel (depuis Linux 3.7)
              Ne pas inclure les appels en chaîne du noyau.

       exclude_callchain_user (depuis Linux 3.7)
              Ne pas inclure les appels en chaîne d'utilisateur.

       mmap2 (depuis Linux 3.16)
              Générer  un  enregistrement  mmap  exécutable étendu contenant assez d'informations
              supplémentaires pour n'identifier que les projections  partagées.  L'attribut  mmap
              doit aussi être défini pour que cela fonctionne.

       comm_exec (depuis Linux 3.16)
              This  is  purely  a  feature-detection flag, it does not change kernel behavior. If
              this  flag  can  successfully  be  set,   then,   when   comm   is   enabled,   the
              PERF_RECORD_MISC_COMM_EXEC  flag  will  be  set  in the misc field of a comm record
              header if the rename event being reported was caused by a call to  execve(2).  This
              allows tools to distinguish between the various types of process renaming.

       use_clockid (depuis Linux 4.1)
              Cela  permet de sélectionner l'horloge interne du noyau Linux à utiliser lors de la
              génération des horodatages à l'aide  du  champ  clockid.  Cela  peut  faciliter  la
              corrélation  des durées d'échantillonnage des perf avec les horodatages générés par
              d'autres outils.

       context_switch (depuis Linux 4.3)
              Cela active la génération d'enregistrements PERF_RECORD_SWITCH lors d'un changement
              de    contexte.    Cela    active    aussi    la    génération    d'enregistrements
              PERF_RECORD_SWITCH_CPU_WIDE lors d'un échantillonnage en mode  processeur  complet.
              Cette  fonctionnalité  s'ajoute  aux  points  de  trace existants et aux événements
              logiciels de mesure des changements de contexte. L'avantage de  cette  méthode  est
              qu'elle fournira toutes les informations même avec des réglages perf_event_paranoid
              stricts.

       write_backward (depuis Linux 4.6)
              Cela fait écrire le tampon circulaire de la fin vers le début. Cela permet de gérer
              la lecture à partir d’un tampon circulaire réinscriptible.

       namespaces (depuis Linux 4.11)
              Cela active la génération d'enregistrements PERF_RECORD_NAMESPACES lorsqu'une tâche
              entre dans un nouvel espace de noms. Chaque espace de noms  a  une  combinaison  de
              numéros de périphérique et d'inœud.

       ksymbol (depuis Linux 5.0)
              Cela  active  la génération d'enregistrements PERF_RECORD_KSYMBOL quand de nouveaux
              symboles du noyau sont enregistrés ou désenregistrés. Cela concerne  les  fonctions
              dynamiques d’analyse du noyau comme eBPF.

       bpf_event (depuis Linux 5.0)
              Cela   active   la  génération  d'enregistrements  PERF_RECORD_BPF_EVENT  lorsqu'un
              programme eBPF est chargé ou déchargé.

       auxevent (depuis Linux 5.4)
              Cela permet aux événements normaux  (non-AUX)  de  générer  des  données  pour  des
              événements AUX si le matériel le prend en charge.

       cgroup (depuis Linux 5.7)
              Cela  active  la  génération  d'enregistrements PERF_RECORD_CGROUP quand un nouveau
              cgroup est créé (et activé).

       text_poke (depuis Linux 5.8)
              This enables the generation of PERF_RECORD_TEXT_POKE records when there's a  change
              to the kernel text (i.e., self-modifying code).

       wakeup_events, wakeup_watermark
              Cette   union   indique   le  nombre  d'échantillons  (wakeup_events)  ou  d'octets
              (wakeup_watermark) qui arrivent avant un signal de dépassement. Celui  utilisé  est
              sélectionné par l'attribut watermark.

              wakeup_events  ne  compte  que  les types d’enregistrement PERF_RECORD_SAMPLE. Pour
              recevoir un signal pour tous les types PERF_RECORD arrivant,  choisissez  watermark
              et définissez wakeup_watermark à 1.

              Avant Linux 3.0, positionner wakeup_events à 0 ne signalait aucun dépassement ; les
              noyaux plus récents traitent 0 comme 1.

       bp_type (depuis Linux 2.6.33)
              Cela choisit le type de point d'arrêt. Il s'agit d'un des suivants :

              HW_BREAKPOINT_EMPTY
                     pas de point d'arrêt ;

              HW_BREAKPOINT_R
                     compte lors de la lecture de l'emplacement mémoire ;

              HW_BREAKPOINT_W
                     compte lors de l'écriture à l'emplacement mémoire ;

              HW_BREAKPOINT_RW
                     compte lors de la lecture ou l'écriture à l'emplacement mémoire ;

              HW_BREAKPOINT_X
                     compte lors de l'exécution de code à l'emplacement mémoire.

              Les valeurs peuvent être combinées à l'aide d'un OU binaire, mais les  combinaisons
              de HW_BREAKPOINT_R ou HW_BREAKPOINT_W avec HW_BREAKPOINT_X ne sont pas permises.

       bp_addr (depuis Linux 2.6.33)
              Il s'agit de l'adresse du point d'arrêt. Pour les points d'arrêt d'exécution, c'est
              l'adresse mémoire de l'instruction d'intérêt ; pour les points d'arrêt  de  lecture
              et écriture, c'est l'adresse mémoire de l'emplacement mémoire d'intérêt.

       config1 (depuis Linux 2.6.39)
              config1  est  utilisé  pour  définir  des  événements  qui ont besoin d'un registre
              supplémentaire  ou  qui  sinon  ne  rentrent  pas  dans  le  champ  config  normal.
              OFFCORE_EVENTS brut sur Nehalem/Westmere/SandyBridge utilise ce champ sur Linux 3.3
              et les noyaux suivants.

       bp_len (depuis Linux 2.6.33)
              bp_len est la taille du point d'arrêt mesuré si type est PERF_TYPE_BREAKPOINT.  Les
              options   sont  HW_BREAKPOINT_LEN_1,  HW_BREAKPOINT_LEN_2,  HW_BREAKPOINT_LEN_4  et
              HW_BREAKPOINT_LEN_8. Pour un point d'arrêt, définissez-la à sizeof(long).

       config2 (depuis Linux 2.6.39)
              config2 est une extension supplémentaire du champ config1.

       branch_sample_type (depuis Linux 3.4)
              Si PERF_SAMPLE_BRANCH_STACK est activé,  alors  cela  indique  les  branchements  à
              inclure dans l’enregistrement de branchements.

              La  première  partie  de  la valeur est le niveau de droits qui est une combinaison
              d’une des valeurs suivantes. Si  l’utilisateur  ne  définit  pas  explicitement  le
              niveau de droits, le noyau utilisera celui de l’événement. Les niveaux de droits de
              l’événement et du branchement ne doivent pas nécessairement correspondre.

              PERF_SAMPLE_BRANCH_USER
                     La cible de branchement est dans l'espace utilisateur.

              PERF_SAMPLE_BRANCH_KERNEL
                     La cible de branchement est dans l'espace du noyau.

              PERF_SAMPLE_BRANCH_HV
                     La cible de branchement est dans l'hyperviseur.

              PERF_SAMPLE_BRANCH_PLM_ALL
                     Une valeur pratique qui correspond aux trois valeurs  précédentes  combinées
                     avec un OU.

              En plus de la valeur de droits, au moins un des bits suivants doit être défini.

              PERF_SAMPLE_BRANCH_ANY
                     N'importe quel type de branchement.

              PERF_SAMPLE_BRANCH_ANY_CALL
                     N'importe quelle branche d'appel (y compris les appels directs, indirects et
                     les grands sauts).

              PERF_SAMPLE_BRANCH_IND_CALL
                     Appels indirects.

              PERF_SAMPLE_BRANCH_CALL (depuis Linux 4.4)
                     Appels directs.

              PERF_SAMPLE_BRANCH_ANY_RETURN
                     N'importe quel branchement de retour.

              PERF_SAMPLE_BRANCH_IND_JUMP (depuis Linux 4.2)
                     Sauts indirects.

              PERF_SAMPLE_BRANCH_COND (depuis Linux 3.16)
                     Branches conditionnelles.

              PERF_SAMPLE_BRANCH_ABORT_TX (depuis Linux 3.11)
                     Abandons de mémoire transactionnelle.

              PERF_SAMPLE_BRANCH_IN_TX (depuis Linux 3.11)
                     Branchement dans une transaction de mémoire transactionnelle.

              PERF_SAMPLE_BRANCH_NO_TX (depuis Linux 3.11)
                     Branchement  non  dans  la  transaction  de  la  mémoire   transactionnelle.
                     PERF_SAMPLE_BRANCH_CALL_STACK  (depuis Linux 4.1). Le branchement faitpartie
                     d'une pile d'appel générée par le matériel. Cela implique la prise en charge
                     par  le matériel, qui n'existe actuellementque sur le x86 Haswell d'Intel ou
                     plus récent.

       sample_regs_user (depuis Linux 3.7)
              Ce masque  binaire  définit  l’ensemble  des  registres  processeur  utilisateur  à
              renvoyer dans les échantillons. La disposition du masque de registre est spécifique
              à     l’architecture     et     définie      dans      l’en-tête      du      noyau
              arch/ARCH/include/uapi/asm/perf_regs.h.

       sample_stack_user (depuis Linux 3.7)
              Cela  définit la taille de la pile utilisateur à renvoyer si PERF_SAMPLE_STACK_USER
              est indiqué.

       clockid (depuis Linux 4.1)
              Si use_clockid est positionné, ce champ sélectionne l'horloge interne  de  Linux  à
              utiliser  pour  les  horodatages.  Les  horloges  disponibles  sont  définies  dans
              linux/time.h,   où   sont   actuellement   prises   en   charge    CLOCK_MONOTONIC,
              CLOCK_MONOTONIC_RAW, CLOCK_REALTIME, CLOCK_BOOTTIME et CLOCK_TAI.

       aux_watermark (depuis Linux 4.1)
              Cela  indique  la quantité de données nécessaires pour récupérer un échantillonnage
              PERF_RECORD_AUX.

       sample_max_stack (depuis Linux 4.8)
              Quand sample_type comprend PERF_SAMPLE_CALLCHAIN, ce champ  indique  le  nombre  de
              trames de pile à rendre compte lors de la génération de la chaîne d'appels.

   Lecture des résultats
       Une  fois  qu'un  descripteur  de  fichier perf_event_open() a été ouvert, les valeurs des
       événements peuvent être lues depuis le descripteur de fichier. Les valeurs présentes  sont
       indiquées par le champ read_format de la structure attr au moment de l'ouverture.

       Si  vous  essayez de lire un tampon utilisé pour la lecture qui n'est pas assez grand pour
       contenir les données, ENOSPC est renvoyé.

       Voici la disposition des données renvoyées par une lecture :

       – Si PERF_FORMAT_GROUP a été indiqué pour permettre  de  lire  tous  les  événements  d'un
         groupe en une fois :

             struct read_format {
                 u64 nr;            /* Le nombre d'événements */
                 u64 time_enabled;  /* si PERF_FORMAT_TOTAL_TIME_ENABLED */
                 u64 time_running;  /* si PERF_FORMAT_TOTAL_TIME_RUNNING */
                 struct
                     u64 value;     /* La valeur de l'événement */
                     u64 id;        /* si PERF_FORMAT_ID */
                 } values[nr];
             };

       – Si PERF_FORMAT_GROUP n'a pas été indiqué :

             struct read_format {
                 u64 value;         /* La valeur de l'événement */
                 u64 time_enabled;  /* si PERF_FORMAT_TOTAL_TIME_ENABLED */
                 u64 time_running;  /* si PERF_FORMAT_TOTAL_TIME_RUNNING */
                 u64 id;            /* si PERF_FORMAT_ID */
             };

       Les valeurs lues sont les suivantes.

       nr     Le  nombre  d'événements  dans  le  descripteur de fichier. Seulement disponible si
              PERF_FORMAT_GROUP a été indiqué.

       time_enabled, time_running
              Temps total pendant lequel l'événement a été activé et exécuté. Normalement ce sont
              les  mêmes.  Si  plus  d'événements  sont  démarrés  que d'emplacements de compteur
              disponibles sur la PMU, alors il y a multiplexage et les  événements  ne  sont  pas
              exécutés  tout  le  temps.  Dans  ce  cas, les valeurs time_enabled et time running
              peuvent être utilisées pour estimer une valeur d'ordre de grandeur du décompte.

       value  Une valeur positive sur 64 bits contenant le résultat du compteur.

       id     Une  valeur  unique  globale  pour  cet  événement  en  particulier,  seulement  si
              PERF_FORMAT_ID a été indiqué dans read_format.

   Disposition MMAP
       En  utilisant  perf_event_open()  en  mode  d'échantillonnage,  les événements asynchrones
       (comme un dépassement de compteur ou un suivi mmap PROT_EXEC)  sont  journalisés  dans  un
       tampon circulaire. Ce tampon circulaire est créé et accédé à l'aide de mmap(2).

       La  taille  de  mmap  devrait  être  1+2^n pages,  où  la  première  page  est une page de
       métadonnées  (struct  perf_event_mmap_page)  qui  contient  plusieurs  informations  comme
       l'emplacement de la tête du tampon circulaire.

       Avant  le  noyau 2.6.39,  un  bogue  oblige  à  allouer  un tampon circulaire mmap lors de
       l'échantillonnage même s'il n'est pas prévu de l'utiliser.

       La structure de la première page mmap de métadonnées est la suivante :

           struct perf_event_mmap_page {
               __u32 version;        /* numéro de version de la structure */
               __u32 compat_version; /* plus petite version compatible */
               __u32 lock;           /* seqlock pour synchronisation */
               __u32 index;          /* identifiant de compteur matériel */
               __s64 offset;         /* ajouter au compteur matériel */
               __u64 time_enabled;   /* temps d'événement actif */
               __u64 time_running;   /* temps d'événement sur processeur */
               union {
                   __u64   capabilities;
                   struct {
                       __u64 cap_usr_time / cap_usr_rdpmc / cap_bit0 : 1,
                             cap_bit0_is_deprecated : 1,
                             cap_user_rdpmc         : 1,
                             cap_user_time          : 1,
                             cap_user_time_zero     : 1,
                   };
               };
               __u16 pmc_width;
               __u16 time_shift;
               __u32 time_mult;
               __u64 time_offset;
               __u64 __reserved[120];   /* remplissage à 1 k */
               __u64 data_head;         /* tête de la section de données */
               __u64 data_tail;         /* queue écrite en espace utilisateur */
               __u64 data_offset;       /* où commence le tampon */
               __u64 data_size;         /* taille du tampon de données */
               __u64 aux_head;
               __u64 aux_tail;
               __u64 aux_offset;
               __u64 aux_size;
           }

           }

       La liste suivante décrit les champs de la structure perf_event_mmap_page plus précisément.

       version
              Numéro de version de cette structure.

       compat_version
              La plus petite version avec laquelle elle est compatible.

       lock   Un seqlock (sequence lock) pour la synchronisation.

       index  Un identifiant unique de compteur matériel.

       décalage
              Quand l’instruction rdpmc est utilisée pour lire, cette  valeur  de  position  doit
              être  ajoutée  à  celle  renvoyée  par  rdpmc pour obtenir le décompte total actuel
              d’événements.

       time_enabled
              Temps d'activité de l'événement.

       time_running
              Temps d'exécution de l'événement.

       cap_usr_time / cap_usr_rdpmc / cap_bit0 (depuis Linux 3.4)
              Un bogue existait dans la définition de cap_usr_time et cap_usr_rdpmc de  Linux 3.4
              à  Linux 3.11.  Les deux bits étaient définis pour pointer vers le même endroit, il
              était donc impossible de savoir si cap_usr_time ou cap_usr_rdpmc  étaient  vraiment
              définis.

              Depuis Linux 3.12, ils ont été renommés en cap_bit0 et vous devriez plutôt utiliser
              les nouveaux champs cap_user_time et cap_user_rdpmc à la place.

       cap_bit0_is_deprecated (depuis Linux 3.12)
              Si défini, ce bit indique que le noyau est capable de gérer les bits  cap_user_time
              et cap_user_rdpmc différenciés correctement.

              Si   non,   cela  indique  qu’il  s’agit  d’un  ancien  noyau  où  cap_usr_time  et
              cap_usr_rdpmc pointent vers le même  bit  et  donc  que  ces  deux  fonctionnalités
              devraient être utilisées avec prudence.

       cap_usr_rdpmc (depuis Linux 3.12)
              Si le matériel permet la lecture en espace utilisateur des compteurs de performance
              sans appel système (c'est l'instruction « rdpmc » sur x86), alors le  code  suivant
              peut être utilisé pour faire une lecture :

                  u32 seq, time_mult, time_shift, idx, width;
                  u64 count, enabled, running;
                  u64 cyc, time_offset;

                  do {
                      seq = pc->lock;
                      barrier();
                      enabled = pc->time_enabled;
                      running = pc->time_running;

                      if (pc->cap_usr_time && enabled != running) {
                          cyc = rdtsc();
                          time_offset = pc->time_offset;
                          time_mult   = pc->time_mult;
                          time_shift  = pc->time_shift;
                      }

                      idx = pc->index;
                      count = pc->offset;

                      if (pc->cap_usr_rdpmc && idx) {
                          width = pc->pmc_width;
                          count += rdpmc(idx - 1);
                      }

                      barrier();
                  } while (pc->lock != seq);

       cap_user_time (depuis Linux 3.12)
              Ce bit indique que le matériel a un compteur temporel sans arrêt, constant (TSC sur
              x86).

       cap_usr_time_zero (depuis Linux 3.12)
              Indique la présence de time_zero qui permet d’associer les valeurs  d’horodatage  à
              l’horloge matérielle.

       pmc_width
              Si  cap_usr_rdpmc,  ce champ fournit la taille en bit de la valeur lue en utilisant
              l'instruction rdpmc ou équivalente. Cela permet d'étendre avec  signe  le  résultat
              comme ceci :

                  pmc <<= 64 - pmc_width;
                  pmc >>= 64 - pmc_width; // déplacement du signe à droite
                  count += pmc;

       time_shift, time_mult, time_offset

              Si  cap_usr_time,  ces  champs peuvent être utilisés pour calculer la différence de
              temps depuis time_enabled (en nanoseconde) en utilisant rdtsc ou similaire.

                  u64 quot, rem;
                  u64 delta;

                  quot = cyc >> time_shift;
                  rem  = cyc & (((u64)1 << time_shift) - 1);
                  delta = time_offset + quot * time_mult +
                          ((rem * time_mult) >> time_shift);

              Où time_offset, time_mult, time_shift et cyc  sont  lus  dans  la  boucle  seqcount
              décrite  ci-dessus.  Cette différence peut être ajoutée à enabled et éventuellement
              running (si idx), pour améliorer l'échelle :

                  enabled += delta;
                  if (idx)
                      running += delta;
                  quot = count / running;
                  rem  = count % running;
                  count = quot * enabled + (rem * enabled) / running;

       time_zero (depuis Linux 3.12)

              Si cap_usr_time_zero est défini, alors l'horloge matérielle (le  compteur  temporel
              TSC  sur  x86)  peut  être  calculée  à  partir des valeurs time_zero, time_mult et
              time_shift :

                  time = timestamp - time_zero;
                  quot = time / time_mult;
                  rem  = time % time_mult;
                  cyc  = (quot << time_shift) + (rem << time_shift) / time_mult;

              et vice versa :

                  quot = cyc >> time_shift;
                  rem  = cyc & (((u64)1 << time_shift) - 1);
                  timestamp = time_zero + quot * time_mult +
                              ((rem * time_mult) >> time_shift);

       data_head
              Cela  pointe  vers  la  tête  de  la  section  de  données.  La   valeur   augmente
              continuellement, elle n'est pas coupée. Vous devrez couper vous-même la valeur à la
              taille du tampon mmap avant d'accéder aux échantillons.

              Sur les plateformes compatibles SMP, après  la  lecture  de  la  valeur  data_head,
              l'espace utilisateur devrait renvoyer un rmb().

       data_tail
              Quand  l'association  est  PROT_WRITE,  la valeur data_tail devrait être écrite par
              l'espace utilisateur pour refléter les dernières données  lues.  Dans  ce  cas,  le
              noyau n'écrasera pas les données non lues.

       data_offset (depuis Linux 4.1)
              Contient   la   position  de  l'emplacement  du  tampon  mmap  où  les  données  de
              l'échantillon de perf commencent.

       data_size (depuis Linux 4.1)
              Contient la taille de la zone de l'échantillon de perf dans le tampon mmap.

       aux_head, aux_tail, aux_offset, aux_size (depuis Linux 4.1)
              La zone AUX permet d'appliquer à un mmap(2) un  tampon  d'échantillonnage  distinct
              pour   les   flux   de  données  à  forte  bande  passante  (séparément  du  tampon
              d'échantillonnage de perf principal). Un exemple de flux à forte bande passante est
              la  prise  en  charge  du  traçage d'une instruction telle qu'elle se fait dans les
              nouveaux processeurs Intel.

              Pour définir une zone AUX, il faut d'abord positionner aux_offset  à  une  position
              supérieure  à data_offset+data_size puis positionner aux_size à la taille de tampon
              désirée. La position et la taille désirée doivent être alignées sur la page  et  la
              taille  doit être une puissance de deux. Ces valeurs sont alors passées à mmap pour
              projeter le tampon AUX. Les pages du tampon AUX sont comprises dans  la  limite  de
              ressource  RLIMIT_MEMLOCK  (voir  setrlimit(2))  et  dans  la  gestion  des  droits
              perf_event_mlock_kb.

              Par défaut, le tampon AUX sera tronqué s'il ne rentre pas dans l'espace  disponible
              du  tampon  circulaire.  Si le tampon AUX est projeté en tant que tampon en lecture
              seule, il agira dans le  mode  du  tampon  circulaire  là  où  les  données  seront
              remplacées par de nouvelles. En mode remplacement, il se pourrait qu'il ne soit pas
              possible de présumer l'endroit où  commencent  les  données  et  il  appartient  au
              consommateur  de  désactiver la mesure pendant la lecture pour éviter les possibles
              collisions de données.

              Les pointeurs de tampon circulaire aux_head et aux_tail ont le même comportement et
              les  mêmes règles d'organisation que celles décrites précédemment pour data_head et
              data_tail.

       Les 2^n pages suivantes du tampon circulaire ont la disposition décrite ci-dessous.

       Si perf_event_attr.sample_id_all est défini, alors tous les types d'événements auront  les
       champs  sample_type  sélectionnés  relatifs  à l'emplacement et à la date (identité) où un
       événement a eu lieu (TID, TIME, ID, CPU,  STREAM_ID)  conformément  à  la  description  de
       PERF_RECORD_SAMPLE  ci-dessous,  il  sera  stocké  juste après le perf_event_header et les
       champs déjà présents pour les champs existants, c'est-à-dire à la fin de la charge  utile.
       De  cette  façon,  un nouveau perf.data sera pris en charge par les outils de performances
       plus anciens, avec ces nouveaux champs facultatifs ignorés.

       Les valeurs mmap commencent par un en-tête :

           struct perf_event_header {
               __u32   type;
               __u16   misc;
               __u16   size;
           };

       Les champs perf_event_header sont décrits plus précisément ci-dessous.  Par  commodité  de
       lecture, les champs avec les descriptions les plus courtes sont d’abord présentés.

       size   Cela indique la taille de l'enregistrement.

       misc   Le champ misc contient des renseignements supplémentaires sur l'échantillon.

              Le  mode  de processeur peut être déterminé à partir de cette valeur en la masquant
              avec PERF_RECORD_MISC_CPUMODE_MASK et en recherchant un des suivants (remarquez que
              ce ne sont pas des masques de bits, un seul peut être défini à la fois).

              PERF_RECORD_MISC_CPUMODE_UNKNOWN
                     Mode de processeur inconnu.

              PERF_RECORD_MISC_KERNEL
                     L'échantillon a eu lieu dans le noyau.

              PERF_RECORD_MISC_USER
                     L'échantillon a eu lieu dans le code utilisateur.

              PERF_RECORD_MISC_HYPERVISOR
                     L'échantillon a eu lieu dans l'hyperviseur.

              PERF_RECORD_MISC_GUEST_KERNEL (depuis Linux 2.6.35)
                     L'échantillon a eu lieu dans le noyau client.

              PERF_RECORD_MISC_GUEST_USER (depuis Linux 2.6.35)
                     L'échantillon a eu lieu dans le code utilisateur client.

              Comme  les trois états suivants sont générés par différents types d'enregistrement,
              ils constituent des alias du même bit :

              PERF_RECORD_MISC_MMAP_DATA (depuis Linux 3.10)
                     C’est défini quand l’association n’est pas exécutable ; sinon  l’association
                     est exécutable.

              PERF_RECORD_MISC_COMM_EXEC (depuis Linux 3.16)
                     This  is set for a PERF_RECORD_COMM record on kernels more recent than Linux
                     3.16 if a process name change was caused by an execve(2)  system call.

              PERF_RECORD_MISC_SWITCH_OUT (depuis Linux 4.3)
                     Quand un enregistrement  PERF_RECORD_SWITCH  ou  PERF_RECORD_SWITCH_CPU_WIDE
                     est  généré,  ce  bit  indique que le changement de contexte est distinct du
                     processus actuel (et n'en fait pas partie).

              De plus, les bits suivants peuvent être définis :

              PERF_RECORD_MISC_EXACT_IP
                     Cela indique que le contenu  de  PERF_SAMPLE_IP  pointe  vers  la  véritable
                     instruction     qui     a    déclenché    l'événement.    Consultez    aussi
                     perf_event_attr.precise_ip.

              PERF_RECORD_MISC_EXT_RESERVED (depuis Linux 2.6.35)
                     Cela indique que des données étendues  sont  disponibles  (actuellement  pas
                     utilisées).

              PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT
                     Ce  bit  n'est  pas  défini par le noyau. Il est réservé à l'outil perf dans
                     l'espace utilisateur pour indiquer que l'analyse de /proc/i[pid]/maps a trop
                     duré et a été arrêtée, ainsi les enregistrements mmap peuvent être tronqués.

       type   La   valeur   type  est  une  des  suivantes.  Les  valeurs  dans  l'enregistrement
              correspondant (qui suit  l'en-tête)  dépendent  du  type  sélectionné  comme  c'est
              montré.

              PERF_RECORD_MMAP
                  Les événements MMAP enregistrent les associations PROT_EXEC pour pouvoir mettre
                  en corrélation les pointeurs d'instruction en espace utilisateur  et  le  code.
                  Ils ont la structure suivante :

                      struct {
                          struct perf_event_header header;
                          u32    pid, tid;
                          u64    addr;
                          u64    len;
                          u64    pgoff;
                          char   filename[];
                      };

                  pid    est l'identifiant de processus.

                  tid    est l'identifiant de thread.

                  addr   est  l'adresse  de  la  mémoire allouée. len est la taille de la mémoire
                         allouée. pgoff est la  position  de  la  page  de  la  mémoire  allouée.
                         filename est une chaîne décrivant la base de la mémoire allouée.

              PERF_RECORD_LOST
                  Cet enregistrement indique quand des événements sont perdus.

                      struct {
                          struct perf_event_header header;
                          u64    id;
                          u64    lost;
                          struct sample_id sample_id;
                      };

                  id     est l'identifiant unique d'événement pour les échantillons perdus.

                  lost   est le nombre d'événements perdus.

              PERF_RECORD_COMM
                  Cet enregistrement indique une modification du nom de processus.

                      struct {
                          struct perf_event_header header;
                          u32    pid;
                          u32    tid;
                          char   comm[];
                          struct sample_id sample_id;
                      };

                  pid    est l'identifiant de processus.

                  tid    est l'identifiant de thread.

                  comm   est une chaîne contenant le nouveau nom du processus.

              PERF_RECORD_EXIT
                  Cet enregistrement indique un événement de fin de processus.

                      struct {
                          struct perf_event_header header;
                          u32    pid, ppid;
                          u32    tid, ptid;
                          u64    time;
                          struct sample_id sample_id;
                      };

              PERF_RECORD_THROTTLE, PERF_RECORD_UNTHROTTLE
                  Cet   enregistrement   indique  un  événement  de  variation  de  fréquence  du
                  processeur.

                      struct {
                          struct perf_event_header header;
                          u64    time;
                          u64    id;
                          u64    stream_id;
                          struct sample_id sample_id;
                      };

              PERF_RECORD_FORK
                  Cet enregistrement indique un événement de création d’enfant.

                      struct {
                          struct perf_event_header header;
                          u32    pid, ppid;
                          u32    tid, ptid;
                          u64    time;
                          struct sample_id sample_id;
                      };

              PERF_RECORD_READ
                  Cet enregistrement indique un événement de lecture.

                      struct {
                          struct perf_event_header header;
                          u32    pid, tid;
                          struct read_format values;
                          struct sample_id sample_id;
                      };

              PERF_RECORD_SAMPLE
                  Cet enregistrement indique un échantillon.

                      struct {
                          struct perf_event_header header;
                          u64   sample_id;  /* si PERF_SAMPLE_IDENTIFIER */
                          u64   ip;         /* si PERF_SAMPLE_IP */
                          u32   pid, tid;   /* si PERF_SAMPLE_TID */
                          u64   time;       /* si PERF_SAMPLE_TIME */
                          u64   addr;       /* si PERF_SAMPLE_ADDR */
                          u64   id;         /* si PERF_SAMPLE_ID */
                          u64   stream_id;  /* si PERF_SAMPLE_STREAM_ID */
                          u32   cpu, res;   /* si PERF_SAMPLE_CPU */
                          u64   period;     /* si PERF_SAMPLE_PERIOD */
                          struct read_format v;
                                              /* si PERF_SAMPLE_READ */
                          u64   nr;         /* si PERF_SAMPLE_CALLCHAIN */
                          u64   ips[nr];    /* si PERF_SAMPLE_CALLCHAIN */
                          u32   size;       /* si PERF_SAMPLE_RAW */
                          char  data[size]; /* si PERF_SAMPLE_RAW */
                          u64   bnr;        /* si PERF_SAMPLE_BRANCH_STACK */
                          struct perf_branch_entry lbr[bnr];
                                            /* si PERF_SAMPLE_BRANCH_STACK */
                          u64   abi;        /* si PERF_SAMPLE_REGS_USER */
                          u64   regs[weight(mask)];
                                            /* si PERF_SAMPLE_REGS_USER */
                          u64   size;       /* si PERF_SAMPLE_STACK_USER */
                          char  data[size]; /* si PERF_SAMPLE_STACK_USER */
                          u64   dyn_size;   /* si PERF_SAMPLE_STACK_USER &&
                                                 size != 0 */
                          u64   weight;     /* si PERF_SAMPLE_WEIGHT */
                          u64   data_src;   /* si PERF_SAMPLE_DATA_SRC */
                          u64   transaction; /* si PERF_SAMPLE_TRANSACTION */
                          u64    abi;         /* si PERF_SAMPLE_REGS_INTR */
                          u64    regs[weight(mask)];
                                              /* si PERF_SAMPLE_REGS_INTR */
                          u64    phys_addr;   /* si PERF_SAMPLE_PHYS_ADDR */
                          u64    cgroup;      /* si PERF_SAMPLE_CGROUP */
                      };

                  sample_id
                      Si PERF_SAMPLE_IDENTIFIER est activé, un identifiant unique sur 64 bits est
                      inclus.  C’est une copie de la valeur id de PERF_SAMPLE_ID, mais incluse au
                      début de l’échantillon pour permettre aux analyseurs  d’obtenir  facilement
                      la valeur.

                  ip  Si  PERF_SAMPLE_IP  est  activé, alors une valeur de pointeur d'instruction
                      sur 64 bits est incluse.

                  pid, tid
                      Si PERF_SAMPLE_TID est  activé,  alors  un  identifiant  de  processus  sur
                      32 bits et un identifiant de thread sur 32 bits sont inclus.

                  time
                      Si PERF_SAMPLE_TIME est activé, alors un horodatage sur 64 bits est inclus.
                      C'est obtenu à l'aide de local_clock() qui est un  horodatage  matériel  si
                      disponible et la valeur jiffy sinon.

                  addr
                      Si  PERF_SAMPLE_ADDR est activé, alors une adresse sur 64 bits est incluse.
                      C'est  généralement  l'adresse  d'un  point  de  trace,  point  d'arrêt  ou
                      événement logiciel ; sinon la valeur est 0.

                  id  Si PERF_SAMPLE_ID est activé, un identifiant unique sur 64 bits est inclus.
                      Si l'événement est membre d'un groupe d'événements, l'identifiant du leader
                      de  groupe  est  renvoyé. Cet identifiant est le même que celui renvoyé par
                      PERF_FORMAT_ID.

                  stream_id
                      Si PERF_SAMPLE_STREAM_ID est activé, un identifiant unique sur 64 bits  est
                      inclus.  Contrairement  à  PERF_SAMPLE_ID,  le  véritable  identifiant  est
                      renvoyé, pas celui du leader de groupe. Cet identifiant  est  le  même  que
                      celui renvoyé par PERF_FORMAT_ID.

                  cpu, res
                      Si  PERF_SAMPLE_CPU  est  activé, c'est une valeur sur 32 bits indiquant le
                      processeur qui a été utilisé, en  supplément  d'une  valeur  réservée  (non
                      utilisée) sur 32 bits.

                  period
                      Si  PERF_SAMPLE_PERIOD  est  activé,  une  valeur  sur 64 bits indiquant la
                      période d'échantillonnage actuelle est écrite.

                  v   Si PERF_SAMPLE_READ est activé,  une  structure  de  type  read_format  est
                      incluse  avec  des valeurs pour tous les événements du groupe d'événements.
                      Les valeurs incluses dépendent de la valeur read_format utilisée au  moment
                      de perf_event_open().

                  nr, ips[nr]
                      Si  PERF_SAMPLE_CALLCHAIN  est  activé,  alors  un  nombre  sur 64 bits est
                      inclus, indiquant le nombre de  pointeurs  d'instruction  sur  64 bits  qui
                      suivent. C'est l'appel en chaîne actuel.

                  size, data[size]
                      Si  PERF_SAMPLE_RAW  est  activé, alors une valeur sur 32 bits indiquant la
                      taille est incluse, suivie par un tableau de valeurs sur 8 bits  de  taille
                      size.  Les  valeurs  sont  remplies  avec  des 0 pour avoir un alignement à
                      64 bits.

                      Ces données brutes d'enregistrement sont opaques du point de vue de  l'ABI.
                      L'ABI ne fait pas de promesses sur la stabilité de son contenu qui pourrait
                      varier en fonction de l'événement, du matériel ou de la version du noyau.

                  bnr, lbr[bnr]
                      Si  PERF_SAMPLE_BRANCH_STACK  est  activé,  alors  une  valeur  de  64 bits
                      indiquant  le  nombre  d'enregistrements est incluse, suivie des structures
                      bnr perf_branch_entry qui chacune contient les champs suivants.

                      from   Cela indique l’instruction source  (qui  pourrait  ne  pas  être  un
                             branchement).

                      to     La cible de branchement.

                      mispred
                             La cible de branchement a été mal prédite.

                      predicted
                             La cible de branchement a été prédite.

                      in_tx (depuis Linux 3.11)
                             Le    branchement    était   dans   une   transaction   de   mémoire
                             transactionnelle.

                      abort (depuis Linux 3.11)
                             Le branchement était dans  une  transaction  abandonnée  de  mémoire
                             transactionnelle.

                      cycles (depuis Linux 4.3)
                             Cela  rend compte du nombre de cycles qui se sont déroulés depuis la
                             dernière mise à jour de la pile de branchement.

                      Les entrées sont présentées dans l’ordre chronologique, de telle sorte  que
                      la première entrée a le branchement le plus récent.

                      La  prise  en  charge  de  mispred, predicted et cycles est facultative. En
                      absence de prise en charge, les deux valeurs seront 0.

                      Le  type  de  branchements   enregistrés   est   indiqué   par   le   champ
                      branch_sample_type.

                  abi, regs[weight(mask)]
                      Si   PERF_SAMPLE_REGS_USER  est  activé,  alors  les  registres  processeur
                      utilisateur sont enregistrés.

                      Le champ abi est parmi  PERF_SAMPLE_REGS_ABI_NONE,  PERF_SAMPLE_REGS_ABI_32
                      ou PERF_SAMPLE_REGS_ABI_64.

                      Le  champ  regs est un tableau de registres processeur qui ont été indiqués
                      par le champ attr sample_regs_user. Le nombre de valeurs est le  nombre  de
                      bits définis dans le masque binaire sample_regs_user.

                  size, data[size], dyn_size
                      Si  PERF_SAMPLE_STACK_USER est activé, la pile utilisateur est enregistrée.
                      Cela peut être utilisé pour générer les backtraces de la pile. size est  la
                      taille  demandée  par  l’utilisateur dans sample_stack_user ou autrement la
                      taille maximale d’enregistrement. data contient les  données  de  pile  (un
                      contenu  brut  de  la mémoire indiquée par le pointeur de pile au moment de
                      l'échantillonnage). dyn_size est la quantité de données  vraiment  renvoyée
                      (peut être inférieure à size). Remarquez que dyn_size est omis si size vaut
                      0.

                  weight
                      Si PERF_SAMPLE_WEIGHT est activé, une valeur  de  64 bits  fournie  par  le
                      matériel  est enregistrée pour indiquer le coût de l’événement. Cela permet
                      aux événements coûteux de ressortir plus clairement dans les profils.

                  data_src
                      Si PERF_SAMPLE_DATA_SRC  est  activé,  alors  une  valeur  de  64 bits  est
                      enregistrée, constituée des champs suivants.

                      mem_op
                          Type de code opération (opcode), une combinaison bit à bit de :

                          PERF_MEM_OP_NA          Non disponible
                          PERF_MEM_OP_LOAD        Instruction de chargement
                          PERF_MEM_OP_STORE       Instruction de stockage
                          PERF_MEM_OP_PFETCH      Prélecture
                          PERF_MEM_OP_EXEC        Code exécutable

                      mem_lvl
                          Niveau  de hiérarchie de mémoire atteint ou raté, une combinaison bit à
                          bit de ce qui suit, envoyés à gauche par PERF_MEM_LVL_SHIFT :

                          PERF_MEM_LVL_NA         Non disponible
                          PERF_MEM_LVL_HIT        Atteint
                          PERF_MEM_LVL_MISS       Raté
                          PERF_MEM_LVL_L1         Cache de niveau 1
                          PERF_MEM_LVL_LFB        Tampon de capacité
                          PERF_MEM_LVL_L2         Cache de niveau 2
                          PERF_MEM_LVL_L3         Cache de niveau 3
                          PERF_MEM_LVL_LOC_RAM    DRAM local
                          PERF_MEM_LVL_REM_RAM1   DRAM distant 1 saut
                          PERF_MEM_LVL_REM_RAM2   DRAM distant 2 sauts
                          PERF_MEM_LVL_REM_CCE1   Cache distant 1 saut
                          PERF_MEM_LVL_REM_CCE2   Cache distant 2 sauts
                          PERF_MEM_LVL_IO         Mémoire d'entrée et sortie.
                          PERF_MEM_LVL_UNC        Mémoire sans cache

                      mem_snoop
                          Mode espionnage, une combinaison bit-à-bit de ce qui suit, décalé  vers
                          la gauche par PERF_MEM_SNOOP_SHIFT :

                          PERF_MEM_SNOOP_NA       Non disponible
                          PERF_MEM_SNOOP_NONE     Pas d'espionnage
                          PERF_MEM_SNOOP_HIT      Espionnage atteint
                          PERF_MEM_SNOOP_MISS     Espionnage raté
                          PERF_MEM_SNOOP_HITM     Espionnage atteint modifié

                      mem_lock
                          Instruction  de verrouillage, une combinaison bit à bit de ce qui suit,
                          renvoyée vers la gauche par PERF_MEM_LOCK_SHIFT :

                          PERF_MEM_LOCK_NA        Non disponible
                          PERF_MEM_LOCK_LOCKED    Transaction verrouillée

                      mem_dtlb
                          Accès TLB atteint ou raté, une combinaison bit à bit de  ce  qui  suit,
                          renvoyée vers la gauche par PERF_MEM_TLB_SHIFT :

                          PERF_MEM_TLB_NA         Non disponible
                          PERF_MEM_TLB_HIT        Atteint
                          PERF_MEM_TLB_MISS       Raté
                          PERF_MEM_TLB_L1         TLB de niveau 1
                          PERF_MEM_TLB_L2         TLB de niveau 2
                          PERF_MEM_TLB_WK         Parcours matériel
                          PERF_MEM_TLB_OS         Gestionnaire d'erreur du SE

                  transaction
                      Si l’attribut PERF_SAMPLE_TRANSACTION est défini, alors un champ de 64 bits
                      est enregistré pour décrire les sources de tous  les  abandons  de  mémoire
                      transactionnelle.

                      Le champ est une combinaison bit à bit des valeurs suivantes :

                      PERF_TXN_ELISION
                             Abandon   d’une   transaction   de   type  élision  (spécifique  aux
                             processeurs Intel).

                      PERF_TXN_TRANSACTION
                             Abandon d’une transaction générique.

                      PERF_TXN_SYNC
                             Abandon synchrone (relatif à l’instruction signalée).

                      PERF_TXN_ASYNC
                             Abandon asynchrone (non relatif à l’instruction signalée).

                      PERF_TXN_RETRY
                             Abandon réessayable (réessayer la transaction pourrait réussir).

                      PERF_TXN_CONFLICT
                             Abandon à cause de conflits de mémoire avec d’autres threads.

                      PERF_TXN_CAPACITY_WRITE
                             Abandon à cause de dépassement de la capacité d’écriture.

                      PERF_TXN_CAPACITY_READ
                             Abandon à cause de dépassement de la capacité de lecture.

                      De plus, un code d’abandon spécifique à l’utilisateur peut  être  obtenu  à
                      partir  des  premiers  32 bits  du  champ  en déplaçant vers la droite avec
                      PERF_TXN_ABORT_SHIFT et en masquant avec PERF_TXN_ABORT_MASK.

                  abi, regs[weight(mask)]
                      Si  PERF_SAMPLE_REGS_INTR  est  activé,  alors  les  registres   processeur
                      utilisateur sont enregistrés.

                      Le  champ  abi est parmi PERF_SAMPLE_REGS_ABI_NONE, PERF_SAMPLE_REGS_ABI_32
                      ou PERF_SAMPLE_REGS_ABI_64.

                      Le champ regs est un tableau des registres processeur qui ont été  indiqués
                      par  le  champ attr sample_regs_intr. Le nombre de valeurs est le nombre de
                      bits définis dans le masque binaire sample_regs_intr.

                  phys_addr
                      Si l'attribut PERF_SAMPLE_PHYS_ADDR est positionné, l'adresse  physique  en
                      64 bits est enregistrée.

                  cgroup
                      Si  l'attribut  PERF_SAMPLE_CGROUP  est positionné, l'identifiant de cgroup
                      64 bits (pour le sous-système perf_event) est enregistré. Pour récupérer le
                      chemin  du cgroup, l'identifiant doit correspondre à un de ceux se trouvant
                      dans PERF_RECORD_CGROUP.

              PERF_RECORD_MMAP2
                  Cet enregistrement inclut des informations  étendues  sur  les  appels  mmap(2)
                  renvoyant  des  projections  exécutables.  Le  format  est identique à celui de
                  l'enregistrement PERF_RECORD_MMAP mais il comprend des valeurs  supplémentaires
                  qui permettent uniquement d'identifier des projections partagées.

                      struct {
                          struct perf_event_header header;
                          u32    pid;
                          u32    tid;
                          u64    addr;
                          u64    len;
                          u64    pgoff;
                          u32    maj;
                          u32    min;
                          u64    ino;
                          u64    ino_generation;
                          u32    prot;
                          u32    flags;
                          char   filename[];
                          struct sample_id sample_id;
                      };

                  pid    est l'identifiant de processus.

                  tid    est l'identifiant de thread.

                  addr   est l'adresse de la mémoire allouée.

                  len    est la taille de la mémoire allouée.

                  pgoff  est la position de la page de la mémoire allouée.

                  maj    est l'identifiant majeur du périphérique sous-jacent.

                  min    est l'identifiant mineur du périphérique sous-jacent.

                  ino    est le numéro d'inœud.

                  ino_generation
                         est la génération d'inœud.

                  prot   sont les informations de protection.

                  drapeaux
                         sont les informations d'attributs.

                  filename
                         est une chaîne décrivant la base de la mémoire allouée.

              PERF_RECORD_AUX (depuis Linux 4.1)
                  Cet  enregistrement  rend compte des nouvelles données disponibles dans la zone
                  séparée du tampon AUX.

                      struct {
                          struct perf_event_header header;
                          u64    aux_offset;
                          u64    aux_size;
                          u64    flags;
                          struct sample_id sample_id;
                      };

                  aux_offset
                         position dans la zone mmap AUX où commencent les nouvelles données.

                  aux_size
                         taille des données disponibles.

                  drapeaux
                         décrit la mise à jour AUX.

                         PERF_AUX_FLAG_TRUNCATED
                                s'il est positionné, les données renvoyées ont été tronquées pour
                                rentrer dans la taille du tampon disponible.

                         PERF_AUX_FLAG_OVERWRITE
                                s'il est positionné, les données renvoyées ont écrasé des données
                                précédentes.

              PERF_RECORD_ITRACE_START (depuis Linux 4.1)
                  Cet enregistrement indique le processus qui a initié un  événement  de  traçage
                  d'instruction,  permettant  aux  outils  de  corréler correctement les adresses
                  d'instruction du tampon AUX avec le bon exécutable.

                      struct {
                          struct perf_event_header header;
                          u32    pid;
                          u32    tid;
                      };

                  pid    identifiant  de  processus  du  thread   ayant   commencé   un   traçage
                         d'instruction.

                  tid    identifiant du thread ayant commencé le traçage d'instruction.

              PERF_RECORD_LOST_SAMPLES (depuis Linux 4.2)
                  Lors  de  l'utilisation de l'échantillonnage matériel (comme les PEBS d'Intel),
                  cet enregistrement indique le  nombre  d'échantillons  qui  peuvent  avoir  été
                  perdus.

                      struct {
                          struct perf_event_header header;
                          u64    lost;
                          struct sample_id sample_id;
                      };

                  lost   est le nombre d'échantillons potentiellement perdus.

              PERF_RECORD_SWITCH (depuis Linux 4.3)
                  Cet  enregistrement  indique  qu'un  changement  de  contexte a eu lieu. Le bit
                  PERF_RECORD_MISC_SWITCH_OUT du champ misc indique si ce changement  s'est  fait
                  dans ou hors du processus.

                      struct {
                          struct perf_event_header header;
                          struct sample_id sample_id;
                      };

              PERF_RECORD_SWITCH_CPU_WIDE (depuis Linux 4.3)
                  Comme  avec  PERF_RECORD_SWITCH, cet enregistrement indique qu'un changement de
                  contexte a eu lieu mais il n'arrive  que  lors  de  l'échantillonnage  en  mode
                  processeur  complet  et  il  fournit  des  informations  supplémentaires sur le
                  processus faisant l'objet du changement. Le bit PERF_RECORD_MISC_SWITCH_OUT  du
                  champ misc indique si le changement a eu lieu dans ou hors du processus actuel.

                      struct {
                          struct perf_event_header header;
                          u32 next_prev_pid;
                          u32 next_prev_tid;
                          struct sample_id sample_id;
                      };

                  next_prev_pid
                         L'identifiant  du  processus  précédent  ou  suivant  (selon  le sens du
                         changement) sur le processeur.

                  next_prev_tid
                         L'identifiant  du  thread  précédent  ou  suivant  (selon  le  sens   du
                         changement) sur le processeur.

              PERF_RECORD_NAMESPACES (depuis Linux 4.11)
                  Cet  enregistrement  comprend  diverses  informations sur l'espace de noms d'un
                  processus.

                      struct {
                          struct perf_event_header header;
                          u32    pid;
                          u32    tid;
                          u64    nr_namespaces;
                          struct { u64 dev, inode } [nr_namespaces];
                          struct sample_id sample_id;
                      };

                  pid    est l'identifiant de processus.

                  tid    est l'identifiant de thread.

                  nr_namespace
                         est le nombre d'espaces de noms de cet enregistrement.

                  Chaque espace de noms a des champs dev et inode et il est enregistré  dans  une
                  position fixe comme celle ci-dessous :

                  NET_NS_INDEX=0
                         espace de noms réseau

                  UTS_NS_INDEX=1
                         espace de noms UTS

                  IPC_NS_INDEX=2
                         espace de noms IPC

                  PID_NS_INDEX=3
                         espace de noms PID

                  USER_NS_INDEX=4
                         espace de noms utilisateur

                  MNT_NS_INDEX=5
                         Espace de noms de montage

                  CGROUP_NS_INDEX=6
                         espace de noms de groupe de contrôle

              PERF_RECORD_KSYMBOL (depuis Linux 5.0)
                  Cet  enregistrement indique un événement d'enregistrement/désenregistrement des
                  symboles du noyau.

                      struct {
                          struct perf_event_header header;
                          u64    addr;
                          u32    len;
                          u16    ksym_type;
                          u16    flags;
                          char   name[];
                          struct sample_id sample_id;
                      };

                  addr   est l'adresse du symbole du noyau.

                  len    est la taille du symbole du noyau.

                  ksym_type
                         est le type de symbole du noyau. Actuellement, les types  suivants  sont
                         disponibles :

                         PERF_RECORD_KSYMBOL_TYPE_BPF
                                Le symbole du noyau est une fonction BPF.

                  drapeaux
                         Si PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER est positionné, cet événement se
                         produit lors du désenregistrement d'un symbole du noyau.

              PERF_RECORD_BPF_EVENT (depuis Linux 5.0)
                  Cet enregistrement indique si un programme BPF est chargé ou déchargé.

                      struct {
                          struct perf_event_header header;
                          u16    type;
                          u16    flags;
                          u32   id;
                          u8 tag[BPF_TAG_SIZE];
                          struct sample_id sample_id;
                      };

                  type   est une des valeurs suivantes :

                         PERF_BPF_EVENT_PROG_LOAD
                                Un programme BPF est chargé.

                         PERF_BPF_EVENT_PROG_UNLOAD
                                Un programme BPF est déchargé

                  id     est l'identifiant du programme BPF.

                  tag    est l'étiquette du programme BPF. Actuellement, BPF_TAG_SIZE est  défini
                         à 8.

              PERF_RECORD_CGROUP (depuis Linux 5.7)
                  Cet enregistrement indique si un cgroup est créé et activé.

                      struct {
                          struct perf_event_header header;
                          u64    id;
                          char   path[];
                          struct sample_id sample_id;
                      };

                  id     est  l'identifiant  du  cgroup.  Il peut aussi être récupéré à l'aide de
                         name_to_handle_at(2) sur le chemin du cgroup (en  tant  que  gestion  de
                         fichier).

                  path   est le chemin du cgroup depuis la racine.

              PERF_RECORD_TEXT_POKE (depuis Linux 5.8)
                  Cet  enregistrement  indique  une  modification  dans  le  texte du noyau. Cela
                  comprend les ajouts et les suppressions de texte et  la  taille  correspondante
                  est de zéro dans ce cas.

                      struct {
                          struct perf_event_header header;
                          u64    addr;
                          u16    old_len;
                          u16    new_len;
                          u8     bytes[];
                          struct sample_id sample_id;
                      };

                  addr   est l'adresse de la modification.

                  old_len
                         est l'ancienne taille.

                  new_len
                         est la nouvelle taille.

                  bytes  contient les anciens octets immédiatement suivis des nouveaux.

   Gestion du dépassement
       Des  événements  peuvent  être  positionnés  pour  signaler  quand  on dépasse une limite,
       indiquant un dépassement. Les conditions d'un dépassement  peuvent  être  récupérées  avec
       poll(2),  select(2)  ou  epoll(7).  Alternativement, les évènements de dépassement peuvent
       être capturés à l'aide d'un gestionnaire de signal en activant les signaux  d'E/S  sur  le
       descripteur  de  fichier ;  voir  le  point  sur  les opérations F_SETOWN et F_SETSIG dans
       fcntl(2).

       Les débordements ne sont générés que par les événements  d'échantillonnage  (sample_period
       doit avoir une valeur non nulle).

       Deux façons permettent de générer des notifications de débordement.

       La première est de paramétrer une valeur wakeup_events ou wakeup_watermark qui générera un
       signal si un certain nombre d'échantillons ou d'octets  ont  été  écrits  dans  le  tampon
       circulaire mmap. Dans ce cas, un signal de type POLL_IN est envoyé.

       L'autre  façon  est  d'utiliser  l'ioctl  PERF_EVENT_IOC_REFRESH.  Cet  ioctl  ajoute à un
       compteur qui décrémente à chaque fois que l'événement dépasse. Quand il est  non  nul,  un
       signal  POLL_IN est envoyé en cas de dépassement, mais une fois que la valeur a atteint 0,
       un signal de type POLL_HUP est envoyé et l'événement sous-jacent est désactivé.

       Le rafraîchissement d'un leader de groupe d'événements rafraîchit toute la fratrie, et  un
       rafraîchissement   avec   un  paramètre  de  0  active  un  rafraîchissement  infini.  Ces
       comportements ne sont pas gérés et ne devraient pas être utilisés.

       À partir de Linux 3.18, POLL_HUP est initié si l'événement à surveiller est rattaché à  un
       processus différent et que celui-ci se termine.

   Instruction rdpmc
       À  partir de Linux 3.4 sur x86, l'instruction rdpmc permet d'obtenir des lectures à faible
       latence sans avoir à entrer dans le noyau. Remarquez que l'utilisation de rdpmc n'est  pas
       nécessairement plus rapide que d'autres méthodes pour lire des valeurs d'événement.

       Cette  prise  en charge peut être détectée avec le champ cap_usr_rdpmc dans la page mmap ;
       de la documentation pour calculer  les  valeurs  d'événement  est  disponible  dans  cette
       section.

       À  l'origine,  quand  la  prise  en  charge  de  rdpmc  a été activée, tout processus (pas
       seulement ceux ayant un événement perf actif) pouvait utiliser  l'instruction  rdpmc  pour
       accéder  aux compteurs. À partir de Linux 4.0, la prise en charge de rdpmc n'est autorisée
       que si un événement  est  actuellement  activé  dans  le  contexte  d'un  processus.  Pour
       restaurer l'ancien comportement, inscrivez la valeur 2 dans /sys/devices/cpu/rdpmc.

   Appels ioctl perf_event
       Plusieurs ioctls agissent sur les descripteurs de fichier de perf_event_open().

       PERF_EVENT_IOC_ENABLE
              Cela active l'événement individuel ou le groupe d'événements indiqué par l'argument
              de descripteur de fichier.

              Si le bit PERF_IOC_FLAG_GROUP est défini dans  l’argument  ioctl,  alors  tous  les
              événements  d’un  groupe  sont  activés,  même  si l’événement indiqué n’est pas le
              leader de groupe (mais consultez la section BOGUES).

       PERF_EVENT_IOC_DISABLE
              Cela désactive le  compteur  individuel  ou  le  groupe  d'événements  indiqué  par
              l'argument de descripteur de fichier.

              L'activation  ou  la  désactivation  du  leader  d'un groupe active ou désactive la
              totalité du groupe. Autrement dit pendant que le leader de  groupe  est  désactivé,
              aucun  des  compteurs  du  groupe  ne compte. L'activation ou la désactivation d'un
              membre du groupe qui n'est pas le leader arrête ce  son  compteur,  mais  n'affecte
              aucun des autres compteurs.

              Si  le  bit  PERF_IOC_FLAG_GROUP  est  défini dans l’argument ioctl, alors tous les
              événements d’un groupe sont désactivés, même si l’événement indiqué  n’est  pas  le
              leader de groupe (mais consultez la section BOGUES).

       PERF_EVENT_IOC_REFRESH
              Les  compteurs  de  dépassements  non hérités peuvent utiliser cela pour activer un
              compteur pour un nombre de dépassements indiqué par l'argument, après lequel il est
              désactivé.  Les  appels  suivants  de cet ioctl ajoutent la valeur de l'argument au
              décompte actuel. Un signal avec POLL_IN défini  est  envoyé  à  chaque  dépassement
              jusqu'à  ce  que  ce compte atteigne 0 ; quand cela arrive, un signal avec POLL_HUP
              défini est envoyé et l'événement est désactivé. L'utilisation de 0  comme  argument
              est considéré comme un comportement indéfini.

       PERF_EVENT_IOC_RESET
              Redéfinir   le   compte  d'événements  indiqué  par  l'argument  à  zéro.  Cela  ne
              réinitialise  que  les  décomptes ;  réinitialiser  les  valeurs  de   multiplexage
              time_enabled et time_running est impossible.

              Si  le  bit  PERF_IOC_FLAG_GROUP  est  défini dans l’argument ioctl, alors tous les
              événements d’un groupe sont réinitialisés, même si l’événement indiqué n’est pas le
              leader de groupe (mais consultez la section BOGUES).

       PERF_EVENT_IOC_PERIOD
              Cela met à jour la période de dépassement pour l’événement.

              Depuis  Linux 3.7  (sur  ARM)  et  Linux 3.14 (toutes les autres architectures), la
              nouvelle période  est  effective  immédiatement.  Sur  les  noyaux  précédents,  la
              nouvelle période n’était effective qu’après le dépassement suivant.

              L'argument  est  un  pointeur  vers  une  valeur  sur 64 bits contenant la nouvelle
              période voulue.

              Avant Linux 2.6.36, cet ioctl échouait toujours à cause d’un bogue dans le noyau.

       PERF_EVENT_IOC_SET_OUTPUT
              Cela indique au noyau de signaler les notifications d'événement dans le descripteur
              de  fichier  indiqué  plutôt que dans celui par défaut. Les descripteurs de fichier
              doivent tous être sur le même processeur.

              L'argument indique le descripteur de fichier désiré ou -1 si la sortie devrait être
              ignorée.

       PERF_EVENT_IOC_SET_FILTER (depuis Linux 2.6.33)
              Cela ajoute un filtre ftrace à cet événement.

              L'argument est un pointeur vers le filtre ftrace voulu.

       PERF_EVENT_IOC_ID (depuis Linux 3.12)
              Cela  renvoie la valeur d’identifiant de l’événement pour le descripteur de fichier
              d’événement donné.

              L'argument est un pointeur vers un entier non  signé  de  64 bits  pour  garder  le
              résultat.

       PERF_EVENT_IOC_SET_BPF (depuis Linux 4.1)
              Cela  permet  de rattacher un programme Berkeley Packet Filter (BPF) à un événement
              de traçage d'un kprobe  existant.  Vous  avez  besoin  des  privilèges  CAP_PERFMON
              (depuis Linux 5.8) ou CAP_SYS_ADMIN pour utiliser cet ioctl.

              Le  paramètre  est  un  descripteur  de  fichier de programme BPF créé par un appel
              système bpf(2) précédent.

       PERF_EVENT_IOC_PAUSE_OUTPUT (depuis Linux 4.7)
              Cela permet de mettre en pause et de relancer le tampon circulaire d'un  événement.
              Un  tampon  mis  en  pause  n'empêche  pas la génération d'échantillons mais il les
              désactive. Les échantillons désactivés sont considérés comme perdus  et  provoquent
              la  génération  d'un  PERF_RECORD_LOST  si  possible. Un signal de dépassement peut
              toujours être récupéré par l'échantillon désactivé bien que  le  tampon  circulaire
              reste vide.

              Le  paramètre  est  un  entier  32 bits non signé. Une valeur autre que zéro met en
              pause le  tampon  circulaire  alors  qu'une  valeur  de  zéro  réactive  le  tampon
              circulaire.

       PERF_EVENT_MODIFY_ATTRIBUTES (depuis Linux 4.17)
              Cela  permet  de  modifier un événement existant sans le gaspillage de fermeture et
              réouverture d’un nouvel événement. Actuellement, cela n'est pris en charge que pour
              les événements de points d'arrêt.

              L'argument  est  un  pointeur  vers  une  structure  perf_event_attr  contenant les
              paramètres de l'événement mis à jour.

       PERF_EVENT_IOC_QUERY_BPF (depuis Linux 4.16)
              Cela permet de chercher les programmes Berkeley Packet Filter (BPF) rattachés à  un
              point  de traçage kprobe existant. Vous ne pouvez rattacher qu'un programme BPF par
              événement mais vous pouvez avoir plusieurs  événements  rattachés  à  un  point  de
              traçage.  Rechercher  cette  valeur  sur  un  événement de point de traçage renvoie
              l'identifiant de tous les programmes BPF dans  tous  les  événements  rattachés  au
              point  de  traçage.  Il  vous faut les privilèges CAP_PERFMON (depuis Linux 5.8) ou
              CAP_SYS_ADMIN pour utiliser cet ioctl.

              L'argument est un pointeur vers une structure
                  struct perf_event_query_bpf {
                      __u32    ids_len;
                      __u32    prog_cnt;
                      __u32    ids[0];
                  };

              Le champ ids_len indique le nombre d'identifiants pouvant entrer  dans  le  tableau
              ids  fourni.  La  valeur  prog_cnt  est  remplie  par  le  noyau  avec le nombre de
              programmes BPF rattachés. Le tableau ids est rempli  par  l'identifiant  de  chaque
              programme  BPF  rattaché. S'il y a plus de programmes que de place dans le tableau,
              le noyau renverra ENOSPC et ids_len indiquera le nombre d'identifiants de programme
              copiés avec succès.

   Utilisation de prctl(2)
       Un processus peut activer ou désactiver tous les groupes d'événements actuellement ouverts
       en utilisant les opérations PR_TASK_PERF_EVENTS_ENABLE et  PR_TASK_PERF_EVENTS_DISABLE  de
       prctl(2). Cela ne s'applique qu'aux événements créés localement par le processus appelant.
       Cela ne s'applique pas aux événements créés par d'autres processus rattachés au  processus
       appelant  ou  aux  événements  d'un  processus  parent. Cela n'active et désactive que les
       leaders de groupe, aucun autre des membres des groupes.

   Fichiers de configuration relatifs à perf_event
       Fichiers de /proc/sys/kernel/

           /proc/sys/kernel/perf_event_paranoid
                  Le fichier perf_event_paranoid peut être défini pour  restreindre  l'accès  aux
                  compteurs de performance :

                  2   ne  permettre  que  les  mesures  en  espace utilisateur (par défaut depuis
                      Linux 4.6).
                  1   permettre à la fois les mesures noyau  et  utilisateur  (par  défaut  avant
                      Linux 4.6).
                  0   permettre   l'accès   aux   données  spécifiques  au  processeur  sauf  les
                      échantillons de point de trace bruts ;
                  -1  pas de restriction.

                  L'existence du fichier  perf_event_paranoid  est  la  méthode  officielle  pour
                  déterminer si un noyau gère perf_event_open().

           /proc/sys/kernel/perf_event_max_sample_rate
                  Cela  définit  le  taux  d'échantillonnage  maximal.  Un réglage trop haut peut
                  permettre aux utilisateurs d'échantillonner à un taux ayant un impact  sur  les
                  performances  de la machine et éventuellement planter la machine. La valeur par
                  défaut est 100 000 (échantillons par seconde).

           /proc/sys/kernel/perf_event_max_stack
                  Ce fichier définit  la  profondeur  maximale  des  entrées  de  trame  de  pile
                  signalées lors de la génération d'une trace.

           /proc/sys/kernel/perf_event_mlock_kb
                  Le  nombre  maximal de pages qu'un utilisateur sans droit peut verrouiller avec
                  mlock(2). La valeur par défaut est 516 (ko).

       Fichiers de /sys/bus/event_source/devices/

           Depuis Linux 2.6.34, le  noyau  permet  d'avoir  plusieurs  PMU  disponibles  pour  la
           surveillance.  Les  informations  sur  la façon de programmer ces PMU sont disponibles
           dans /sys/bus/event_source/devices/. Tous les sous-répertoires correspondent à une PMU
           différente.

           /sys/bus/event_source/devices/*/type (depuis Linux 2.6.38)
                  Cela  contient  un  entier  qui  peut  être  utilisé  dans  le  champ  type  de
                  perf_event_attr pour indiquer la volonté d'utiliser cette PMU.

           /sys/bus/event_source/devices/cpu/rdpmc (depuis Linux 3.4)
                  Si ce fichier est 1, alors l’accès direct de l’espace utilisateur aux registres
                  de  compteurs  de  performance est permis à l’aide de l’instruction rdpmc. Cela
                  peut être désactivé en écrivant 0 dans le fichier.

                  À partir de Linux 4.0, le comportement a changé pour que 1 n'autorise désormais
                  que  l'accès  aux  processus  ayant des événements perf actifs et que 2 indique
                  l'ancien comportement autorisant l'accès à n'importe quoi.

           /sys/bus/event_source/devices/*/format/ (depuis Linux 3.4)
                  Ce sous-répertoire contient des renseignements sur les sous-champs  spécifiques
                  à  l’architecture disponibles pour la programmation des divers champs config de
                  la structure perf_event_attr.

                  Le contenu de chaque fichier est le nom du champ de configuration,  suivi  d’un
                  deux-points,   suivi  d’une  suite  d’intervalles  d’entiers  séparés  par  des
                  virgules.  Par  exemple,  le  fichier  event  pourrait   contenir   la   valeur
                  config1:1,6-10,44  qui  indique  que l’événement est un attribut qui occupe les
                  bits 1, 6 à 10 et 44 de perf_event_attr::config1.

           /sys/bus/event_source/devices/*/events/ (depuis Linux 3.4)
                  Ce sous-répertoire contient des fichiers avec des  événements  prédéfinis.  Les
                  contenus  sont  des  chaînes  décrivant  les  réglages d'événements exprimés en
                  termes des champs trouvés dans le répertoire ./format/ mentionné  précédemment.
                  Ce  ne sont pas nécessairement des listes complètes de tous les évènements pris
                  en charge par une PMU, mais généralement un  sous-ensemble  d'événements  jugés
                  utiles ou intéressants.

                  Le  contenu  de chaque fichier est une liste de noms d’attribut séparés par des
                  virgules. Chaque entrée a  une  valeur  facultative  (soit  hexadécimale,  soit
                  décimale).  Si  aucune  valeur  n’est indiquée, alors un champ d’un seul bit de
                  valeur  1  est   supposé.   Un   exemple   d’entrée   pourrait   ressembler   à
                  event=0x2,inv,ldlat=3.

           /sys/bus/event_source/devices/*/uevent
                  Ce  fichier  est l’interface standard de périphérique du noyau pour l’injection
                  d’événements de branchement à chaud.

           /sys/bus/event_source/devices/*/cpumask (depuis Linux 3.7)
                  Le fichier cpumask contient  une  liste  d’entiers  séparés  par  des  virgules
                  indiquant un numéro représentatif de processeur pour chaque socket (boîtier) de
                  la carte mère. C’est nécessaire lors de la définition  d’événements  uncore  ou
                  northbridge,  puisque  ces  PMU  présentent  des  événements à travers tous les
                  sockets.

VALEUR RENVOYÉE

       On success, perf_event_open()  returns the new file descriptor. On error, -1  is  returned
       and errno is set to indicate the error.

ERREURS

       Les  erreurs  renvoyées  par perf_event_open() peuvent être incohérentes et peuvent varier
       suivant les architectures de processeur et les unités de surveillance des performances.

       E2BIG  Renvoyé si la valeur size de perf_event_attr  est  trop  petite  (plus  petite  que
              PERF_ATTR_SIZE_VER0),  trop  grande  (plus  grande  que  la taille de page) ou plus
              grande que ce que le noyau peut gérer et que les octets supplémentaires ne sont pas
              zéro. Lorsque E2BIG est renvoyé, le champ size de perf_event_attr est remplacé, par
              le noyau, par la taille attendue de la structure.

       EACCES Renvoyé quand l’événement demandé nécessite les droits  CAP_PERFMON  (depuis  Linux
              5.8)  ou  CAP_SYS_ADMIN  (ou  un réglage paranoïaque de perf_event plus permissif).
              Quelques cas habituels où un processus non privilégié  pourrait  tomber  sur  cette
              erreur :  l’attachement  à  un  processus  appartenant  à  un autre utilisateur, la
              surveillance de tous  les  processus  sur  un  processeur  donné  (c’est-à-dire  en
              indiquant  -1  pour l’argument pid) et l’absence de réglage exclude_kernel quand le
              réglage paranoïaque le nécessite.

       EBADF  Renvoyé  si  le  descripteur  de  fichier  group_fd  n’est  pas  valable,  ou,   si
              PERF_FLAG_PID_CGROUP est défini, si le descripteur de fichier cgroup dans pid n’est
              pas valable.

       EBUSY (depuis Linux 4.1)
              Renvoyé si un événement a déjà un accès exclusif à la PMU.

       EFAULT Renvoyé si le pointeur attr pointe vers un adresse de mémoire non valable.

       EINTR  Renvoyé si on essaie de mélanger la gestion de perf et de ftrace pour un uprobe.

       EINVAL Renvoyé si l’événement  indiqué  n’est  pas  valable.  De  nombreuse  raisons  sont
              possibles  pour  cela. Une liste non exhaustive : sample_freq est plus grand que le
              réglage  maximal ;  le  cpu  à  surveiller  n’existe  pas ;  read_format  est  hors
              intervalle ;   sample_type   est   hors  intervalle ;  la  valeur  flags  est  hors
              intervalle ; exclusive ou pinned sont définis et l’événement n’est pas un leader de
              groupe ;  les  valeurs  config de l’événement sont hors de l’intervalle ou des bits
              réservés définis ; l’événement générique sélectionné n’est pas pris en charge ;  la
              place est insuffisante pour ajouter l’événement sélectionné.

       EMFILE Chaque  événement  ouvert  utilise  un  descripteur  de fichier. Si un grand nombre
              d’événements est ouvert, la limite de descripteurs de fichier  par  processus  sera
              atteinte et aucun événement supplémentaire ne pourra être créé.

       ENODEV Renvoyé  quand  l’événement  implique une fonctionnalité non prise en charge par le
              processeur actuel.

       ENOENT Renvoyé si le réglage type n’est pas valable. Cette erreur est  également  renvoyée
              pour certains événements génériques non pris en charge.

       ENOSPC Avant  Linux 3.3, s'il manquait de la place pour l'événement, ENOSPC était renvoyé.
              Dans Linux 3.3, cela a été modifié en EINVAL. ENOSPC est toujours renvoyé en cas de
              tentative d’ajout de plus d’événements de point d'arrêt que permis par le matériel.

       ENOSYS Renvoyé  si  PERF_SAMPLE_STACK_USER est défini dans sample_type et que ce n’est pas
              pris en charge par le matériel.

       EOPNOTSUPP
              Renvoyé si un événement nécessitant une fonctionnalité spécifique du  matériel  est
              demandé  alors  qu’il  n’y  a  pas  de prise en charge matérielle. Cela comprend la
              demande d’événement à faible dérapage si ce n’est pas pris en charge, le  suivi  de
              branchement s’il n’est pas pris en charge, l’échantillonnage si aucune interruption
              PMU n’est disponible et les piles de branchement pour les événements logiciels.

       EOVERFLOW (depuis Linux 4.8)
              Renvoyé si PERF_SAMPLE_CALLCHAIN est demandé et si sample_max_stack est plus  grand
              que le maximum indiqué dans /proc/sys/kernel/perf_event_max_stack.

       EPERM  Renvoyé  sur  beaucoup  d’architectures  (mais  pas  toutes)  quand un des réglages
              exclude_hv, exclude_idle, exclude_user ou exclude_kernel non  pris  en  charge  est
              indiqué.

              Cela peut aussi arriver, comme avec EACCES, quand l’événement demandé nécessite les
              droits CAP_PERFMON (depuis Linux 5.8) ou CAP_SYS_ADMIN (ou un  réglage  paranoïaque
              de  perf_event plus permissif). Cela comprend le réglage d’un point d'arrêt sur une
              adresse du noyau et (depuis Linux 3.13) le réglage d’un point de trace de  fonction
              du noyau.

       ESRCH  Renvoyé en cas de tentative d’attachement à un processus qui n’existe pas.

VERSIONS

       perf_event_open()    a    été    introduite   dans   Linux 2.6.31   mais   était   appelée
       perf_counter_open(). Elle a été renommée dans Linux 2.6.32.

CONFORMITÉ

       Cet appel système perf_event_open() est spécifique à Linux et ne devrait pas être  employé
       dans des programmes destinés à être portables.

NOTES

       Le  moyen  officiel pour savoir si la prise en charge de perf_event_open() est activée est
       de vérifier si le fichier /proc/sys/kernel/perf_event_paranoid existe.

       La  capacité  CAP_PERFMON  (depuis  Linux 5.58)  fournit  une  approche  sécurisée  de  la
       surveillance  des  performances  et  des  opérations de visibilité d'un système suivant un
       principe du moindre privilège (POSIX IEEE 1003.1e). Ces modalités  d'accès  qui  utilisent
       CAP_PERFMON  au  lieu  du  beaucoup  plus  puissant CAP_SYS_ADMIN enlève des chances d'une
       mauvaise utilisation des droits et rend les opérations plus sécurisées.  L'utilisation  de
       CAP_SYS_ADMIN  pour la surveillance sécurisée des performances du système et une meilleure
       visibilité est déconseillée et vous devriez préférer la capacité CAP_PERFMON.

BOGUES

       L'option F_SETOWN_EX de fcntl(2) est nécessaire pour obtenir correctement les  signaux  de
       dépassement dans les threads. Cela a été introduit dans Linux 2.6.32.

       Avant  Linux 3.3  (en  tout  cas  pour  x86),  le noyau ne vérifiait pas si les événements
       pouvaient être programmés ensemble avant le moment de la lecture. La même chose arrive sur
       tous  les  noyaux  connus si le watchdog NMI est activé. Cela signifie que pour voir si un
       ensemble donné d'événements fonctionne, il faut appeler perf_event_open(), démarrer,  puis
       lire avant d'être sûr de pouvoir obtenir des mesures valables.

       Avant  Linux 2.6.34,  les  contraintes d'événements n'étaient pas renforcées par le noyau.
       Dans ce cas, certains événements renverraient « 0 » silencieusement si le noyau les  avait
       programmés dans un emplacement de compteur incorrect.

       Avant  Linux 2.6.34,  à  cause  d'un  bogue  lors  du  multiplexage,  de mauvais résultats
       pouvaient être renvoyés.

       Les noyaux de Linux 2.6.35 à Linux 2.6.39 peuvent planter rapidement si inherit est activé
       et que de nombreux threads sont démarrés.

       Avant Linux 2.6.35, PERF_FORMAT_GROUP ne fonctionnait pas avec les processus attachés.

       À  cause  d'un  bogue  dans  le  code  du  noyau entre Linux 2.6.36 et Linux 3.0, le champ
       watermark était ignoré et agissait comme si  wakeup_event  avait  été  choisi  si  l'union
       contenait une valeur non nulle.

       De Linux 2.6.31 à Linux 3.4, l’argument ioctl PERF_IOC_FLAG_GROUP était cassé et opérait à
       répétition sur l’événement indiqué au  lieu  d’itérer  parmi  tous  les  événements  d’une
       fratrie d’un groupe.

       De Linux 3.4 à Linux 3.11, les bits mmap cap_usr_rdpmc et cap_usr_time étaient associés au
       même emplacement. Le code devrait plutôt être modifié pour utiliser  les  nouveaux  champs
       cap_user_rdpmc et cap_user_time à la place.

       Vérifiez  toujours  deux  fois  les  résultats. Plusieurs événements généralisés ont eu de
       fausses valeurs. Par exemple, les branchements retirés ne mesuraient pas  la  bonne  chose
       sur les machines AMD jusqu'au noyau 2.6.35.

EXEMPLES

       Ce  qui suit est un court exemple qui mesure le décompte total d'instructions d'un appel à
       printf(3).

       #include <stdlib.h>
       #include <stdio.h>
       #include <unistd.h>
       #include <string.h>
       #include <sys/ioctl.h>
       #include <linux/perf_event.h>
       #include <asm/unistd.h>

       static long
       perf_event_open(struct perf_event_attr *hw_event, pid_t pid,
                       int cpu, int group_fd, unsigned long flags)
       {
           int ret;

           ret = syscall(__NR_perf_event_open, hw_event, pid, cpu,
                          group_fd, flags);
           return ret;
       }

       int
       main(int argc, char *argv[])
       {
           struct perf_event_attr pe;
           long long count;
           int fd;

           memset(&pe, 0, sizeof(pe));
           pe.type = PERF_TYPE_HARDWARE;
           pe.size = sizeof(pe);
           pe.config = PERF_COUNT_HW_INSTRUCTIONS;
           pe.disabled = 1;
           pe.exclude_kernel = 1;
           pe.exclude_hv = 1;

           fd = perf_event_open(&pe, 0, -1, -1, 0);
           if (fd == -1) {
              fprintf(stderr, "Erreur d'ouverture du leader %llx\n", pe.config);
              exit(EXIT_FAILURE);
           }

           ioctl(fd, PERF_EVENT_IOC_RESET, 0);
           ioctl(fd, PERF_EVENT_IOC_ENABLE, 0);

           printf("Mesure du décompte d'instructions pour ce printf\n");

           ioctl(fd, PERF_EVENT_IOC_DISABLE, 0);
           read(fd, &count, sizeof(count));

           printf("%lld instructions utilisées\n", count);

           close(fd);
       }

VOIR AUSSI

       perf(1), fcntl(2), mmap(2), open(2), prctl(2), read(2)

       Documentation/admin-guide/perf-security.rst dans l'arborescence des sources du noyau

COLOPHON

       Cette page fait partie de la publication 5.13 du projet man-pages Linux.  Une  description
       du  projet et des instructions pour signaler des anomalies et la dernière version de cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

TRADUCTION

       La traduction française de cette  page  de  manuel  a  été  créée  par  Christophe  Blaess
       <https://www.blaess.fr/christophe/>,  Stéphan  Rafin  <stephan.rafin@laposte.net>, Thierry
       Vignaud <tvignaud@mandriva.com>, François Micaux, Alain  Portal  <aportal@univ-montp2.fr>,
       Jean-Philippe    Guérard   <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)   <jean-
       luc.coulon@wanadoo.fr>,   Julien    Cristau    <jcristau@debian.org>,    Thomas    Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin
       Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,  Denis
       Barbier  <barbier@debian.org>,  David  Prévot <david@tilapin.org> et Jean-Philippe MENGUAL
       <jpmengual@debian.org>

       Cette traduction est une documentation libre ; veuillez vous reporter  à  la  GNU  General
       Public   License   version 3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  concernant  les
       conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un
       message à ⟨debian-l10n-french@lists.debian.org⟩.