kcsan: Only test clear_bit_unlock_is_negative_byte if arch defines it
authorMarco Elver <elver@google.com>
Mon, 6 Dec 2021 06:41:51 +0000 (07:41 +0100)
committerPaul E. McKenney <paulmck@kernel.org>
Fri, 10 Dec 2021 00:42:29 +0000 (16:42 -0800)
Some architectures do not define clear_bit_unlock_is_negative_byte().
Only test it when it is actually defined (similar to other usage, such
as in lib/test_kasan.c).

Link: https://lkml.kernel.org/r/202112050757.x67rHnFU-lkp@intel.com
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Marco Elver <elver@google.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/kcsan/kcsan_test.c
kernel/kcsan/selftest.c

index 2bad082..a36fca0 100644 (file)
@@ -598,7 +598,6 @@ static void test_barrier_nothreads(struct kunit *test)
        KCSAN_EXPECT_READ_BARRIER(test_and_change_bit(0, &test_var), true);
        KCSAN_EXPECT_READ_BARRIER(clear_bit_unlock(0, &test_var), true);
        KCSAN_EXPECT_READ_BARRIER(__clear_bit_unlock(0, &test_var), true);
-       KCSAN_EXPECT_READ_BARRIER(clear_bit_unlock_is_negative_byte(0, &test_var), true);
        KCSAN_EXPECT_READ_BARRIER(arch_spin_lock(&arch_spinlock), false);
        KCSAN_EXPECT_READ_BARRIER(arch_spin_unlock(&arch_spinlock), true);
        KCSAN_EXPECT_READ_BARRIER(spin_lock(&test_spinlock), false);
@@ -644,7 +643,6 @@ static void test_barrier_nothreads(struct kunit *test)
        KCSAN_EXPECT_WRITE_BARRIER(test_and_change_bit(0, &test_var), true);
        KCSAN_EXPECT_WRITE_BARRIER(clear_bit_unlock(0, &test_var), true);
        KCSAN_EXPECT_WRITE_BARRIER(__clear_bit_unlock(0, &test_var), true);
-       KCSAN_EXPECT_WRITE_BARRIER(clear_bit_unlock_is_negative_byte(0, &test_var), true);
        KCSAN_EXPECT_WRITE_BARRIER(arch_spin_lock(&arch_spinlock), false);
        KCSAN_EXPECT_WRITE_BARRIER(arch_spin_unlock(&arch_spinlock), true);
        KCSAN_EXPECT_WRITE_BARRIER(spin_lock(&test_spinlock), false);
@@ -690,7 +688,6 @@ static void test_barrier_nothreads(struct kunit *test)
        KCSAN_EXPECT_RW_BARRIER(test_and_change_bit(0, &test_var), true);
        KCSAN_EXPECT_RW_BARRIER(clear_bit_unlock(0, &test_var), true);
        KCSAN_EXPECT_RW_BARRIER(__clear_bit_unlock(0, &test_var), true);
-       KCSAN_EXPECT_RW_BARRIER(clear_bit_unlock_is_negative_byte(0, &test_var), true);
        KCSAN_EXPECT_RW_BARRIER(arch_spin_lock(&arch_spinlock), false);
        KCSAN_EXPECT_RW_BARRIER(arch_spin_unlock(&arch_spinlock), true);
        KCSAN_EXPECT_RW_BARRIER(spin_lock(&test_spinlock), false);
@@ -698,6 +695,11 @@ 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);
+#endif
        kcsan_nestable_atomic_end();
 }
 
index b6d4da0..7571295 100644 (file)
@@ -169,7 +169,6 @@ static bool __init test_barrier(void)
        KCSAN_CHECK_READ_BARRIER(test_and_change_bit(0, &test_var));
        KCSAN_CHECK_READ_BARRIER(clear_bit_unlock(0, &test_var));
        KCSAN_CHECK_READ_BARRIER(__clear_bit_unlock(0, &test_var));
-       KCSAN_CHECK_READ_BARRIER(clear_bit_unlock_is_negative_byte(0, &test_var));
        arch_spin_lock(&arch_spinlock);
        KCSAN_CHECK_READ_BARRIER(arch_spin_unlock(&arch_spinlock));
        spin_lock(&test_spinlock);
@@ -199,7 +198,6 @@ static bool __init test_barrier(void)
        KCSAN_CHECK_WRITE_BARRIER(test_and_change_bit(0, &test_var));
        KCSAN_CHECK_WRITE_BARRIER(clear_bit_unlock(0, &test_var));
        KCSAN_CHECK_WRITE_BARRIER(__clear_bit_unlock(0, &test_var));
-       KCSAN_CHECK_WRITE_BARRIER(clear_bit_unlock_is_negative_byte(0, &test_var));
        arch_spin_lock(&arch_spinlock);
        KCSAN_CHECK_WRITE_BARRIER(arch_spin_unlock(&arch_spinlock));
        spin_lock(&test_spinlock);
@@ -232,12 +230,16 @@ static bool __init test_barrier(void)
        KCSAN_CHECK_RW_BARRIER(test_and_change_bit(0, &test_var));
        KCSAN_CHECK_RW_BARRIER(clear_bit_unlock(0, &test_var));
        KCSAN_CHECK_RW_BARRIER(__clear_bit_unlock(0, &test_var));
-       KCSAN_CHECK_RW_BARRIER(clear_bit_unlock_is_negative_byte(0, &test_var));
        arch_spin_lock(&arch_spinlock);
        KCSAN_CHECK_RW_BARRIER(arch_spin_unlock(&arch_spinlock));
        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));
+#endif
        kcsan_nestable_atomic_end();
 
        return ret;