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 CCDCDEE7FF4 for ; Mon, 11 Sep 2023 15:07:40 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 67A566B02B8; Mon, 11 Sep 2023 11:07:40 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6294C6B02B9; Mon, 11 Sep 2023 11:07:40 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 518866B02BA; Mon, 11 Sep 2023 11:07:40 -0400 (EDT) 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 44C316B02B8 for ; Mon, 11 Sep 2023 11:07:40 -0400 (EDT) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 1D9FE80ACE for ; Mon, 11 Sep 2023 15:07:40 +0000 (UTC) X-FDA: 81224645880.03.4B17052 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) by imf01.hostedemail.com (Postfix) with ESMTP id 31D3D40016 for ; Mon, 11 Sep 2023 15:07:37 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=yjJPkVK7; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf01.hostedemail.com: domain of elver@google.com designates 209.85.128.53 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=1694444858; 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=FOHcmU4SPBlFSrepvb7+SqS7flL0n1Vuqk9odxNTsOE=; b=my7DDhuJoGaAaXlgjUFJUe9vbXeOTq33Ig8bRKLKNiSXui7HgeIupa0KbUdFCSPiHof2sV Q93YK6zfzH4AraEB4+9ypBg0KqafehutACjJ739u8K1QUgn4/5j2RKFZrnY8/Yk5vu+H1M HVqbCY4S6pZL2n83Oelnpb8HtNM67/o= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=yjJPkVK7; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf01.hostedemail.com: domain of elver@google.com designates 209.85.128.53 as permitted sender) smtp.mailfrom=elver@google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1694444858; a=rsa-sha256; cv=none; b=0BGHDGostUk5K/iKo9h2D7hFzdQli18MLgfdOdBFnxSpTiisZFf0PYC1UDrwKGQirqYvwk FeOrhbrzDFSCjAXS9q48LvkVCl/vLpmP0lmoFPA/ukh0WGV0ata6mN0NAcEcNTGzwaBB8S 2sflAOP87DjlrZeFwAi8xTw9P0aV1+4= Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-403004a96eeso24748115e9.3 for ; Mon, 11 Sep 2023 08:07:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1694444857; x=1695049657; darn=kvack.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=FOHcmU4SPBlFSrepvb7+SqS7flL0n1Vuqk9odxNTsOE=; b=yjJPkVK7hhX8kXErh3vHw72k2SRgONF6IRQm5zXwqkPyDhdgg0hVyvPqsTMhybRrzX yZ4pFCpOLQkNn55lR+s108BZCBPgUeXqPSzlzGQUDqbAfj+ydo/NI8fRgO7AiZWSQnv6 QqY4+zDry4ADJcNY6Q2lTIuBelfNSzuOKkPZc7X3UnBruwIscNnJ3HpKIL6ovm6TCHoC oddNWuIW5FflLh25TnY4vKo4V7bavPwGjUSBMq8ody1enM+FEOlvUuYFwmATy1YMWYSS 3okjmBpCn168qVXUbCDUEWtguuTGRxrB7Fc/ZT/XhYC5pozaTbAPvP4Bph53kWul1DDQ hFGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694444857; x=1695049657; 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=FOHcmU4SPBlFSrepvb7+SqS7flL0n1Vuqk9odxNTsOE=; b=AWrYNrDpygtuaZ4DTpT9KY/eXFyw2i3KqWfeFNR5rFVpPSD3tawoG820TuLe5H0cyw OiTNCge8VC/TkGhGwyg7DqCVoyo1UUvOUMEfW+7C0sTCbT26evBzvRCX3Rm3UGsBpMpO 9M/2h4c/PhJVlfYI2D2EQz+0nRm3pQ5MrjrjO/WCISB4dLjXj5gsfaYl9XoFevw0rnEr gsVfzLEqbTk4tUwzL1OZQgN0zLW1+VjXyTPQgsznEFxvUEFER/DICRXhmpLfbgN5TdJS /k9eqWqlcyptZ1QRgeJ80skb+ShzdHMtSCgitdCHzLPABsGN8eIEgbL4+pe5M2E5/1Kn yLng== X-Gm-Message-State: AOJu0Yz9PnK9WLDwbEmOg/IOVfer6FJbRmqqSt1USfpk7N8NtQBX4/a4 gEy3P2pY0NRA8L4LnQoHpYNu2pjRf30qNtv5lXVBIQ== X-Google-Smtp-Source: AGHT+IHJwjh/esyBhhgQWt69PjwsvB4s+p0GsaI4PnNXFSErHyI+u2wqbc2C6yPHrGQm2qHssYYi8IYTl8FnbqIJH2Y= X-Received: by 2002:a05:600c:452:b0:402:cc5c:c98 with SMTP id s18-20020a05600c045200b00402cc5c0c98mr8376028wmb.13.1694444856665; Mon, 11 Sep 2023 08:07:36 -0700 (PDT) MIME-Version: 1.0 References: <20230911145702.2663753-1-glider@google.com> <20230911145702.2663753-2-glider@google.com> In-Reply-To: <20230911145702.2663753-2-glider@google.com> From: Marco Elver Date: Mon, 11 Sep 2023 17:07:00 +0200 Message-ID: Subject: Re: [PATCH v2 2/4] kmsan: prevent optimizations in memcpy tests To: Alexander Potapenko Cc: dvyukov@google.com, akpm@linux-foundation.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 31D3D40016 X-Stat-Signature: mruzo1dagkownjjxx48yregkmx967jrs X-HE-Tag: 1694444857-98797 X-HE-Meta: U2FsdGVkX1+JQUz1Ea037IP0vx4mIzKqZYMEsI91SDtx5GKBrCn8Ly3XfQCtpD7zhe1ogGQNUIl+btmaitvxIbZk4NDy+DzL5mZ72lkefQxclc78+k2E1qU2olcaXjIJSUivuHWCgDgSweSF6jsUeO9DVUG2CEtAY+ofVu4BoBgwHFIMcw6BKRZVgwGhHz6NCmeyDia5afWqTpMSrNslMUbZ4DbWnKFY0R/XYq/2oRi62haVCTBikwpflIzsZRvnmCGM3mQ6a2PqMUwYwRXJDc9Mu/Zo5fhKwt7yTHTp+ExQyqtJ9FlpP2sLJdJ59T1IrP75gskUkszRVmQI0dbW+eZmW1Wcyq8aw3AajIuw+MQf3UmP0PO7BHdRa9Jd1Mi/9XivtkPxp5xYNWd1nxfzzWp+KE08ETiGyeConuENUz8N/6EnPnN/9SyFWEtBsAK/fUciiPR6Uj/xXeFeM7p2Ci998akXUwschpLTyvqTncJhD2Ly4GnlGJGQcf3AJmNu4O/faudzrYaEo9BSR9TbvNrc22uBbag8CCuTmJmgQM4XtNfLbDhl1WZdYFm2WNLnSeG+Vyznt+Mnlyld2nTxAPuxiXdy7Bfki7xVTgtorFhMwK6mHM+Sz2t1D2MOdFAh6Hmim0sIzgP1z7sDpP5EmLhJ9qCWdqwEis/Xl+NSujvW8S/b/ZEL3ZW7qGidCRS30KY471TL0Cw87MWqnR9blumGmqJ5n5MduARmjk+PMKEsoKMRyUUa/YKwb2Yuk3NUz14wcQW7uA9Zqont8AfhBT/BgSOiJaTa9AnRTuvWkP9QO+VBL7GTq8JQAjna+bb8eWxQW16Pwzf1n2hOHhPX1k9kVty69DABo4Q8/7wXzazawrfODBzbWtvGAdzVJu80tq5xxq7ysiIuOdOvV6oJ768zB2NB/k00s+inYWJYlnnQqO0IBDJ3lXfJ08bw9TSM4VYIsT2ZAWMGJbiKx0q sgvjqPuv B2wSK1hJblfDaS3o+hCQmSOFgM8JYDco7EyPlyPefWTNKS6I/hbVFH+YHT+IrjwxF7fJhuMn4OyX3OE8m5QkdD20GC9QRh/RJQJZt/vwosUdR69Ef/UHq6Jx766WkDiXw5Wiz6dDoRJDfHyE589uo0iTzs0Q5CdUZr32YAOcJhE+Us6OepxSC478VRxgXiz1xx9qzFEq0i5SLeKpo0Vi4VfBqLNAUgI+e/JMDcSwZI0MsxUW8Ix0L8964TA== 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 Mon, 11 Sept 2023 at 16:57, Alexander Potapenko wrote: > > 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)); \ > -- > 2.42.0.283.g2d96d420d3-goog >