bitops: add xor_unlock_is_negative_byte()
Replace clear_bit_and_unlock_is_negative_byte() with xor_unlock_is_negative_byte(). We have a few places that like to lock a folio, set a flag and unlock it again. Allow for the possibility of combining the latter two operations for efficiency. We are guaranteed that the caller holds the lock, so it is safe to unlock it with the xor. The caller must guarantee that nobody else will set the flag without holding the lock; it is not safe to do this with the PG_dirty flag, for example. Link: https://lkml.kernel.org/r/20231004165317.1061855-8-willy@infradead.org Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Albert Ou <aou@eecs.berkeley.edu> Cc: Alexander Gordeev <agordeev@linux.ibm.com> Cc: Andreas Dilger <adilger.kernel@dilger.ca> Cc: Christian Borntraeger <borntraeger@linux.ibm.com> Cc: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Heiko Carstens <hca@linux.ibm.com> Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Cc: Matt Turner <mattst88@gmail.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Nicholas Piggin <npiggin@gmail.com> Cc: Palmer Dabbelt <palmer@dabbelt.com> Cc: Paul Walmsley <paul.walmsley@sifive.com> Cc: Richard Henderson <richard.henderson@linaro.org> Cc: Sven Schnelle <svens@linux.ibm.com> Cc: "Theodore Ts'o" <tytso@mit.edu> Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Cc: Vasily Gorbik <gor@linux.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
7a4847e54c
commit
247dbcdbf7
@@ -700,10 +700,10 @@ static void test_barrier_nothreads(struct kunit *test)
|
||||
KCSAN_EXPECT_RW_BARRIER(mutex_lock(&test_mutex), false);
|
||||
KCSAN_EXPECT_RW_BARRIER(mutex_unlock(&test_mutex), true);
|
||||
|
||||
#ifdef clear_bit_unlock_is_negative_byte
|
||||
KCSAN_EXPECT_READ_BARRIER(clear_bit_unlock_is_negative_byte(0, &test_var), true);
|
||||
KCSAN_EXPECT_WRITE_BARRIER(clear_bit_unlock_is_negative_byte(0, &test_var), true);
|
||||
KCSAN_EXPECT_RW_BARRIER(clear_bit_unlock_is_negative_byte(0, &test_var), true);
|
||||
#ifdef xor_unlock_is_negative_byte
|
||||
KCSAN_EXPECT_READ_BARRIER(xor_unlock_is_negative_byte(1, &test_var), true);
|
||||
KCSAN_EXPECT_WRITE_BARRIER(xor_unlock_is_negative_byte(1, &test_var), true);
|
||||
KCSAN_EXPECT_RW_BARRIER(xor_unlock_is_negative_byte(1, &test_var), true);
|
||||
#endif
|
||||
kcsan_nestable_atomic_end();
|
||||
}
|
||||
|
||||
@@ -228,10 +228,10 @@ static bool __init test_barrier(void)
|
||||
spin_lock(&test_spinlock);
|
||||
KCSAN_CHECK_RW_BARRIER(spin_unlock(&test_spinlock));
|
||||
|
||||
#ifdef clear_bit_unlock_is_negative_byte
|
||||
KCSAN_CHECK_RW_BARRIER(clear_bit_unlock_is_negative_byte(0, &test_var));
|
||||
KCSAN_CHECK_READ_BARRIER(clear_bit_unlock_is_negative_byte(0, &test_var));
|
||||
KCSAN_CHECK_WRITE_BARRIER(clear_bit_unlock_is_negative_byte(0, &test_var));
|
||||
#ifdef xor_unlock_is_negative_byte
|
||||
KCSAN_CHECK_RW_BARRIER(xor_unlock_is_negative_byte(1, &test_var));
|
||||
KCSAN_CHECK_READ_BARRIER(xor_unlock_is_negative_byte(1, &test_var));
|
||||
KCSAN_CHECK_WRITE_BARRIER(xor_unlock_is_negative_byte(1, &test_var));
|
||||
#endif
|
||||
kcsan_nestable_atomic_end();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user