From mboxrd@z Thu Jan 1 00:00:00 1970 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 A4440C678D4 for ; Fri, 3 Mar 2023 15:00:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3E3066B0074; Fri, 3 Mar 2023 10:00:37 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 36C196B0075; Fri, 3 Mar 2023 10:00:37 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1E62F6B0078; Fri, 3 Mar 2023 10:00:37 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 065F16B0074 for ; Fri, 3 Mar 2023 10:00:37 -0500 (EST) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id C15DD1C6C05 for ; Fri, 3 Mar 2023 15:00:36 +0000 (UTC) X-FDA: 80527898472.17.5260D0A Received: from mail-ua1-f45.google.com (mail-ua1-f45.google.com [209.85.222.45]) by imf26.hostedemail.com (Postfix) with ESMTP id C3EE114001B for ; Fri, 3 Mar 2023 15:00:34 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=jf6Q6kvx; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf26.hostedemail.com: domain of elver@google.com designates 209.85.222.45 as permitted sender) smtp.mailfrom=elver@google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1677855634; 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=ARdODDyEMP84oqzwuXABwvOYvSOQTabE/Zfw0C3mMnU=; b=0xWWZijNdoKYuesUC1bQPL0Al8W5AUFPoavNxlRqKGbfCAX7n2lDvJ3zhduWfeVNwY2ZyQ waTCFhB9bfzRjbZHlPHK9Nlyh/oH23IGSt7cP+dhAkHpx+b27FkV4RPHN+hCUmFq9dJlDX KYBXqaYZfX7+bc2sELGLS7QDIl28T4c= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=jf6Q6kvx; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf26.hostedemail.com: domain of elver@google.com designates 209.85.222.45 as permitted sender) smtp.mailfrom=elver@google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1677855634; a=rsa-sha256; cv=none; b=uaMc9icSKExj22lxi6FVSrTSXYgxCglRkIycJ8bHZwvADmnddYMqP9hU5/fWFRWIAm817n ScKrGttXOlz4dWXceyVEzNmwQblT1RQGFkJrDPUzGpcR/5GrMqaOkiHIhZb2vAWSKrWu93 GL+C/vC1o1XCxXOpzreNvShqw7XMEzA= Received: by mail-ua1-f45.google.com with SMTP id g19so1833360ual.4 for ; Fri, 03 Mar 2023 07:00:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1677855634; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=ARdODDyEMP84oqzwuXABwvOYvSOQTabE/Zfw0C3mMnU=; b=jf6Q6kvx5e+3XsYxUCIuH0FON0AOL3HP1AQGBsQWNQESjtEPmqSw5czUjcojBInnCL BlMe7se/fQ+sR+LHr2a16P7iz5lDohlQZ+K6Co5qm0Xjkfz12uH8Tb/mIFP8aCF+bXOZ L5v00/PVD13fey8QhXDHS9nMcJB4uyzIcLwUkEQQnG4Tb9b/bHjIKTCvTJmNacd7avae 0ei9X1fsyJeH0kjZSPIxdv5U7gGDr5ukzjQtnrzz7ioc+AwTWcrq6CWqnCbwpl6KMsXF +GHZh/HDMdQ/EdnJNW7NU6F4UH+eDT/nqJ2RXioQqLdnrcHtYs0JedcxmPTlZszYg4tV QErQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677855634; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ARdODDyEMP84oqzwuXABwvOYvSOQTabE/Zfw0C3mMnU=; b=QbdfnLSnPQJXrEhzeRmyvLwJixxKX1MbnlbVZSUpSi5KdzZNDXc7LrWxc5IaQlPO7l ZkT9bTpzDcenCkeJG5Z5d+RLw4Oso6n879G33jfrrKkU0KzM0g/KPbjMZXdbytERnk2H iVfFa69qQ+huD7jw2sqA7LaEqWD4MZOiYXCOGXuxA5ZQo+KH/NKQ5IEzdj7vqbN/LPAH EQUXSTl2RR2J8C/OEWKRn1i97mq0oEj4zDv9e/YF5u/fLLVtZaQia/tyB1nAJn80hZc3 lHCoLX41HonZTkx3i1T1qpFJzcffGaFmd+guhlZEYu7NJdtClshjN4aoC7boySNPhgEB 2LWg== X-Gm-Message-State: AO0yUKUEZpjO09LQoJq/gIhH1YB/PuMkX10lZICM+px6xkKvIYLrH9n8 6Tq52U2eW6iofsZZPNakTNcJHW2oqROfMz3PemyiMg== X-Google-Smtp-Source: AK7set9mhMp8/9K2QjoSQXw5FO6oGqsxf3qkEkrYI0aONmNxBenh/Z5RyFbjC5WnrWNlqWnyqsh0MonmyGaid/KO+Zc= X-Received: by 2002:a1f:2dcb:0:b0:401:42e5:6d2e with SMTP id t194-20020a1f2dcb000000b0040142e56d2emr1462853vkt.1.1677855633776; Fri, 03 Mar 2023 07:00:33 -0800 (PST) MIME-Version: 1.0 References: <20230303141433.3422671-1-glider@google.com> <20230303141433.3422671-2-glider@google.com> In-Reply-To: <20230303141433.3422671-2-glider@google.com> From: Marco Elver Date: Fri, 3 Mar 2023 15:59:57 +0100 Message-ID: Subject: Re: [PATCH 2/4] kmsan: another take at fixing memcpy tests To: Alexander Potapenko 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, dvyukov@google.com, nathan@kernel.org, ndesaulniers@google.com, kasan-dev@googlegroups.com Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: C3EE114001B X-Stat-Signature: 6jeswhbr5oaj4fwokp5wapuzqmjte6bs X-HE-Tag: 1677855634-340872 X-HE-Meta: U2FsdGVkX1/1+eCtnZ6XVLhcWRhaJehlJQaLKpP1oXm2cpQ7j9lfbvtXv0kYlPYBhHEyUbqR3yeLgZ/3zLKiC6NgByWq0ItgVeZ4BRh43sWjayzUo/MvnKvzGt4yqKmTLAXmto+FE/AtgTR0aSHVAzky+0O8kewKl53JBOHDr5rYLIRyj9dUj+hd0/98beLdG20/GFhrhcpfJugeLXETlhHt5d0+cqY6NMbyGU8QRJCXF9iZpednUKUD2jALAd5483NoTL1KohH6kYGMd4bqFW3pEFOV5tr7bSR/NiPv84c77X2oMhUWmbTIVvdAXIZL4i/3vlkAVGAmEIEeUuJzmJs30y66noYHyhao53cTfHQdLJExfUmdYJsSXjBVJPFj+DnOWgCVP9RSYzJr4lGqbAukrRGG2fCqUp4wCbUa7griAFh7zdRpKZpu//DhQ4iuUosvw6cxHCwLRJN6dET7W+cJw/dwS8fet4MUljpoqbog09EINEjGFUYTuP4oEaFC1t5sdM0Am01V3/D0Cd2UPe0kHvTajxoZnr2m3qjj9iehkVmHdMQgLqK/f2WTlQWKcxgRpF9EXS/cq332HyxLBbSKglqQmsPbH37ffeYu0tIhpGMJzhSTItitTvkaWoPPXPEQlnWmLxnBCZ1drFJsxlajxO0zheHfeAsPD6BIKxEVXf3MnGghfFDIdzCXwVp4ZgDRrZwaMHUq+ePCGt9rfUp8u2mmqIQeafKAnJC1STiM8AIXIS2pzuKpaMDI2ZvLrpLhfeNo2unLB/6Y/f8DCna0tWalydn5hFYiwpgIgnDUN6eKeQ6Jo/6EELhmATG9D0DOWULsTWL/kIrtzTRNE6jrVG0rLc0BQTUykIlr7RTDLyqCDw6pLHx6Rwam+SyydbvWV+9sYHSvT1nmZpluxijxz5AvFbNtQNFeVaJFiMfZjLLp9bVhCOhS7x/Sg3qHm87tVcPRSU0n4kAgvMx bc9wP1hm S6zyoZU1UId6UYLgODGsRf0ZfccUHo5BwE6++ABWR3XHxZaaDq3ba9z1zHa/grf0xOz8qudA1Loc3YDxZGBwVIY90/06iL896JoSCcSNriJ8S88FHSU6MSAzZ0GCdrDjp0vfAcTfP3MjmgRFNlQlmKS1wu0ICsLWThl9ifToIv8hVek4v7NWheFJyS75fyJi4RzlTg3/hk+7Od+Nec82FTrZUN+cMWkSN37PIKPBw4Fn/Qx1bvrhcZDQsQUwQ0FgAkAfi3iEdHW8/DzYe5ckAUcxg4MD9Ljbh5qNFNtJDzSw6DxAX9vxV3z6IEQ== 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: On Fri, 3 Mar 2023 at 15:14, Alexander Potapenko wrote: > > 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 > --- > v2: > - replace inline assembly with a barrier(), update comments Reviewed-by: Marco Elver > --- > 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), > -- > 2.40.0.rc0.216.gc4246ad0f0-goog >