[Kos-dev] Divers
d2
kos-dev@enix.org
26 Feb 2002 14:37:17 +0100
Bonjour,
>>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@enix.org> writes:
Thomas> niveau du post. Par contre, juste du pinaillage, pourquoi
Thomas> on libere le rmap pour le PT au niveau du post ? Pourquoi
Thomas> ne pas le laisser alloue pour la prochaine fois ? (ca
Thomas> evite de faire un cache_free puis de nouveau un
Thomas> cache_alloc).
C'est ce qui est fait. C'est a ca que sert le spare_pt_rmap : a eviter
de faire le free. Bref, a eviter d'etre "naif". Mais dans certains cas
(extremement rares), il n'y a pas d'autre choix que de faire le free
quand meme :
thread 1 thread 2
- pre_add
[preemption] - pre_add
- do_add [preemption]
- post_add ...
=> pt_rmap pre-alloue inutilise
=> remplir spare_pt_rmap
[preemption] - post_add
=> pt_rmap pre-alloue inutilise
=> spare_pt_rmap DEJA utilise
=> kslab_free a la main
Evidemment, vu que le post_add est le meme que post_del, on a le meme
"comportement" quand des add/del ou des del/del, plutot que add/add,
sont tres entrelaces comme dans le cas ci-dessus.
Mais, dans 99.99999% des cas, on sera dans un cas normal (ie pas comme
ci-dessus), ie on aura le spare_pt_rmap qui sera la et qui evitera de
faire le free du pt_rmap inutilisé ! Il suffit pour cela que les
vmap/vunmap ne soient pas entrelaces (ce qui sera le cas general). Car
dans ce cas, un pt_rmap qui est inutilise par un vmap/vunmap peut etre
reutilise par le vmap/vunmap qui suit -> pas de kslab_free/kslab_alloc
pour le nouveau pt_rmap : il suffit de reutiliser le spare_pt_rmap.
Thomas> Par contre j'ai pas bien compris ou tu en etais au niveau
Thomas> du FOREIGN PT (pour mapper une page dans l'espace de
Thomas> n'importe quelle team). Peux-tu me le rappeler rapidement
Thomas> ?
J'ai pas teste. C'est implante, c'est tout : ca mappe les PT d'une
autre team en local, PDE=511 (ou 510, je sais plus). Evidemment, avant
ca verifie que ce mapping n'est pas deja en place, et avant chaque
acces aux PT (dans les vmap/vunmap/get_vpage_status), ca fait le
invlpg qui va bien : les routines vmap/vunmap sont a jour, de meme que
get_vpage_status.
Encore une fois, ce n'est pas teste. La partie chaude est celle-ci (cf
_setup_mm_ctxt()) :
my_pd[FOREIGN_PT_AREA_INDEX] = PD_ANY_TEAM(dest_mm_ctxt->pd_index_in_pd_table);
et le test de "deja mappe" juste avant :
if ((!IS_UNMAPPED(CURRENT_PDE(FOREIGN_PT_AREA_INDEX)))
&& (CURRENT_PDE_PADDR(FOREIGN_PT_AREA_INDEX) == dest_mm_ctxt->pd))
Pour le reste, les autres routines devraient etre a jour.
Samedi, j'ai l'intention de repasser sur les pbs de lock des
get/put_phys_page (utiliser un semaphore valué sur la list des
gpfme_free). Mais avant ca, j'ai envie de m'amuser a deplacer les
pages physiques, et verifier que tout continue de marcher bien quand
on deplace la page de code courante, ou la page de pile courante. Sans
lock pour pouvoir tester plus vite d'abord. Moi aime bien faire
joujou. Ceci dit, je ne garantis rien ni pour l'un ni pour l'autre de
ces amusements, donc si ca te chante de t'y coller avant, vas-y !
Bonne journee,
--
d2