[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);
}