[Kos-dev] synchro en SMP
d2
kos-dev@enix.org
04 Jun 2003 09:08:30 +0200
Hello,
J'ai reflechi un peu, et voila une proposition de principe :
* lock sem->lock
* on bloque oui/non
+ si non => relachement sem->lock + sortir (return)
* mise du current_thr ds sem->wq
* lock cpu_wq->locq
* recup next_thread + maj cur_thr=next_thr
* unlock cpu_wq->lock
* ATOMIC(switch_to(next_thr) ET unlock sem->lock)
Toute la subtilite etant dans la derniere ligne. Pour faire ca, ca
serait pas du atomic au sens "lock du bus". Il suffirait en fait de
rajouter un parametre a cpl0_switch : le lock a liberer, et on le
libererait (ie equivalent a spin_unlock_remote(SANS FLAG qui ne sert a
rien en remote de tte facon)) juste apres le chgt de pile (pr garantir
que si le thread bloque est elu sur un autre proc, eh bien 2 instances
simultanees ne seront pas en cours d'exec sur 2 procs differents),
mais bien avant le iret. Ce qui donnerait (pseudo code) :
cpl0_switch_with_return_internal:
// Sauvegarde contexte from_contexte
...
movl %esp, (%ebx)
// Chgt de pile to_context
movl 64(%eax), %esp
SPIN_UNLOCK_REMOTE(lock_en_parametre)
// Restauration reste du to_context
popw %gs
popw %fs
...
addl $4, %esp
iret
get_there:
ret
Evidemment, ca suppose que pour que ca marche, les IRQ soient toujours
desactivees a l'appel de cpl0_switch.
Voila. Bonne journee,
--
d2