[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] xen/locking: harmonize spinlocks and rwlocks regarding preemption
commit c3453a23f7905d24f2404787543e26ec7d02301c Author: Juergen Gross <jgross@xxxxxxxx> AuthorDate: Fri Nov 6 10:47:09 2020 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Nov 6 10:47:09 2020 +0100 xen/locking: harmonize spinlocks and rwlocks regarding preemption 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@xxxxxxxx> Reviewed-by: Julien Grall <jgrall@xxxxxxxxxx> --- xen/common/spinlock.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c index b4aaf6bce6..f4eb50f030 100644 --- a/xen/common/spinlock.c +++ b/xen/common/spinlock.c @@ -240,13 +240,16 @@ int _spin_trylock(spinlock_t *lock) { 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 ) { -- generated by git-patchbot for /home/xen/git/xen.git#master
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |