From patchwork Mon Sep 11 14:57:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Potapenko X-Patchwork-Id: 13379414 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 EEEE1EE7FF4 for ; Mon, 11 Sep 2023 14:57:19 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5B0C76B02AB; Mon, 11 Sep 2023 10:57:19 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 55F536B02AC; Mon, 11 Sep 2023 10:57:19 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 400486B02AD; Mon, 11 Sep 2023 10:57:19 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 29BDB6B02AB for ; Mon, 11 Sep 2023 10:57:19 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id F0DC3160AD1 for ; Mon, 11 Sep 2023 14:57:18 +0000 (UTC) X-FDA: 81224619756.01.D84AF03 Received: from mail-wr1-f73.google.com (mail-wr1-f73.google.com [209.85.221.73]) by imf23.hostedemail.com (Postfix) with ESMTP id 27320140008 for ; Mon, 11 Sep 2023 14:57:16 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=QcbJOA72; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf23.hostedemail.com: domain of 3yyr_ZAYKCEwuzwrs5u22uzs.q20zw18B-00y9oqy.25u@flex--glider.bounces.google.com designates 209.85.221.73 as permitted sender) smtp.mailfrom=3yyr_ZAYKCEwuzwrs5u22uzs.q20zw18B-00y9oqy.25u@flex--glider.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1694444237; a=rsa-sha256; cv=none; b=BtRHwTPjll/6vhQrB+/Bq35zv3EcC4D46t1EXZD8B2kbGwOYpOUVZJdcLGFGoGg+XIbUNc BGGIdAg9KdWJTqN/sVmoaSSwaD30ieZO4QmVevIi7CJPNc26hfGI9eQqOYuYDujVr4se2y V4gs2ouck2gWIORJ4SDuu1ZKVHq5/O8= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=QcbJOA72; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf23.hostedemail.com: domain of 3yyr_ZAYKCEwuzwrs5u22uzs.q20zw18B-00y9oqy.25u@flex--glider.bounces.google.com designates 209.85.221.73 as permitted sender) smtp.mailfrom=3yyr_ZAYKCEwuzwrs5u22uzs.q20zw18B-00y9oqy.25u@flex--glider.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1694444237; 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=TCSVjF+G/Yb3+dPBWGz9EuIiyh+/ldUAKZlZ+MbeoHM=; b=K6PzXG24YYlaU83+OAIO7h2XT0ojsX6LOU8uDY9rvMWNrgawDAI0FNqEedc9qnpCfaZeu+ QzgDh/19aF28jANswgvBN1ryb2EEbH5tFh/lIAW75/s9s2o/ZFzIKXzv5F3Ee+5mEEEPEh yrxLQ7ZApvd/m6K0CpHscbX4U9QB3yw= Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-31aed15ce6fso2827695f8f.3 for ; Mon, 11 Sep 2023 07:57:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1694444235; x=1695049035; 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=TCSVjF+G/Yb3+dPBWGz9EuIiyh+/ldUAKZlZ+MbeoHM=; b=QcbJOA72rOlJxQuI82jpcizHnpN1UQ1l74BBXCqGGWzgQ6mUeT5mMXunv750PPUGGJ um/Ljkaf93SqPIwDBEIuQHYo4CXP6Nq1VPeUrbE6N8qH96ZrOLP0L/NyYY/o9+mG5L7H ghGdzyJ//IcLsAS3CHEa6NUUtCNXaZFIdaC6wTsm3J920osh2OHHeR9FofkhQ8UFebGL wY0aQ/6gn+fGUrrfFSO141/hywAo9km8LBSFi4lQ/twLKyX8MyVx3Po90hKOx3wO3vyn 2LBueNYgq0W/y22m2tJ+kbkwyzU9VH3MJsBGiBWCx6KO/OCL6evpT6yUzVxb9YPoQsXX AwJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694444235; x=1695049035; 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=TCSVjF+G/Yb3+dPBWGz9EuIiyh+/ldUAKZlZ+MbeoHM=; b=jHG9P+4IkzhQp6F4O69JbP5SEW6tGFAM50e/Vg+wHK+MD1oSwcQF+3w2VjjkvcLCyq aMrZnTKQedf0zQ92o0sPIb6RTG/BAIwfUYw1UQoUHGIolW1O3spWo2NYnc1Vo/HtOaj0 JfgS1a/if8MPVIh0qTqAaYk/4xEe7dbnaL8VMJbDiggamaL/zM+bPguDkL9Pz75FwFne /cyhcGS6vGqvFo9WbUCnVeruzu/t7kRlx4DodPk2Y08Q9cFJglkfOuCMve/OqtPRkoj2 ULDpb+TXwlhGvdSOc8JoSnnGWLK5D4E5BWe0IQaUNwl9+IF3qeBiz18cFwENREQMXEN0 cecQ== X-Gm-Message-State: AOJu0YyUliyl2zRsEsY1BGJR4RwzQpu38oHDG1woSP0I38aBGEcapCkB b5tEI2HAMWaAfXNth6dxxvzdTR0LTcs= X-Google-Smtp-Source: AGHT+IF8AQnXMqKw+wXUY955bd2z842BBltBx/W8SpN0YrTJ17nBacddlqEtoES1ZoK3oQ/7F/gHOXNEgb8= X-Received: from glider.muc.corp.google.com ([2a00:79e0:9c:201:62e7:6658:cb4:b858]) (user=glider job=sendgmr) by 2002:adf:ce84:0:b0:317:41be:d871 with SMTP id r4-20020adfce84000000b0031741bed871mr114853wrn.14.1694444235317; Mon, 11 Sep 2023 07:57:15 -0700 (PDT) Date: Mon, 11 Sep 2023 16:57:00 +0200 In-Reply-To: <20230911145702.2663753-1-glider@google.com> Mime-Version: 1.0 References: <20230911145702.2663753-1-glider@google.com> X-Mailer: git-send-email 2.42.0.283.g2d96d420d3-goog Message-ID: <20230911145702.2663753-2-glider@google.com> Subject: [PATCH v2 2/4] 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-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 27320140008 X-Stat-Signature: 53rdcm9xshe8jqfgys7g3a3q9se8sm38 X-HE-Tag: 1694444236-175025 X-HE-Meta: U2FsdGVkX18ZqrrP4L5bQeI9E2/G3Jd399UWbD9GHGx2+9S+BKH7pU7k1wJ3PyObEvGjZWQixoWAjrLkTov8pegEOHa9Xoqc2rkUMBrN44GMqemD4VDqJfUAqBaZEp6pdOJqyuJ20VAQfNSesS9RU1AakzBF3LZR3ZnrAWTaV/g57+3+eDFbywR1Fo/XLi9BLvcH1pMuz22EIVGXIVyC16TmEDLkv+Kz7TLykQ/XLxlAQSFAlblUtc8sBdSUDcJ3XDiN7bBWOf9iVlDKPN12G6kEomV5Fru0wedgOJwgwq4Ba8WOMoDtQBdQ37sNYGOt3g/5QlvGwUIbHVYR+blkib1oLM7TfIZSCEn1UQM2CMMqPWCX2XmgB8cmJ02wnKF1PrPkIWw39O1sdSPTzWC7xyuswQPGL7tCcnoAuu4r/XMQmuSrESg0DPjr2bjTyicor/DynHddCf4Ifuif/bSUqnblNoPhpfbqKCarTqcax83UJB79Gf3eTivdXFk5iLTC86kzn9rwK5Pb4XtNjgrjvncLAU75NPf0YWrnvTh4zRtLmSbSVxULcz2DG3BmfUxrxsnW2y4jNPrKY2V9+7jg8hrL5WPtUbHHiFPjDW6x2AF11prNtYVC9QK915hJuuPKSgWUcYwkQ76dMrNHklP9J69lzUM2x1dEToGihJ2+TOnGyDQij4BaqBfsaBjsQcFgfuQdEvqm0A4L0yKPjZ/FzgFuIXjPl+976W4aKIlIqJwwJuM0R4LI07Tt/dvGTKi5yYSNwP0uOpnEko0oPNxm7Tjf+Cbrexy2X3jWaeo3d50UjUotV6PxMKXZwOoGwCGlPr/N0y91CAhh+e3RsuxLbiGZVAJulnwn+QuaCjU44sDfol6oHV2vhBBigO5PLBO1GHfHvD6WxwT91tSGHjq5sa5zZ95jaz/ZmWVWOXuINgByhzrgEH/dlSiDfs+c5yAmklq5FeOjwfmRvtpBsQ9 f/CSDJry yqHlD5RCJGuDWphIT3ZTF/cdq4ZMFlSXGtpHkNZ4RSUSVHWlwHL+awiGhhwzkFwZUFP/VxVf2lE/+S6OheXjxeUU0jy2+NBakkChg2QfpaX28x4yXaM6Q0vRtyazH2isHBhg7TSqXnlNJfyAjG10JcvOMI72I3iK0da64FTEYLfnNmOBWdsgvHr+mLCwskn5lxYX/2RaKmOvgdj+zdoASvSOjBhDSratcIfVFPmuLj0z7kI2o+KiPPW1lB9erJafIxI8gkecb9mPmnTIa6Vo4IqmLRpHgeJyoIdeCZV6bRFc9HYd2UUgj6gc0+HKb1GVtDzubh2a+nlB4wnHjpniUqa9TeA640dJIKM72hE1jtKrTJV34t9eB0jjEhe6P2lZivRHsrdtOlr9re0WG97wxDUMIighZp+V7sJ12mtEbhE/PU2SHYu2E6DARktFfINk0SaERUrmHgsdWeevZDJYjSXT46i3yPhHdIOBYPUkds81YnzJ1Sk54q7k28SFT5p5RnkigiUWWHXsqJOY= 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 Acked-by: Marco Elver --- v2: - fix W=1 warnings reported by LKP test robot --- mm/kmsan/kmsan_test.c | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/mm/kmsan/kmsan_test.c b/mm/kmsan/kmsan_test.c index 312989aa2865c..a8d4ca4a1066d 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((void *)dst, (const void *)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; + volatile long long src; + volatile long long 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((void *)&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)); \