From patchwork Fri Mar 3 14:14:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Potapenko X-Patchwork-Id: 13158847 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5311FC64EC4 for ; Fri, 3 Mar 2023 14:14:48 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B34976B0075; Fri, 3 Mar 2023 09:14:47 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id AE44D6B0078; Fri, 3 Mar 2023 09:14:47 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9AC3F6B007B; Fri, 3 Mar 2023 09:14:47 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 8B2D16B0075 for ; Fri, 3 Mar 2023 09:14:47 -0500 (EST) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 5AC191A120A for ; Fri, 3 Mar 2023 14:14:47 +0000 (UTC) X-FDA: 80527783014.01.FF2E6AA Received: from mail-ed1-f74.google.com (mail-ed1-f74.google.com [209.85.208.74]) by imf07.hostedemail.com (Postfix) with ESMTP id 5C6AB4001A for ; Fri, 3 Mar 2023 14:14:45 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=ZfSfmqBM; spf=pass (imf07.hostedemail.com: domain of 30wACZAYKCAQkpmhivksskpi.gsqpmry1-qqozego.svk@flex--glider.bounces.google.com designates 209.85.208.74 as permitted sender) smtp.mailfrom=30wACZAYKCAQkpmhivksskpi.gsqpmry1-qqozego.svk@flex--glider.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1677852885; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=NzrUAKqOf4lIqj2sXdyqoZ2Q8eXyDe5JYgJyXOtPsCY=; b=WQhv3TU2y877Xv20FD2r4dFfMpWKZLzCt3uLIOpvO32EvhihDmJOmnTjlKg9bF1CVHQ8Ri 5XfgwupE5VCCewcwUSZWrLUx0O7MHx+p5LlLkjcOasbH2snhGB++AvMyAZv1L0NhLZZSXE 53cFKbaIFsrnvk8oOKzSULsZ1zBReAU= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=ZfSfmqBM; spf=pass (imf07.hostedemail.com: domain of 30wACZAYKCAQkpmhivksskpi.gsqpmry1-qqozego.svk@flex--glider.bounces.google.com designates 209.85.208.74 as permitted sender) smtp.mailfrom=30wACZAYKCAQkpmhivksskpi.gsqpmry1-qqozego.svk@flex--glider.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1677852885; a=rsa-sha256; cv=none; b=oFhiYqHmeXGyY5VUuVo8pRedITFLtRAC6rVnZPA+ycx4YkZzKayMcTj13h36WZFEkzsTVL 53bjw1WAAqXFxCr2cpTDA2mW/HFIwd8tIF9Q6yrO8cHLoQZHKISJDfJWnJ4/SC5hfhwDtR n/llDnuIkVQ+Y9aAuNtd3cfiXtiAfkQ= Received: by mail-ed1-f74.google.com with SMTP id fi8-20020a056402550800b004a26cc7f6cbso4199316edb.4 for ; Fri, 03 Mar 2023 06:14:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1677852884; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=NzrUAKqOf4lIqj2sXdyqoZ2Q8eXyDe5JYgJyXOtPsCY=; b=ZfSfmqBMuJ+vwMDxG5i4+5C+tNEglr4loWmKR6Z0RkZfjr+jAbJCKs+E8HdnY+/484 U4Tnah/k4Gjd5sm2yqp/0nKmTL54cbtEXdkKAgXSe42PIyTbE0SRGadQQmam3JIAUfvC a5ouWadlWnMykwg3du4wr7YFd0UA4Nmn97zesSEosU4X3DChC2nSvSKQyOpTfHECBKv7 gZXhfuN9a1gIdRxhqPU3dNXM0LfelTB/RT1xvfB+vRM3dNsvbeS0WfFdt8jqYekhXOzi 337mBrnvoEXkOMuKAADUY1doomtGT8K8uQlYbbOdXMj9ai3/IQ/6zMJlcrmOBZHFmz/Z uWtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677852884; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=NzrUAKqOf4lIqj2sXdyqoZ2Q8eXyDe5JYgJyXOtPsCY=; b=vMDJga7kvrlZgIz3VXVXy/3xw5TIe0tuA9DAZeegYgd+2QgxwRJM94lq48oji4qTkH w8Fi7/0/xN0ZU8CTwjzApJ76m8XC0jLnIMvUGKbU3yIeT0FlqPfCJwNTI3T60dXd/RVr 53+1BFXL6SBcwP0FcMew9B4kuk4EP44EK8MlhO71EMUVHuiwTrid8OV7/yo42EV8GAhA vegoegcVZvFwcaDr262SFwK1xITeSD6PYowzpmRlZqb6wOKvSUwHhmHfy6nSzqJl2axr Ot/solYZXDj6avTTyBUSBLIRiOjqk/j/qBWGj3KbifxDknQqLoNQHg2EKxMXrGKRnsCw zyFQ== X-Gm-Message-State: AO0yUKVHiK38vqEL7nnj1mlp9C9cURx2jfx54JsJyqyjbHHqrZ8WHkCy UAk8HzPERiCGsYXlPURT9nvwjjqZLkI= X-Google-Smtp-Source: AK7set/ri2KO3ck28J8157MsDMD6j/YADvayhd/o5Bx0+wq3TM1Izsb9bN9BvUkIU9PbDIbEffR6U3aO/6Q= X-Received: from glider.muc.corp.google.com ([2a00:79e0:9c:201:f11e:2fac:5069:a04d]) (user=glider job=sendgmr) by 2002:a17:906:d041:b0:8bf:e82a:2988 with SMTP id bo1-20020a170906d04100b008bfe82a2988mr938462ejb.4.1677852883928; Fri, 03 Mar 2023 06:14:43 -0800 (PST) Date: Fri, 3 Mar 2023 15:14:31 +0100 In-Reply-To: <20230303141433.3422671-1-glider@google.com> Mime-Version: 1.0 References: <20230303141433.3422671-1-glider@google.com> X-Mailer: git-send-email 2.40.0.rc0.216.gc4246ad0f0-goog Message-ID: <20230303141433.3422671-2-glider@google.com> Subject: [PATCH 2/4] kmsan: another take at fixing memcpy tests From: Alexander Potapenko To: glider@google.com Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, x86@kernel.org, dave.hansen@linux.intel.com, hpa@zytor.com, akpm@linux-foundation.org, elver@google.com, dvyukov@google.com, nathan@kernel.org, ndesaulniers@google.com, kasan-dev@googlegroups.com X-Stat-Signature: xci15ok58r8ktr8fsiw799a6j7c37dqh X-Rspam-User: X-Rspamd-Queue-Id: 5C6AB4001A X-Rspamd-Server: rspam06 X-HE-Tag: 1677852885-191735 X-HE-Meta: U2FsdGVkX1/qFUkO79uywh+teWlfz6Yb29I6xkDmvy4FyukhbTYgGp1Ooa+/i50WMBaKUsTa+sbFi3zKH3JrJPSCYWubO20HC5eOHRNScB1dkf2CQCkUhiSHxjahEk4VlViRxBpM+VHfUYi+kI6TfNQaHpTBbmehXzZC2bfS8Y4pKqKcaEDSFUiyHpuyhWteWMoQwzXcYQ4iljWLYzqE7SVOfiVQ3a7VTH3Lwi0kZhhNvB3qcbVo8Vo69/Df0j8TgcJ92gngYXFZHKKEecuAjrgyeHPF68DLBmFKGL4bJVkc7RSNRVY1UxA6sK9YvFqewF8NSNih8ud6lMYTqH5aB1gBHsg1TylDjoggiCgbtrn9kurjz1jAiMDX2qkZvEDE0HaVUTzkjDsrvbn9JCnMMkol3z9eimsjvzJwINJXmrLDSV9J2MNJ0ER2wFR3cQHqm57IK22zbqXjPgjwjtLGIAk4QIa6jVI/TytFwDaFz5IEioOw3sjcR78iTlakq9YhTw/kDFoAfp5k4z9UM4EVFsepNoMxi8BgOlHdJ6Ny4sBhBT7ChCjAKSVdKqq4V1ZcBPsBLubZVR6DAZAp2Jm/p/9qrFScBEiyrD9vMxzjE7/RxcHQUFLnRhGEVutfRfoL24kUtshg7z3GTRemS2wX1lspnpzcgDJkT4Sauo0Y8oh0s/5TxVemoe8Ce9OtrlRpFOEogLqs1loC7jG/lohaHiGnuiWOQ+Ef6dvQzNYoPIEWK1MjLXufpN9Bu8m5GSSMxm5WvNE0dS+VEYpjIWejV0T494g7n+89IYu1fdlh97Il8UJ64jk2PLudd/vWsGv3WRmuIPeY16YzBY1c6PW1TVVE4SYdrIsYN4yhqbn3wtkK3LMXpFRMQDETZyVHfCoHGXPNcrBo3Tt1RjACi02THQU7Tdg4DtFX2iULBQXuDcbyo9cenK/meQNeakcKfeWA+BdrCuCXsngZw9LquFr aaVsmB7T sGCyLs/NzOiUsEzHvt92csxgl8bRcmfLnWtKTrx601HTwlt/CU4IFPoktGYk+NcL2XeNLoUFmJNtRs3IXtsRbwGmgFiKtPm+3q3vpUsMXFeBVYwXrHB1oHWHoAlGNdirqXVL06FssNCo0HfJu8lt6y1WM5Ii1DWOvNSf1m+9Gmz4lFd1c0OJGLRSNt9UEOA8paZBUPo95vg/A4/E2jOwJhKfBkmMOownLuVh3GOvpNsaPIaaMKPcEzyFfz68H+vHda4jws7ooJPew2fbompwpjAqx3jQWXPeW7ClrUKh9GQVV9qMMV5QY8k/NR1pPlwOt6jUAeMRrwkftYbSi5d7AhnGVmSE/UM+p4mfIApw6Xtv1AMtpAXuZKA+4SeF34Cc1zeaDqtSswchoHef07Ngu+FNqSXS25V/ggmbu3TbBjXZMxQzlwDvN9DUbWt2wunb33/0w5Vrz7Hv7M53dQQeAwGfnLNtfPA6AtBTF2slio/nF4tdnaJi+FHGI3FxjbTAvJRS0am64Idj3KBJmUePUvUMkssXlqohjlzK+PLebsBU8zrRoAtUeBrCx1/dzWFuIn9zBQq4FXPn41tMBWRtPhrok2/v4iV8cKlfEw9DnCsQsfy4eEtiyIeH0bg== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: commit 5478afc55a21 ("kmsan: fix memcpy tests") uses OPTIMIZER_HIDE_VAR() to hide the uninitialized var from the compiler optimizations. However OPTIMIZER_HIDE_VAR(uninit) enforces an immediate check of @uninit, so memcpy tests did not actually check the behavior of memcpy(), because they always contained a KMSAN report. Replace OPTIMIZER_HIDE_VAR() with a file-local macro that just clobbers the memory with a barrier(), and add a test case for memcpy() that does not expect an error report. Also reflow kmsan_test.c with clang-format. Signed-off-by: Alexander Potapenko Reviewed-by: Marco Elver --- v2: - replace inline assembly with a barrier(), update comments --- mm/kmsan/kmsan_test.c | 44 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/mm/kmsan/kmsan_test.c b/mm/kmsan/kmsan_test.c index 088e21a48dc4b..aeddfdd4f679f 100644 --- a/mm/kmsan/kmsan_test.c +++ b/mm/kmsan/kmsan_test.c @@ -407,6 +407,37 @@ static void test_printk(struct kunit *test) KUNIT_EXPECT_TRUE(test, report_matches(&expect)); } +/* + * Prevent the compiler from optimizing @var away. Without this, Clang may + * notice that @var is uninitialized and drop memcpy() calls that use it. + * + * There is OPTIMIZER_HIDE_VAR() in linux/compier.h that we cannot use here, + * because it is implemented as inline assembly receiving @var as a parameter + * and will enforce a KMSAN check. Same is true for e.g. barrier_data(var). + */ +#define DO_NOT_OPTIMIZE(var) barrier() + +/* + * Test case: ensure that memcpy() correctly copies initialized values. + * Also serves as a regression test to ensure DO_NOT_OPTIMIZE() does not cause + * extra checks. + */ +static void test_init_memcpy(struct kunit *test) +{ + EXPECTATION_NO_REPORT(expect); + volatile int src; + volatile int dst = 0; + + DO_NOT_OPTIMIZE(src); + src = 1; + kunit_info( + test, + "memcpy()ing aligned initialized src to aligned dst (no reports)\n"); + memcpy((void *)&dst, (void *)&src, sizeof(src)); + kmsan_check_memory((void *)&dst, sizeof(dst)); + KUNIT_EXPECT_TRUE(test, report_matches(&expect)); +} + /* * Test case: ensure that memcpy() correctly copies uninitialized values between * aligned `src` and `dst`. @@ -420,7 +451,7 @@ static void test_memcpy_aligned_to_aligned(struct kunit *test) kunit_info( test, "memcpy()ing aligned uninit src to aligned dst (UMR report)\n"); - OPTIMIZER_HIDE_VAR(uninit_src); + DO_NOT_OPTIMIZE(uninit_src); memcpy((void *)&dst, (void *)&uninit_src, sizeof(uninit_src)); kmsan_check_memory((void *)&dst, sizeof(dst)); KUNIT_EXPECT_TRUE(test, report_matches(&expect)); @@ -443,7 +474,7 @@ static void test_memcpy_aligned_to_unaligned(struct kunit *test) kunit_info( test, "memcpy()ing aligned uninit src to unaligned dst (UMR report)\n"); - OPTIMIZER_HIDE_VAR(uninit_src); + DO_NOT_OPTIMIZE(uninit_src); memcpy((void *)&dst[1], (void *)&uninit_src, sizeof(uninit_src)); kmsan_check_memory((void *)dst, 4); KUNIT_EXPECT_TRUE(test, report_matches(&expect)); @@ -467,13 +498,14 @@ static void test_memcpy_aligned_to_unaligned2(struct kunit *test) kunit_info( test, "memcpy()ing aligned uninit src to unaligned dst - part 2 (UMR report)\n"); - OPTIMIZER_HIDE_VAR(uninit_src); + DO_NOT_OPTIMIZE(uninit_src); memcpy((void *)&dst[1], (void *)&uninit_src, sizeof(uninit_src)); kmsan_check_memory((void *)&dst[4], sizeof(uninit_src)); KUNIT_EXPECT_TRUE(test, report_matches(&expect)); } -static noinline void fibonacci(int *array, int size, int start) { +static noinline void fibonacci(int *array, int size, int start) +{ if (start < 2 || (start == size)) return; array[start] = array[start - 1] + array[start - 2]; @@ -482,8 +514,7 @@ static noinline void fibonacci(int *array, int size, int start) { static void test_long_origin_chain(struct kunit *test) { - EXPECTATION_UNINIT_VALUE_FN(expect, - "test_long_origin_chain"); + EXPECTATION_UNINIT_VALUE_FN(expect, "test_long_origin_chain"); /* (KMSAN_MAX_ORIGIN_DEPTH * 2) recursive calls to fibonacci(). */ volatile int accum[KMSAN_MAX_ORIGIN_DEPTH * 2 + 2]; int last = ARRAY_SIZE(accum) - 1; @@ -515,6 +546,7 @@ static struct kunit_case kmsan_test_cases[] = { KUNIT_CASE(test_uaf), KUNIT_CASE(test_percpu_propagate), KUNIT_CASE(test_printk), + KUNIT_CASE(test_init_memcpy), KUNIT_CASE(test_memcpy_aligned_to_aligned), KUNIT_CASE(test_memcpy_aligned_to_unaligned), KUNIT_CASE(test_memcpy_aligned_to_unaligned2),