From 34c2efc1d063f4b366c1017c174d117cc96eb990 Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Thu, 8 Sep 2016 14:45:20 -0400 Subject: [PATCH] use asm() for lock release, not a C assignment --- spinlock.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spinlock.c b/spinlock.c index bf863ef104..7b372ef3f1 100644 --- a/spinlock.c +++ b/spinlock.c @@ -59,8 +59,10 @@ release(struct spinlock *lk) // stores; __sync_synchronize() tells them both to not re-order. __sync_synchronize(); - // Release the lock. - lk->locked = 0; + // Release the lock, equivalent to lk->locked = 0. + // This code can't use a C assignment, since it might + // not be atomic. + asm volatile("movl $0, %0" : "+m" (lk->locked) : ); popcli(); }