Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1240898pxk; Mon, 31 Aug 2020 13:50:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyE+R37RkaYxCAADaCtQ51B6dbIz4fW1iFAmowtLqz4HGTXYm/WDrgi/2rTEjPx1fOtTgd1 X-Received: by 2002:a17:906:454e:: with SMTP id s14mr2704902ejq.137.1598907019615; Mon, 31 Aug 2020 13:50:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598907019; cv=none; d=google.com; s=arc-20160816; b=vbgeLS/nR+cmSXhiYIZb5P1IUkmmXrtIa+sKmveFk8o/ByXuJDAyI4owm5BXPjjz3i j+uR/wEnPOPwhRN53sfhc2TWwIAhq1jPMVSodVKNtI8mf4zyvODjebC2TtTfx9zZn9i0 Xm4F0by8hLT9m2i24O3eQyxtRixGFRx1GpEiG3Z3UIfL+m3g+13HOpIkW+xSOzLMVPIz asDc/M1OlFExEEVGmSXwWOvxfqNXNGkSUN7qTtTUDA9fFFXnEBhY9xojd4/x0qidwE+/ q9AdaoPV5e46m1LtQyovB4UrSo6sIticeOTCRsyjoLovHbqWalc2KjXnuvreGElv7qmD xHsA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=h5N0rpFA8bbbfbBV3FV2IlHcDiBGdAzaNVP/RLNidsg=; b=mx5m1IoWm1JFouyBfZPoZuRhwtoQWfC5CnlRpvL3YsOKhfsAg3u56a9ZU84G1m4lq8 ///X/PVcGL3tMX6p28Nn/H9jyNhfAnuu8d9cxPc7vx6AGOXbevjzIUNGQvv3xd7uEWjv BBpMGgtjxSBSRnpIUad+8oYSwnBdjz3nuKcqBbXP8XD73fmH5jGRYZ/KdqZymsdXgtqA OeZ5qovPw2AITTXhiJwYdS52D/WXbkef+O2S6bZseeORHfb5QIk0syICeqmuuqQ8okvn Q5qC/KzVcAlYRGWFVqKL7c5SJBwUlpeU7Nxz/IyWIOsXhQckM5IUHiPHvqtJ4rvwuznN Dcug== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=WrmSEdAk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i8si3479930ejg.90.2020.08.31.13.49.55; Mon, 31 Aug 2020 13:50:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=WrmSEdAk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729626AbgHaSSV (ORCPT + 99 others); Mon, 31 Aug 2020 14:18:21 -0400 Received: from mail.kernel.org ([198.145.29.99]:51602 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729046AbgHaSSH (ORCPT ); Mon, 31 Aug 2020 14:18:07 -0400 Received: from paulmck-ThinkPad-P72.home (unknown [50.45.173.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A2BD92145D; Mon, 31 Aug 2020 18:18:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1598897886; bh=3byqNuTdZmyDism0B5Q1hfFDfYZvimQughxQQnMjClA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WrmSEdAkcncdWHP0qxLPLk8Fc428Y9zEKUqX7+YBsCDHbp/JrW2k2muKtVIIdtEEn 4tS9LKKTPYWM1yaF3t9xwtoMp1QiYGJwNDID/rUWkzcoBkLq4vHGLhrDU3iUbekKfz EFiBwKvcs4h2+FJK6S/K7qmeCHpQDyZv0rGq6cWY= From: paulmck@kernel.org To: linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, kernel-team@fb.com, mingo@kernel.org Cc: elver@google.com, andreyknvl@google.com, glider@google.com, dvyukov@google.com, cai@lca.pw, boqun.feng@gmail.com, "Paul E . McKenney" Subject: [PATCH kcsan 03/19] kcsan: Add atomic builtin test case Date: Mon, 31 Aug 2020 11:17:49 -0700 Message-Id: <20200831181805.1833-3-paulmck@kernel.org> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20200831181715.GA1530@paulmck-ThinkPad-P72> References: <20200831181715.GA1530@paulmck-ThinkPad-P72> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Marco Elver Adds test case to kcsan-test module, to test atomic builtin instrumentation works. Signed-off-by: Marco Elver Signed-off-by: Paul E. McKenney --- kernel/kcsan/kcsan-test.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/kernel/kcsan/kcsan-test.c b/kernel/kcsan/kcsan-test.c index fed6fcb..721180c 100644 --- a/kernel/kcsan/kcsan-test.c +++ b/kernel/kcsan/kcsan-test.c @@ -390,6 +390,15 @@ static noinline void test_kernel_seqlock_writer(void) write_sequnlock_irqrestore(&test_seqlock, flags); } +static noinline void test_kernel_atomic_builtins(void) +{ + /* + * Generate concurrent accesses, expecting no reports, ensuring KCSAN + * treats builtin atomics as actually atomic. + */ + __atomic_load_n(&test_var, __ATOMIC_RELAXED); +} + /* ===== Test cases ===== */ /* Simple test with normal data race. */ @@ -853,6 +862,59 @@ static void test_seqlock_noreport(struct kunit *test) } /* + * Test atomic builtins work and required instrumentation functions exist. We + * also test that KCSAN understands they're atomic by racing with them via + * test_kernel_atomic_builtins(), and expect no reports. + * + * The atomic builtins _SHOULD NOT_ be used in normal kernel code! + */ +static void test_atomic_builtins(struct kunit *test) +{ + bool match_never = false; + + begin_test_checks(test_kernel_atomic_builtins, test_kernel_atomic_builtins); + do { + long tmp; + + kcsan_enable_current(); + + __atomic_store_n(&test_var, 42L, __ATOMIC_RELAXED); + KUNIT_EXPECT_EQ(test, 42L, __atomic_load_n(&test_var, __ATOMIC_RELAXED)); + + KUNIT_EXPECT_EQ(test, 42L, __atomic_exchange_n(&test_var, 20, __ATOMIC_RELAXED)); + KUNIT_EXPECT_EQ(test, 20L, test_var); + + tmp = 20L; + KUNIT_EXPECT_TRUE(test, __atomic_compare_exchange_n(&test_var, &tmp, 30L, + 0, __ATOMIC_RELAXED, + __ATOMIC_RELAXED)); + KUNIT_EXPECT_EQ(test, tmp, 20L); + KUNIT_EXPECT_EQ(test, test_var, 30L); + KUNIT_EXPECT_FALSE(test, __atomic_compare_exchange_n(&test_var, &tmp, 40L, + 1, __ATOMIC_RELAXED, + __ATOMIC_RELAXED)); + KUNIT_EXPECT_EQ(test, tmp, 30L); + KUNIT_EXPECT_EQ(test, test_var, 30L); + + KUNIT_EXPECT_EQ(test, 30L, __atomic_fetch_add(&test_var, 1, __ATOMIC_RELAXED)); + KUNIT_EXPECT_EQ(test, 31L, __atomic_fetch_sub(&test_var, 1, __ATOMIC_RELAXED)); + KUNIT_EXPECT_EQ(test, 30L, __atomic_fetch_and(&test_var, 0xf, __ATOMIC_RELAXED)); + KUNIT_EXPECT_EQ(test, 14L, __atomic_fetch_xor(&test_var, 0xf, __ATOMIC_RELAXED)); + KUNIT_EXPECT_EQ(test, 1L, __atomic_fetch_or(&test_var, 0xf0, __ATOMIC_RELAXED)); + KUNIT_EXPECT_EQ(test, 241L, __atomic_fetch_nand(&test_var, 0xf, __ATOMIC_RELAXED)); + KUNIT_EXPECT_EQ(test, -2L, test_var); + + __atomic_thread_fence(__ATOMIC_SEQ_CST); + __atomic_signal_fence(__ATOMIC_SEQ_CST); + + kcsan_disable_current(); + + match_never = report_available(); + } while (!end_test_checks(match_never)); + KUNIT_EXPECT_FALSE(test, match_never); +} + +/* * Each test case is run with different numbers of threads. Until KUnit supports * passing arguments for each test case, we encode #threads in the test case * name (read by get_num_threads()). [The '-' was chosen as a stylistic @@ -891,6 +953,7 @@ static struct kunit_case kcsan_test_cases[] = { KCSAN_KUNIT_CASE(test_assert_exclusive_access_scoped), KCSAN_KUNIT_CASE(test_jiffies_noreport), KCSAN_KUNIT_CASE(test_seqlock_noreport), + KCSAN_KUNIT_CASE(test_atomic_builtins), {}, }; -- 2.9.5