Changes between Version 10 and Version 11 of attribution_boite_wti
- Timestamp:
- Jul 6, 2016, 12:29:19 PM (8 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
attribution_boite_wti
v10 v11 4 4 L'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. 5 5 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.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. 7 7 8 [[Image(WTI.png)]] 8 UNE IMAGE DE POLLUEUR PAYER 9 9 10 10 On 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. … … 15 15 Les 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. 16 16 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].17 Nous avons choisi une politique d'attribution des boîtes aux lettres dite "pollueur/payeur". 18 18 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. 19 Lorsqu'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. 20 Pour cela il faut donc : 21 1. obtenir une boîte aux lettres, 22 1. reconfigurer le masque de l'Xicu, 23 2. associer l'ISR du périphérique à la boîte aux lettres 20 24 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]. 25 Lors de l'exécution de l'ISR il faudra : 26 1. rendre la boîte aux lettres, 27 2. reconfigurer le masque l'Xicu pour masquer l'interruption, 28 3. dés-associer l'ISR du périphérique à la boîte aux lettres 22 29 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.32 30 33 31 == Déroulement d'une opération d'entrée/sortie avec un périphérique externe == … … 38 36 Une 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. 39 37 40 [[Image(allocation.svg)]] 38 UNE FIGURE 39 40 == API d'attribution des boîtes aux lettres == 41 Pour 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`=== 44 Cette 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 48 Chaque 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` === 54 Cette 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)` === 57 Cette 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. 58 Cette 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)` === 61 Cette 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. 62 Cette fonction renvoie 0 en cas de succès ou un code d'erreur dans le cas contraire. 63 64 Les 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