Changes between Version 10 and Version 11 of attribution_boite_wti


Ignore:
Timestamp:
Jul 6, 2016, 12:29:19 PM (8 years ago)
Author:
laniel
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • attribution_boite_wti

    v10 v11  
    44L'architecture [https://www-soc.lip6.fr/trac/tsar TSAR] possède un composant [http://www.soclib.fr/trac/dev/wiki/Component/VciIopic Iopic]. Ce composant permet à un périphérique externe d'écrire à une adresse donnée.
    55
    6 Ce périphérique est principalement utilisé pour écrire dans certains registres du composant [http://www.soclib.fr/trac/dev/wiki/Component/VciXicu Xicu]. Ces registres sont des boîtes aux lettres, lorsque l'une de ces boîtes a été écrite alors l'Xicu lévera une interruption et le processeur concerné exécutera l'ISR associée.
     6Ce périphérique est principalement utilisé pour écrire dans certains registres du composant [http://www.soclib.fr/trac/dev/wiki/Component/VciXicu Xicu]. Ces registres sont des boîtes aux lettres, lorsque l'une de ces boîtes a été écrite alors l'Xicu lèvera une interruption et le processeur concerné exécutera l'ISR associée.
    77
    8 [[Image(WTI.png)]]
     8UNE IMAGE DE POLLUEUR PAYER
    99
    1010On appelle ces interruptions des **Write Triggered Interruptions (WTI)** car elles sont déclenchées par une opération d'écriture dans les registres boîtes aux lettres de l'Xicu.
     
    1515Les périphériques externes peuvent donc utiliser 12 de ces boîtes aux lettres afin de signaler la fin de l'opération d'entrée sortie et qu'il faut donc lancer l'ISR associée à ce périphérique.
    1616
    17 Nous avons choisi une politique d'attribution des boîtes aux lettres inspirée de celle du [https://www-soc.lip6.fr/trac/giet-vm/wiki/kernel_interrupts GIET-VM].
     17Nous avons choisi une politique d'attribution des boîtes aux lettres dite "pollueur/payeur".
    1818
    19 Chaque cœur est responsable d'un certains nombre de boîte aux lettres, c'est-à-dire qu'il exécutera les ISR des interruptions venant de ses boîtes aux lettres.
     19Lorsqu'une thread exécute une opération d'entrée/sortie, ce sera le cœur sur lequel elle s'exécute qui traitera l'ISR associée à cette opération.
     20Pour cela il faut donc :
     211. obtenir une boîte aux lettres,
     221. reconfigurer le masque de l'Xicu,
     232. associer l'ISR du périphérique à la boîte aux lettres
    2024
    21 Afin d'équilibrer la charge entre les différents cœur il a été décidé d'utiliser une stratégie d'allocation basée sur le [https://fr.wikipedia.org/wiki/Round-robin_(informatique) round robin].
     25Lors de l'exécution de l'ISR il faudra :
     261. rendre la boîte aux lettres,
     272. reconfigurer le masque l'Xicu pour masquer l'interruption,
     283. dés-associer l'ISR du périphérique à la boîte aux lettres
    2229
    23 Un **index** indiquera la boîte suivant la dernière boîtes aux lettres allouées, la recherche d'une boîte libre s'effectuera circulairement à partir de cet index.
    24 
    25 [[Image(responsibility.svg)]]
    26 
    27 Sur la figure, B9 est la dernière boîte à avoir été allouée (l'index pointe sur B10). La recherche aura donc lieu à partir de B10, or B10 est déjà utilisée.
    28 
    29 Par conséquent ce sera B11 qui sera allouée, l'index pointera sur B12 et ce sera le processeur P3 qui exécutera l'ISR.
    30 
    31 Ici les boîtes aux lettres responsables des IPI sont B0, B4, B8 et B12. Ces boîtes seront **toujours** marquées  comme occupées.
    3230
    3331== Déroulement d'une opération d'entrée/sortie avec un périphérique externe ==
     
    3836Une 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.
    3937
    40 [[Image(allocation.svg)]]
     38UNE FIGURE
     39
     40== API d'attribution des boîtes aux lettres ==
     41Pour mettre en place ce mécanisme nous avons dû écrire une API, celle-ci est composée d'une structure et de trois fonctions.
     42
     43=== La structure `mbox_manager`===
     44Cette structure est présente dans chaque cluster, elle contient deux champs :
     45* un spinlock pour prévenir les accès concurents
     46* un tableau d'état des boîtes aux lettres
     47
     48Chaque case du tableau représente l'état d'une boîte aux lettres, ces différents états sont :
     49* 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).
     50* FREE : La boîte est libre et peut-être utilisée pour une WTI.
     51* L'identifiant local du cœur propriétaire.
     52
     53=== `mbox_m_init` ===
     54Cette 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.
     55
     56=== `get_configure_mailbox(struct mbox_manager *mbox_m, struct device_s *dev)` ===
     57Cette 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.
     58Cette fonction est bloquante tant qu'aucune boîte aux lettres n'a été trouvée.
     59
     60=== `int put_mailbox(uint_t wti_index, struct mbox_manager *mbox_m)` ===
     61Cette 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.
     62Cette fonction renvoie 0 en cas de succès ou un code d'erreur dans le cas contraire.
     63
     64Les 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.
     65
     66 
     67