[Kos-dev] "Race condition" 1

d2 kos-dev@enix.org
26 May 2003 13:25:06 +0200


>>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@enix.org> writes:
    Thomas> Euh, tu parles de quelle fonction là, parce que
    Thomas> cpl0_switch_no_return appelle déjà son équivalent
    Thomas> internal, de même pour cpl0_switch_with_return.

Je fatigue aussi, je ne me souvenais plus, et j'ai pas regarde avant
d'ouvrir ma grande gueule...

    >> C'est quoi le bit 1 du eflags ?

    Thomas> La doc dit "reserved, 1" ;-)

Dans ce cas...

    Thomas> Mais globalement, je trouve ça pas très beau de devoir
    Thomas> passer un pointeur sur le spinlock + les flags.

Oui, faudrait reflechir. Et tant qu'on y est : un assert a rajouter
dans wq_add_unsafe : ASSERT(! test_interrupts_enabled()); important
pour etre sur de detecter si on fait des bloquages dans les ISR (y'a
des chances qu'on s'en apercoivent tres vite, mais autant que ce soit
explicite).

    Thomas>   /*** Moi je verrais bien le spin_unlock(*lock,
    Thomas> lock_flags) ici. A priori, vu qu'on a déjà relaché le lock
    Thomas> global_kwaitqueue_lock, et qu'on garde juste les
    Thomas> interruptions, on a pas de risque de deadlock. (Pas
    Thomas> sur). */

    Thomas>   /* Actual context switch */
    Thomas> cpl0_switch_with_return(&(old_thread->cpu_context.cpl0),
    next_thread-> cpu_context.cpl0);
    Thomas>   /* Back */

Il faut surement recuperer le lock qu'on a laisse tomber. Comment ? la
est la question : y'a surement des trucs atomiques a garantir : tel
quel (ie avec le lock de l'autre spinlock) en Unipro ca risque de
marcher (le unlock est remote, donc irq tjs disabled), mais en
SMP... Faudrait regarder les autres OS, ca doit etre tout simple a
faire.

-- 
d2