Changes between Initial Version and Version 1 of wti_box_attribution


Ignore:
Timestamp:
Aug 1, 2016, 3:14:11 PM (8 years ago)
Author:
laniel
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • wti_box_attribution

    v1 v1  
     1= WTI mailbox attribution politic =
     2
     3**Une version française de cette page peut être trouvée [https://www-soc.lip6.fr/trac/almos-mk/wiki/attribution_boite_wti, ici]**
     4
     5[[PageOutline]]
     6The architecture [https://www-soc.lip6.fr/trac/tsar TSAR] has a component [http://www.soclib.fr/trac/dev/wiki/Component/VciIopic Iopic]. This component permits an external peripheral to write to a specific address.
     7
     8This peripheral is principally used to write to certain register of the [http://www.soclib.fr/trac/dev/wiki/Component/VciXicu Xicu] component. Those registers are mailboxes, when one of them is written then the XICU emits an interrupt so the concerned core will execute the associated ISR.
     9
     10We call those interruptions the **Write Triggered Interruptions (WTI)** because they are triggered by a write operation in the Xicu's mailboxes register.
     11
     12== Mailboxes' attribution ==
     13Each cluster possess an XICU which has 16 mailboxes, 4 of them are reserved for the inter process interruptions (IPI). The fifth mailbox of the cluster 0's Xicu is also reserved, it is the `DEV_NULL` mailbox, its use will be explained later.
     14
     15External peripherals can use 12 of this mailboxes to signal their I/O operation's end and that the ISR associated to the peripheral has to be executed.
     16
     17We choose an attribution politic called "polluter-payer".
     18
     19When a thread executes an I/O operation, it will be the core which executes the thread which will execute the ISR associated to that operation. For this we have to :
     201. get a mailbox,
     212. reconfigure the Xicu's mask,
     223. link the peripheral's ISR to the mailbox
     23
     24When the ISR will execute, we have to :
     251. release the mailbox,
     262. reconfigure the Xicu's mask to mask the interrupt,
     273. unlink the peripheral's ISR to the mailbox
     28
     29
     30== Déroulement d'une opération d'entrée/sortie avec un périphérique externe ==
     31Chaque périphérique externe est protégé par un verrou global, pour pouvoir réaliser une opération d'entrée/sortie avec l'un de ces périphériques il faut d'abord prendre ce verrou.
     32
     33Nous avons décidé qu'avant de prendre le verrou du périphérique le processeur devait s'assurer d'avoir obtenu une boîte aux lettres. En effet, il est plus facile d'obtenir une boîte aux lettres car il y en a 12 par cluster. De plus elles ne sont partagées que par les cœur d'un même cluster. //A contrario//, les périphériques sont uniques et tous les cœurs de l'architecture sont en concurrence pour les accéder.
     34
     35Une fois la boîte aux lettres et le verrou du périphérique obtenus il faudra configurer l'Iopic afin que celui-ci écrive dans la boîte aux lettres.
     36
     37
     38
     39Lors de la réception d'une interruption le verrou du périphérique et la boîte aux lettres seront rendus.
     40
     41De plus, l'IOPIC sera dé-configuré, c'est-à-dire que si le périphérique envoie une interruption celle-ci ira dans une boîte aux lettres particulière : `DEV_NULL`.
     42
     43La boîte aux lettres `DEV_NULL` est la première boîte aux lettres disponibles de l'XICU du cluster 0, son ISR est traitée par le cœur 0 de ce cluster.
     44
     45L'ISR associée à cette boîte aux lettres particulières affiche uniquement un message d'erreur indiquant qu'une interruption non souhaitée a été reçue. Ce mécanisme a été implémenté afin de prémunir le système d'exploitation de potentiels dysfonctionnement d'un périphérique.
     46
     47Dans la première figure, le cœur P1 initie une opération d'entrée/sortie avec le disque. En plus de paramétrer le disque, le cœur paramètre aussi l'IOPIC afin que le disque écrive dans la boîte aux lettres 5 de l'XICU locale.
     48
     49Lorsque le disque aura fini son opération il ordonnera à l'IOPIC d'écrire dans la boîte aux lettres 5 ce qui aura pour effet de faire exécuter l'ISR liée au disque par le cœur P1.
     50
     51
     52
     53== API d'attribution des boîtes aux lettres ==
     54Pour mettre en place ce mécanisme nous avons dû écrire une API, celle-ci est composée d'une structure et de trois fonctions.
     55
     56Les deux fonctions de base de l'API sont donc `get_configure_mailbox` et `put_mailbox`. En effet, celles-ci pourront être utilisées dans l'écriture de futur driver.
     57
     58=== La structure `mbox_manager`===
     59Cette structure est présente dans chaque cluster, elle contient deux champs :
     60* un spinlock pour prévenir les accès concurents
     61* un tableau d'état des boîtes aux lettres
     62
     63Chaque case du tableau représente l'état d'une boîte aux lettres, ces différents états sont :
     64* IPI : La boîte aux lettres est utilisée pour une IPI, elle ne sera donc pas utilisée pour une WTI. Les ''n'' premières boîtes aux lettres sont réservées à cet usage (où ''n'' est le nombre de cœur du cluster).
     65* FREE : La boîte est libre et peut-être utilisée pour une WTI.
     66* L'identifiant local du cœur propriétaire.
     67
     68=== `void mbox_m_init(struct mbox_manager *mbox_m)` ===
     69Cette fonction est appelée lors de l'initialisation du cluster, elle marque les premières boîtes aux lettres comme étant réservées aux IPI tandis que les autres seront marquées comme étant libres.
     70
     71=== `void get_configure_mailbox(struct mbox_manager *mbox_m, struct device_s *dev)` ===
     72Cette fonction alloue une boîte aux lettres du mbox_manager `mbox_m` au device `dev` reconfigure le masque de l'Xicu et associe l'ISR de `dev` à la boîte au lettre allouée.
     73Cette fonction est bloquante tant qu'aucune boîte aux lettres n'a été trouvée.
     74
     75=== `int put_mailbox(uint_t wti_index, struct mbox_manager *mbox_m)` ===
     76Cette fonction rend la boîte aux lettres d'index `wti_index` appartenant au mbox_manager `mbox_m`, elle masque aussi l'interruption et dés-associe l'ISR et la boîte aux lettres.
     77Cette fonction renvoie 0 en cas de succès ou un code d'erreur dans le cas contraire.
     78
     79== Avantages et inconvénients de cette API ==
     80L'utilisation de cette API permet une certaine souplesse. En effet, grâce à cette API il serait possible d'utiliser tous les périphériques si on disposait d'une XICU possédant une unique boîte aux lettres (bien entendu les processeurs devraient se la partager et il y aurait alors de la séquentialité).
     81
     82Grâce à la politique pollueur/payeur les caches des cœurs ne sont pas gâchés par l'ISR d'un cœur voisin.
     83
     84Toutefois l'utilisation de cette API rallonge les opérations d'entrée/sortie. **En effet, il semblerait que l'exécution d'un simple programme "`open; read; close;`" prenne 40 000 cycles supplémentaires par rapport à une opération d'entrée/sortie sans utilisation de l'API.**
     85
     86
     87
     88 
     89