From patchwork Thu Sep 7 13:06:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Potapenko X-Patchwork-Id: 13376429 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 91316EC8727 for ; Thu, 7 Sep 2023 13:06:54 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id EBD0A440185; Thu, 7 Sep 2023 09:06:53 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E6D3B8D0005; Thu, 7 Sep 2023 09:06:53 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D34A7440185; Thu, 7 Sep 2023 09:06:53 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id C5CAE8D0005 for ; Thu, 7 Sep 2023 09:06:53 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id A18E3160167 for ; Thu, 7 Sep 2023 13:06:53 +0000 (UTC) X-FDA: 81209826306.20.EB4F14F Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf15.hostedemail.com (Postfix) with ESMTP id D4867A003F for ; Thu, 7 Sep 2023 13:06:51 +0000 (UTC) Authentication-Results: imf15.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=KviyaW2Y; spf=pass (imf15.hostedemail.com: domain of 36sr5ZAYKCJU5A723G5DD5A3.1DBA7CJM-BB9Kz19.DG5@flex--glider.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=36sr5ZAYKCJU5A723G5DD5A3.1DBA7CJM-BB9Kz19.DG5@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=1694092011; 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=s8i7Jhe9BViu4aMBPbLDU6gPTC4qxWjzqtUEiNX0CLE=; b=1GzOpLmcO5+UlfLZOBNLRttl/GvjrDSX3rFY5siidY4+kUnzMeVR9BDqv/NoLmi6f2OPW4 42qbXoDY1DnNV2beElIbkf+sbeHAye2e2fPyK5LYblmexK194wR/slo8Q4W/of/xIaBfyC C10DF67xEXGBoh07xyFUUZDki171oRg= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1694092011; a=rsa-sha256; cv=none; b=HCxQTGY/uM68KB9Bzwfwbcyc8ubZIOGNviHVwhU0QPnL0Qs4E2aaPBa3CDAI6LqrctWIYP KDc8XW310kOd/6XTeiZmvbiUNVICb2Yh9Qgaqi51v1tTj/z41g7d0qtQsAtOK7LK0c3IdR ziopo8+d2OuYODja4BDBBlLPpvpW4cQ= ARC-Authentication-Results: i=1; imf15.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=KviyaW2Y; spf=pass (imf15.hostedemail.com: domain of 36sr5ZAYKCJU5A723G5DD5A3.1DBA7CJM-BB9Kz19.DG5@flex--glider.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=36sr5ZAYKCJU5A723G5DD5A3.1DBA7CJM-BB9Kz19.DG5@flex--glider.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-5958487ca15so10379967b3.1 for ; Thu, 07 Sep 2023 06:06:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1694092011; x=1694696811; darn=kvack.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=s8i7Jhe9BViu4aMBPbLDU6gPTC4qxWjzqtUEiNX0CLE=; b=KviyaW2YfhnGn9sh37dnFiDNOqZyteohmNEiE0UxzGj/Fosk5wLMbrO1X97uxZlcI3 Se8iiNaBSIHYmPMhds8NaRaLZ9kxIdFJr21mjE+ZtAREBTPdGQzrHDupVFaq/Zit0p7w 5LPleExc4hgFpArDDF9FAMv54DaRXkU11ahn3Ip95GX88HdrzP9Pktqch2kR/k4yoLFG LxcXg+Y+tjLSJN7ogGSmP7+qOK6IOCwF83Stcjs+rJ4IaCqK24GVwci5A923nabucw6g H6gEpWprTRXJwpi1G4OTrJgeVZ2yi9ofquGBcL5ywrSAzuY2tyLQHR1UV2Qzo8JT7g9q GQzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1694092011; x=1694696811; 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=s8i7Jhe9BViu4aMBPbLDU6gPTC4qxWjzqtUEiNX0CLE=; b=fBkSCfRrVH27uXhbRgnXnKHFT21D/kypuD7gYrYsU5v/Wd8KKtgw3Sq7I5YLC9EIX7 TcmcZ2g6fBnJ3sZj9CbMTE7L/Et4VqnrLKCahHteahs2i7U19kz17YOx7MtCDWKW90UL Clk5Be1N/OHzABU+QWoyqwrjzzCAI1Ylg0NOi7G5XbgjjQQWJKcIqdviFGlIi3TSsr30 rxCtuydPzp+TNDYZV8ArtSgCEAlo2qnkSek736aHFisX3O52OZRSjJR5q8G6yIKQ2GlO NWE93DjKoUFKeGceSihAzYqVwzRz0a3ehAO1fOgG4DP5RY8xr93NhJ6mTzy/jB21+rjk 9fCQ== X-Gm-Message-State: AOJu0YznCYZ6jO4BAwx+41GiMjI2bCsepYHlF6P2dzLutSp5j5ohZ5rW SgQkt5r9rYjs30B0XZfEWMZ+eagNqEc= X-Google-Smtp-Source: AGHT+IEevIijC6sdQUSkGV/Z3VUPtyWQWTY5lHP0KbgSWdAqKt9EUNHzvlQ9r/pckae1MLXf3sJctovYv6g= X-Received: from glider.muc.corp.google.com ([2a00:79e0:9c:201:33dd:e36e:b6dc:1a69]) (user=glider job=sendgmr) by 2002:a25:d20f:0:b0:d78:215f:ba5f with SMTP id j15-20020a25d20f000000b00d78215fba5fmr466389ybg.9.1694092010883; Thu, 07 Sep 2023 06:06:50 -0700 (PDT) Date: Thu, 7 Sep 2023 15:06:42 +0200 In-Reply-To: <20230907130642.245222-1-glider@google.com> Mime-Version: 1.0 References: <20230907130642.245222-1-glider@google.com> X-Mailer: git-send-email 2.42.0.283.g2d96d420d3-goog Message-ID: <20230907130642.245222-2-glider@google.com> Subject: [PATCH 2/2] kmsan: prevent optimizations in memcpy tests From: Alexander Potapenko To: glider@google.com, dvyukov@google.com, elver@google.com, akpm@linux-foundation.org, linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com X-Rspamd-Queue-Id: D4867A003F X-Rspam-User: X-Rspamd-Server: rspam11 X-Stat-Signature: 9ge3hq1df4rrrucgdzmtxaqnuww4imfj X-HE-Tag: 1694092011-318038 X-HE-Meta: U2FsdGVkX18F1Y2xEWKJvdt57fBCVP7mYULl3IzdOqWulBhHLyOpg0ed15QeAYD7WMjij3JBpwF2we7TQJ/NgCZHXICp/WMmAGVny9sMp4qamzqvFrlC/ahO9C2j3BPjjSivud3b51+n7z1JMYPJOzogUUZiyddlrruur5eYthYxfvMZ8+aUNCHXCactLGKqmFKYNzqdyOE3MKUYW5dYsAI4c1r7htWLIuHIhIKjzD6OenmNAJ7jM+xoSOS+/cTGrCKkqFU+02XGkutFI1yImo67jb0sUtg0SXf2r6xMLyHLzsCnC1KLqeXrUzxr/DyuQViA5x7VEMXMeqxgX1UH8h0wLS6dM4CrnT/2jb3cw736ytKL1Pbb6DKdZzR3+d2bLYATgwJOWQw1gzRt+d48YUgBX5JCgzlDPaKbxIPtDYtedjYLBlKWKJLSTb+SvhGrm9PBd0OsilrObMjmZ5SuILrmwdGlrDw9LzAotgYcEdwNvRI6Y98Qt1wJSyOieB8b953dbbqNRQB39IhUIzoHxp3QgrzDOE4w2Ci4rCg1RERa8y4TkZ/Kmcpwv9cC3wJ67in2U5KknjqTPetTQeS+IQk55n+lBiNd8lWXWfTfXqXIvtDKk7uzFmc1DD+hQtHqU1zkmNrsWdcb6FaVDFXR4DinySwV+CVl5PU9+O91wTZbF6NOiHVVhX4IPnchgDwcbMSVDfC1vl3WMhjiiB5yEvi5TyPUuI6yN+aid3gsXqarJR2WLVyXcn1R2dILOfmZgn52hmjYi2QcEXVsAgb0PJ4YDlglcUx+vzjzDDwB8+avyTd4vC/xfNY1I0Knd5qP7aHnsgt1QCHp15ftUsBV1JwtvbuFN4yPWLtmABXUOKNCqn91iN2FbJvnbQqXHESvgag/NA5C2LgEzTM/nXtOJU4TQzeAEpwl3VdysB3JMFuRf46IDpPQtRw2Dhn1TrANOUMv4mtJQfNctlK81Oq ZWqOumk7 9TYBo1Qqefaw3QFJCjERoXGZFQ0goAWpqIh7mqWZeQHRGpkVSWR38wWCQyAH0G7CPhpIxtxaup2msXWASjYUwCPaEUmccCzwe0e+q91n1OTBSORcqOyBuThoxzwlMInm7zFyhz8u43TPr9yyzlhmQQKXMElkQoQMMvVnYrhFVDsGIGwy322YZbQVQ8qirqvdNRzcPP5eLPyVdRDJRC5bJrgiK6g+ionfvBe9VlDm/YuJnXU47ayFBOMjBKAb8vsq4F4Or/gyqgWpy1Bl5B9X/cNXg75pTZ89zb14ywRl9bAK3zxIL8zvUkb7opAfn/XWfn/tURgNXqNYiKsX7q1lxnuVoVu0u/POxZMLBL62UJ0T6CpZxdGAJnAbmgwbSMPi8qd/2orx/lEzqPiojji7uBtG6cnpNOD7Ndba8Yh1tKVvRdc6g9S/EZ7w4lTyVFxpfDWn1gSES/kXYrSHua34ChsgcQPiekc//DXJd3iZ7+/Yu6DszwCqx/SRHeALCWuNNxytX6p1LvoAzp7M1USNRmMXNvYkUHp8KizuWoIaxRCS3b3OV26/qQfZcmZDB80iyuzdsVPra+Gd/k6/YAO/KeKZs71okt7GeWUGUP8UXV5YGcKg= 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: Clang 18 learned to optimize away memcpy() calls of small uninitialized scalar values. To ensure that memcpy tests in kmsan_test.c still perform calls to memcpy() (which KMSAN replaces with __msan_memcpy()), declare a separate memcpy_noinline() function with volatile parameters, which won't be optimized. Also retire DO_NOT_OPTIMIZE(), as memcpy_noinline() is apparently enough. Signed-off-by: Alexander Potapenko --- mm/kmsan/kmsan_test.c | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/mm/kmsan/kmsan_test.c b/mm/kmsan/kmsan_test.c index 312989aa2865c..0c32c917b489a 100644 --- a/mm/kmsan/kmsan_test.c +++ b/mm/kmsan/kmsan_test.c @@ -407,33 +407,25 @@ 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() +/* Prevent the compiler from inlining a memcpy() call. */ +static noinline void *memcpy_noinline(volatile void *dst, + const volatile void *src, size_t size) +{ + return memcpy(dst, src, size); +} -/* - * 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. - */ +/* Test case: ensure that memcpy() correctly copies initialized values. */ 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)); + memcpy_noinline((void *)&dst, (void *)&src, sizeof(src)); kmsan_check_memory((void *)&dst, sizeof(dst)); KUNIT_EXPECT_TRUE(test, report_matches(&expect)); } @@ -451,8 +443,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"); - DO_NOT_OPTIMIZE(uninit_src); - memcpy((void *)&dst, (void *)&uninit_src, sizeof(uninit_src)); + memcpy_noinline((void *)&dst, (void *)&uninit_src, sizeof(uninit_src)); kmsan_check_memory((void *)&dst, sizeof(dst)); KUNIT_EXPECT_TRUE(test, report_matches(&expect)); } @@ -474,8 +465,9 @@ static void test_memcpy_aligned_to_unaligned(struct kunit *test) kunit_info( test, "memcpy()ing aligned uninit src to unaligned dst (UMR report)\n"); - DO_NOT_OPTIMIZE(uninit_src); - memcpy((void *)&dst[1], (void *)&uninit_src, sizeof(uninit_src)); + kmsan_check_memory(&uninit_src, sizeof(uninit_src)); + memcpy_noinline((void *)&dst[1], (void *)&uninit_src, + sizeof(uninit_src)); kmsan_check_memory((void *)dst, 4); KUNIT_EXPECT_TRUE(test, report_matches(&expect)); } @@ -498,8 +490,8 @@ 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"); - DO_NOT_OPTIMIZE(uninit_src); - memcpy((void *)&dst[1], (void *)&uninit_src, sizeof(uninit_src)); + memcpy_noinline((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)); } @@ -513,7 +505,6 @@ static void test_memcpy_aligned_to_unaligned2(struct kunit *test) \ kunit_info(test, \ "memset" #size "() should initialize memory\n"); \ - DO_NOT_OPTIMIZE(uninit); \ memset##size((uint##size##_t *)&uninit, 0, 1); \ kmsan_check_memory((void *)&uninit, sizeof(uninit)); \ KUNIT_EXPECT_TRUE(test, report_matches(&expect)); \