[Kos-dev] Re: [Kos-cvs] [kos] Modification CVS par thomas

Christophe kos-dev@enix.org
Thu, 21 Feb 2002 17:26:25 +0100


> On pourrait faire des trucs avec un
> grain plus fin en ayant un lock pour chaque PT de l'espace noyau, mais
> la franchement ca tourne au delire (et c'est pas sur que ca solutionne
> le pb).

Tu veux vérouiller l'accès au l'entrée PTE d'un PT ou à l'accés des PTE d'un
PT ?

Il y a d'autre manière de protéger, en voici un assez barbare quand même
mais moins que le spinlock général :)

int lock_pte (unsigned long *pte) {
    unsigned long requested_value,new_value,eflags;
    eflags = save_eflags_and_cli ();
    while (1) {
        if ((requested_value = *pte) & PTE_LOCKED)
            continue;
        new_value = requested_value | PTE_LOCKED;
        if (cmpxchg (pte,requested_value,new_value))
            break;
    }
    return status;
}

void unlock_pte (unsigned long *pte,unsigned long eflags) {
    unsigned long requested_value,new_value;
    new_value = (requested_value = *pte) & ~PTE_LOCKED;
    cmpxchg (pte,requested_value,new_value);
    restore_eflags (eflags);
}