Spinlocks and rwlocks behave differently in the try variants regarding
preemption: rwlocks are switching preemption off before testing the
lock, while spinlocks do so only after the first check.
Modify _spin_trylock() to disable preemption before testing the lock
to be held in order to be preemption-ready.
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
{
spinlock_tickets_t old, new;
+ preempt_disable();
check_lock(&lock->debug, true);
old = observe_lock(&lock->tickets);
if ( old.head != old.tail )
+ {
+ preempt_enable();
return 0;
+ }
new = old;
new.tail++;
- preempt_disable();
if ( cmpxchg(&lock->tickets.head_tail,
old.head_tail, new.head_tail) != old.head_tail )
{