From 4ca31ac964da8520e1804b7cfb1f4d4479a80497 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Mon, 6 Jan 2014 21:02:11 +0100 Subject: [PATCH] kernel: Fix ABA problem in try_acquire_read_spinlock() --- headers/private/kernel/smp.h | 5 +---- src/system/kernel/smp.cpp | 6 +----- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/headers/private/kernel/smp.h b/headers/private/kernel/smp.h index 685e3d5a03..43126eb697 100644 --- a/headers/private/kernel/smp.h +++ b/headers/private/kernel/smp.h @@ -210,10 +210,7 @@ static inline bool try_acquire_read_spinlock_inline(rw_spinlock* lock) { uint32 previous = atomic_add(&lock->lock, 1); - if ((previous & (1u << 31)) == 0) - return true; - atomic_test_and_set(&lock->lock, 1u << 31, previous); - return false; + return (previous & (1u << 31)) == 0; } diff --git a/src/system/kernel/smp.cpp b/src/system/kernel/smp.cpp index a82c7a273e..325fa7206d 100644 --- a/src/system/kernel/smp.cpp +++ b/src/system/kernel/smp.cpp @@ -617,11 +617,7 @@ try_acquire_read_spinlock(rw_spinlock* lock) #endif uint32 previous = atomic_add(&lock->lock, 1); - if ((previous & (1u << 31)) == 0) - return true; - - atomic_test_and_set(&lock->lock, 1u << 31, previous); - return false; + return (previous & (1u << 31)) == 0; }