It shouldn't be necessary to use a barrier on the way into spin_lock. We'll be focused on a single address until we get it (exclusively) set, and then we'll do a barrier on the way out. Also, it does make sense to do a barrier on the way in to spin_unlock, i.e. ensure what we did in the critical section is ordered wrt to what we do outside it, before we announce that we're outside. Signed-off-by: Andrew Jones <drjones@xxxxxxxxxx> --- lib/arm/spinlock.c | 8 ++++---- lib/arm64/spinlock.c | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/arm/spinlock.c b/lib/arm/spinlock.c index 3b023ceaebf71..116ea5d7db930 100644 --- a/lib/arm/spinlock.c +++ b/lib/arm/spinlock.c @@ -7,10 +7,9 @@ void spin_lock(struct spinlock *lock) { u32 val, fail; - dmb(); - if (!mmu_enabled()) { lock->v = 1; + smp_mb(); return; } @@ -25,11 +24,12 @@ void spin_lock(struct spinlock *lock) : "r" (&lock->v) : "cc" ); } while (fail); - dmb(); + + smp_mb(); } void spin_unlock(struct spinlock *lock) { + smp_mb(); lock->v = 0; - dmb(); } diff --git a/lib/arm64/spinlock.c b/lib/arm64/spinlock.c index 68b68b75ba60d..a3907f03cacda 100644 --- a/lib/arm64/spinlock.c +++ b/lib/arm64/spinlock.c @@ -13,10 +13,9 @@ void spin_lock(struct spinlock *lock) { u32 val, fail; - smp_mb(); - if (!mmu_enabled()) { lock->v = 1; + smp_mb(); return; } @@ -35,9 +34,9 @@ void spin_lock(struct spinlock *lock) void spin_unlock(struct spinlock *lock) { + smp_mb(); if (mmu_enabled()) asm volatile("stlrh wzr, [%0]" :: "r" (&lock->v)); else lock->v = 0; - smp_mb(); } -- 2.4.3 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html