[Kos-dev] [BUG] Deadlock

Thomas Petazzoni kos-dev@enix.org
21 Feb 2002 19:06:54 +0100


Salut,

Et oui les bugs de deadlock ca commence. Et avec la memoire, je pense
qu'on a pas fini.

J'expose le probleme, et ensuite je propose ma solution.

Le probleme
-----------

arch_map_virtual_page et arch_unmap_virtual_page font des locks sur
kernel_space_lock, afin d'etre sur de ne pas se marcher dessus lors de
la modification des PDs et PTs de la zone noyau. Or dans ce lock, je
dois faire un add_rmapping (si on est dans map) ou un del_rmapping (si
on est dans unmap). Le probleme est que la gestion des reverse mapping
(add et del) dependent de kslab.

Et kslab, pour agrandir/desagrandir les caches il a (indirectement)
besoin de la fonction arch_get_paddr_at_vaddr, pour retrouver le slab
courant (qui est stocke dans le GPFME). Et evidemment cette fonction
prend le kernel_space_lock, en read. Mais on est deja dans arch_map,
ou arch_unmap qui ont le lock => DEADLOCK.

Clairement le probleme vient du fait qu'on couche basse (arch/mm)
utilise une couche haute (kmem). Que cette couche haute depende de la
couche basse, c'est normal, mais l'inverse non.

Les solutions
-------------

1. Mettre les del_rmapping et add_rmapping en dehors des
   kernel_space_lock. Mais j'ai reflechi, cela n'est pas possible. En
   effet si on demappe la page (au niveau des PD, PT), qu'on libere le
   lock (avant de virer le reverse mapping) et qu'on se choppe une
   interruption (possible car on n'a plus le lock). Par le plus grand
   des hasards, le swapper est appelle, et encore une fois par le plus
   grand des hasards, c'est justement la page qu'on etait en train de
   demapper qu'il choisit de swapper. Il parcourt la liste des reverse
   mapping pour marquer la page comme non presente et swappee. Puisque
   le reverse mapping pour notre page virtuelle est toujours la, bin
   le swapper va marquer. Et notre page se retrouve de nouveau
   mappee... On pourrait solutionner le truc en codant le swapper avec
   beaucoup d'attention (verifiant que le PTE n'est pas 0 meme si le
   reverse mapping est la). Mais c'est long (au niveau temps
   processeur), et de toute facon avoir arch/mm qui depend de kmem
   c'est crade. On avait deja du modifier kslab pour qu'il alloue des
   la creation du cache un slab, pour que les reverse mapping ca
   marche bien.

2. Coder un allocateur de reverse mapping au niveau de arch/mm. On
   allouerai completement en dehors de la zone noyau des pages
   specifiquement pour les reverse mappings. Ainsi on pourrait avoir
   de 512M a 768M la zone noyau, puis de 768M a 1G la zone reverse
   mapping (c'est grand, mais autant voir grand !). Et cet allocateur
   sera present au niveau de arch/mm et fonctionnerait avec des
   bitmaps. En fait il marcherait exactement comme (ou presque) kslab,
   sauf qu'etant code au niveau de arch/mm, il pourra utiliser des
   fonctions unsafe.

Ma solution preferee est donc la deuxieme, mais avant de coder ce truc
j'aimerais avoir votre avis sur ce probleme.

Bonne soiree,

Thomas
-- 
PETAZZONI Thomas - thomas.petazzoni@enix.org - UIN : 34937744
(Perso)      http://www.enix.org/~thomas/
(KOS)        http://kos.enix.org/ 
(Club LinUT) http://club-linut.enix.org