[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