From patchwork Mon Sep 11 14:56:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Potapenko X-Patchwork-Id: 13379413 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 717E6EE57DF for ; Mon, 11 Sep 2023 14:57:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CDB736B02A9; Mon, 11 Sep 2023 10:57:14 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C64976B02AA; Mon, 11 Sep 2023 10:57:14 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B05ED6B02AB; Mon, 11 Sep 2023 10:57:14 -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 A17136B02A9 for ; Mon, 11 Sep 2023 10:57:14 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 668A6A0A54 for ; Mon, 11 Sep 2023 14:57:14 +0000 (UTC) X-FDA: 81224619588.09.C558244 Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf26.hostedemail.com (Postfix) with ESMTP id 94C8914001E for ; Mon, 11 Sep 2023 14:57:12 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=gGQRqaYK; spf=pass (imf26.hostedemail.com: domain of 3xyr_ZAYKCEgqvsno1qyyqvo.mywvsx47-wwu5kmu.y1q@flex--glider.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3xyr_ZAYKCEgqvsno1qyyqvo.mywvsx47-wwu5kmu.y1q@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=1694444232; 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: references:dkim-signature; bh=6iMPMRaHZZkPt2h2lba04yggcsYBY9dzA07C/TArg4s=; b=lnOztKpcIDa0yS4tb96pqcaekqGEvwhw33+wMXD5HL/DnS3H2TsjAmHv6Bru2sJKXQFLRZ YW3YPUzi/gEAB9Ei4uoiXxjxwQIvmLyF83ULgYQGyTgBPprZjhAQKJgAoknihRk+WVS/1X f3Q68GrTRsxnMppaIuhWf28MbQ5ZqX4= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1694444232; a=rsa-sha256; cv=none; b=0KiD1A5IvKQAB3d5qrmGeRg+82CIL8FU9eQ0n9UZwFpEazSuhIxQ0oK/MJoDkKfuxIdx0r RnX+seHfDzzLwCGSnPujzdRuIA2/C3gRtFjkohF/a+mHTb6sklzGaZFxWdFrCtGC2pUNb9 UjOgrLTZeWFzThflBoO0g4xaEbeAcTs= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=gGQRqaYK; spf=pass (imf26.hostedemail.com: domain of 3xyr_ZAYKCEgqvsno1qyyqvo.mywvsx47-wwu5kmu.y1q@flex--glider.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3xyr_ZAYKCEgqvsno1qyyqvo.mywvsx47-wwu5kmu.y1q@flex--glider.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-59b6083fa00so30376937b3.0 for ; Mon, 11 Sep 2023 07:57:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1694444231; x=1695049031; darn=kvack.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=6iMPMRaHZZkPt2h2lba04yggcsYBY9dzA07C/TArg4s=; b=gGQRqaYKr2pa+AgHbvzMYNMh8mqdPqkQy/oN9hMNmrTGmsD4KS0cYXJjN64azQ9r9m nbYyMV7Y20Cwr27rgrZsRbeYwb0zV8K+Qk2ydGV7neonglviMrDR7YucpOijvZILh5gK e1REU3+tFpVLTOhZWsdVo89SdwIaTnBdvtV+AP+Fk85o4jzFZBk8wvEZYWgLiWSM64zV mo/027DFTPU+s292AyArOZc5iuH5I5O4mtMrnvi+Yer+SAkf8Swgr5tBbJbya+O9sjGQ DsresuO32J+7kesZwAApBPfisbc8PBkdkbvsVXYA2DRSYjrPG9yb9I1na4Qb9Rfy6ntt g1GQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694444231; x=1695049031; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=6iMPMRaHZZkPt2h2lba04yggcsYBY9dzA07C/TArg4s=; b=HaMymYuAq86XKIuwiY5cStSiNKClvEnzEvAVI2F2Swi2UFDHFeUYkL/6/xO241UGWE PsPxrgk88QDKVqdb87+u/JTr8XFx1lHN2YaGWIafwKECuOf5fF6yvLacB+EyO/oY4bGJ 9wDfpk9vu07L8/1QW10EgEgz5nmO1STVZ4r0HrV6Ws4eatouD2zg+6h4XsbBIF9vsRG6 l3/Lj5f4XKzGhB5atltlPN2yvn84BMKjKCxfj/hd2TE3uBbHVPXslBYfVQTLcByTB5to Ok+c+SOOl9W6TX5F2k/P2yCVhuyPSHoaoUeEBlOcTzfYiAMvL716VPF+mPzEq1wEjqB/ HWlw== X-Gm-Message-State: AOJu0YxN4K4qq0lGrxapaOsqxtLxwIKJF8EOeVk39vvazihGy0zSJc17 cG9K2wTshe5uXKNRj2dlUm7cxNwuj6g= X-Google-Smtp-Source: AGHT+IEE/n86D7W4BtYVWvhxMGGLZDAbWRkUH6Etb6BUe2tQGb6wjCu5rOgyHRKUX+nMOOSbojbh9HnT304= X-Received: from glider.muc.corp.google.com ([2a00:79e0:9c:201:62e7:6658:cb4:b858]) (user=glider job=sendgmr) by 2002:a81:b706:0:b0:58c:74ec:339b with SMTP id v6-20020a81b706000000b0058c74ec339bmr231210ywh.1.1694444231601; Mon, 11 Sep 2023 07:57:11 -0700 (PDT) Date: Mon, 11 Sep 2023 16:56:59 +0200 Mime-Version: 1.0 X-Mailer: git-send-email 2.42.0.283.g2d96d420d3-goog Message-ID: <20230911145702.2663753-1-glider@google.com> Subject: [PATCH v2 1/4] kmsan: simplify kmsan_internal_memmove_metadata() 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: 94C8914001E X-Rspam-User: X-Stat-Signature: x1mh6zmrfgnuj81g1wzisrsmntkq1er7 X-Rspamd-Server: rspam03 X-HE-Tag: 1694444232-669734 X-HE-Meta: U2FsdGVkX1+BDTXckqljSPqPxhCpJWz78ZfQeiNLeby2MZKSCKcfxtCCYWtcF5O8gno+0GVnKu4YKyQN1CUUE3zEanNfJ3FkD1GooPmBMgRgc0A7RSZKQ/kRCxF9vwbjzdFnHg42tLOyxvRNHXet/RUhp2vujRE4amKM+6MJi9JR0/T9+nk37tuZ992fmSn6PS9usu+Quu7pwpc3i9ecNs2h5896BKEz9hC1EsQk9HaW/z+hlMaexCihx6t4aRQIfGBBFiJO0aHz3KzULMFeSKZplVnB7yD36PkSMrxKHd4WfA21shPAweoZunLlqpFntKMsEdBPxC7PCY+AtsGJObvb4NcsU37JZWS4CUHnseUbEvD2/hDfCfTchHWCFYIz8gZnMrsb+X+85VrKCvcQe378SEKoQSqh48cyZYzCFJd0MBQo+7jYrAk8414jKtjwOI6LZl38Ms8O3yrkmOEZLVwalnoDeeJcMXKimN01DyQFBg8bihrYM6R+NB5JliOaUoAOTBuqlqhtgDD7YK7hdL4Sv55pIuig6zIzS3jRFt5HlFprmJlRByDmbiuucSFJpP9aswY0r7hOhiA+J+OmDCNJgP8nU6rQiFrD1vt9ZIvtdOrKOyoAU5o9NNBGdQB7fNXF2LE+VrUGr4b+8ulsHnsW2r8B02VnJww/IVpYSbrqW6ZjO4rkVtU9glcIOxie+VbP2DvSddweG81kFRooDbnNDUZ2HK5hO6jEKKWcEuzKWKfqSIUyx94ewPzWr+viEXByDZqZa7+/jqVA8khkAmp1xDL+1wuGN1OCGfy+yxcqyMD2Ogs0S924bJUY6pqyxLdwBRBs1+HpnRnVVQYcmNjFEgBXmL7AmEfkayvrKFxkOP5qSe8pS8bJjqdS+79ntPdXKCz3WFSDrEa8AwTOJQpkynEM96M38ZIbRKM6/HaiYklRYa8f/f3/yfdtoWstISzjvbbHvVfnF2QNi00 syZI++xT zYbJuRV4Drc9eIOXfXXMiIpaaJxBjhO6a4ZgNsTSnHwuLfugZwHctVfVwJiqRfT5mEUifBGZGzqS3K0Ai7/J/7RBsOBsH/tXXf7DQ6W66L1kN7aciCD4EGELImqqG0KMg14Hh0Wi4ZmAwWpiuHb9XE8Tw/oZQsZu+uADX3U/glOzWjmFYDFDGMhBC3nxDydcJwA6c7/C6P35v83zxBrKbrOD//AHv5VNavuiOfkO1Zv3kjY14h5pLpbTKJXKnSr3AbSGp+0nirdiBsUWX4zEWrsVadD1FxSrbFqxOVW9irS5sENpjyDTbLHFQMMqdshIpVZyyUugN0HdwYm+owvW2TcJ8V14UO9BvfSOMLnCDh4tD/QsPp6tpE5ydJ9R3017L1tW74t1UpO6TyAYd9o17oXO/40Eh6oJhs4sik6q7br7zBrIsQkbDghtu8oUidgRT/8QYuFsf20OptglRTjinPS1Q8adQAlMacvY5+s4asi1TXG2nYUPD56fxyREG7c+ZWsVEVRpDFWEDgRbX3PXdkwt1/KWuQwz+HstIKhZf6PaFVWxAWgQEmZZJ4LnztiEciOuubSvGu/e2lUnZ1pUw6r/bXZCQYMxoJ1DUCwAjFg2MyzUiG34UXRZer+ueoXuMURouKP+tkm+4msy9eipSZiKR4g== 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: kmsan_internal_memmove_metadata() is the function that implements copying metadata every time memcpy()/memmove() is called. Because shadow memory stores 1 byte per each byte of kernel memory, copying the shadow is trivial and can be done by a single memmove() call. Origins, on the other hand, are stored as 4-byte values corresponding to every aligned 4 bytes of kernel memory. Therefore, if either the source or the destination of kmsan_internal_memmove_metadata() is unaligned, the number of origin slots corresponding to the source or destination may differ: 1) memcpy(0xffff888080a00000, 0xffff888080900000, 4) copies 1 origin slot into 1 origin slot: src (0xffff888080900000): xxxx src origins: o111 dst (0xffff888080a00000): xxxx dst origins: o111 2) memcpy(0xffff888080a00001, 0xffff888080900000, 4) copies 1 origin slot into 2 origin slots: src (0xffff888080900000): xxxx src origins: o111 dst (0xffff888080a00000): .xxx x... dst origins: o111 o111 3) memcpy(0xffff888080a00000, 0xffff888080900001, 4) copies 2 origin slots into 1 origin slot: src (0xffff888080900000): .xxx x... src origins: o111 o222 dst (0xffff888080a00000): xxxx dst origins: o111 (or o222) Previously, kmsan_internal_memmove_metadata() tried to solve this problem by copying min(src_slots, dst_slots) as is and cloning the missing slot on one of the ends, if needed. This was error-prone even in the simple cases where 4 bytes were copied, and did not account for situations where the total number of nonzero origin slots could have increased by more than one after copying: memcpy(0xffff888080a00000, 0xffff888080900002, 8) src (0xffff888080900002): ..xx .... xx.. src origins: o111 0000 o222 dst (0xffff888080a00000): xx.. ..xx o111 0000 (or 0000 o222) The new implementation simply copies the shadow byte by byte, and updates the corresponding origin slot, if the shadow byte is nonzero. This approach can handle complex cases with mixed initialized and uninitialized bytes. Similarly to KMSAN inline instrumentation, latter writes to bytes sharing the same origin slots take precedence. Signed-off-by: Alexander Potapenko Fixes: f80be4571b19 ("kmsan: add KMSAN runtime core") Acked-by: Marco Elver --- mm/kmsan/core.c | 127 ++++++++++++------------------------------------ 1 file changed, 31 insertions(+), 96 deletions(-) diff --git a/mm/kmsan/core.c b/mm/kmsan/core.c index 3adb4c1d3b193..c19f47af04241 100644 --- a/mm/kmsan/core.c +++ b/mm/kmsan/core.c @@ -83,131 +83,66 @@ depot_stack_handle_t kmsan_save_stack_with_flags(gfp_t flags, /* Copy the metadata following the memmove() behavior. */ void kmsan_internal_memmove_metadata(void *dst, void *src, size_t n) { + depot_stack_handle_t prev_old_origin = 0, prev_new_origin = 0; + int i, iter, step, src_off, dst_off, oiter_src, oiter_dst; depot_stack_handle_t old_origin = 0, new_origin = 0; - int src_slots, dst_slots, i, iter, step, skip_bits; depot_stack_handle_t *origin_src, *origin_dst; - void *shadow_src, *shadow_dst; - u32 *align_shadow_src, shadow; + u8 *shadow_src, *shadow_dst; + u32 *align_shadow_dst; bool backwards; shadow_dst = kmsan_get_metadata(dst, KMSAN_META_SHADOW); if (!shadow_dst) return; KMSAN_WARN_ON(!kmsan_metadata_is_contiguous(dst, n)); + align_shadow_dst = + (u32 *)ALIGN_DOWN((u64)shadow_dst, KMSAN_ORIGIN_SIZE); shadow_src = kmsan_get_metadata(src, KMSAN_META_SHADOW); if (!shadow_src) { - /* - * @src is untracked: zero out destination shadow, ignore the - * origins, we're done. - */ - __memset(shadow_dst, 0, n); + /* @src is untracked: mark @dst as initialized. */ + kmsan_internal_unpoison_memory(dst, n, /*checked*/ false); return; } KMSAN_WARN_ON(!kmsan_metadata_is_contiguous(src, n)); - __memmove(shadow_dst, shadow_src, n); - origin_dst = kmsan_get_metadata(dst, KMSAN_META_ORIGIN); origin_src = kmsan_get_metadata(src, KMSAN_META_ORIGIN); KMSAN_WARN_ON(!origin_dst || !origin_src); - src_slots = (ALIGN((u64)src + n, KMSAN_ORIGIN_SIZE) - - ALIGN_DOWN((u64)src, KMSAN_ORIGIN_SIZE)) / - KMSAN_ORIGIN_SIZE; - dst_slots = (ALIGN((u64)dst + n, KMSAN_ORIGIN_SIZE) - - ALIGN_DOWN((u64)dst, KMSAN_ORIGIN_SIZE)) / - KMSAN_ORIGIN_SIZE; - KMSAN_WARN_ON((src_slots < 1) || (dst_slots < 1)); - KMSAN_WARN_ON((src_slots - dst_slots > 1) || - (dst_slots - src_slots < -1)); backwards = dst > src; - i = backwards ? min(src_slots, dst_slots) - 1 : 0; - iter = backwards ? -1 : 1; - - align_shadow_src = - (u32 *)ALIGN_DOWN((u64)shadow_src, KMSAN_ORIGIN_SIZE); - for (step = 0; step < min(src_slots, dst_slots); step++, i += iter) { - KMSAN_WARN_ON(i < 0); - shadow = align_shadow_src[i]; - if (i == 0) { - /* - * If @src isn't aligned on KMSAN_ORIGIN_SIZE, don't - * look at the first @src % KMSAN_ORIGIN_SIZE bytes - * of the first shadow slot. - */ - skip_bits = ((u64)src % KMSAN_ORIGIN_SIZE) * 8; - shadow = (shadow >> skip_bits) << skip_bits; + step = backwards ? -1 : 1; + iter = backwards ? n - 1 : 0; + src_off = (u64)src % KMSAN_ORIGIN_SIZE; + dst_off = (u64)dst % KMSAN_ORIGIN_SIZE; + + /* Copy shadow bytes one by one, updating the origins if necessary. */ + for (i = 0; i < n; i++, iter += step) { + oiter_src = (iter + src_off) / KMSAN_ORIGIN_SIZE; + oiter_dst = (iter + dst_off) / KMSAN_ORIGIN_SIZE; + if (!shadow_src[iter]) { + shadow_dst[iter] = 0; + if (!align_shadow_dst[oiter_dst]) + origin_dst[oiter_dst] = 0; + continue; } - if (i == src_slots - 1) { - /* - * If @src + n isn't aligned on - * KMSAN_ORIGIN_SIZE, don't look at the last - * (@src + n) % KMSAN_ORIGIN_SIZE bytes of the - * last shadow slot. - */ - skip_bits = (((u64)src + n) % KMSAN_ORIGIN_SIZE) * 8; - shadow = (shadow << skip_bits) >> skip_bits; - } - /* - * Overwrite the origin only if the corresponding - * shadow is nonempty. - */ - if (origin_src[i] && (origin_src[i] != old_origin) && shadow) { - old_origin = origin_src[i]; - new_origin = kmsan_internal_chain_origin(old_origin); + shadow_dst[iter] = shadow_src[iter]; + old_origin = origin_src[oiter_src]; + if (old_origin == prev_old_origin) + new_origin = prev_new_origin; + else { /* * kmsan_internal_chain_origin() may return * NULL, but we don't want to lose the previous * origin value. */ + new_origin = kmsan_internal_chain_origin(old_origin); if (!new_origin) new_origin = old_origin; } - if (shadow) - origin_dst[i] = new_origin; - else - origin_dst[i] = 0; - } - /* - * If dst_slots is greater than src_slots (i.e. - * dst_slots == src_slots + 1), there is an extra origin slot at the - * beginning or end of the destination buffer, for which we take the - * origin from the previous slot. - * This is only done if the part of the source shadow corresponding to - * slot is non-zero. - * - * E.g. if we copy 8 aligned bytes that are marked as uninitialized - * and have origins o111 and o222, to an unaligned buffer with offset 1, - * these two origins are copied to three origin slots, so one of then - * needs to be duplicated, depending on the copy direction (@backwards) - * - * src shadow: |uuuu|uuuu|....| - * src origin: |o111|o222|....| - * - * backwards = 0: - * dst shadow: |.uuu|uuuu|u...| - * dst origin: |....|o111|o222| - fill the empty slot with o111 - * backwards = 1: - * dst shadow: |.uuu|uuuu|u...| - * dst origin: |o111|o222|....| - fill the empty slot with o222 - */ - if (src_slots < dst_slots) { - if (backwards) { - shadow = align_shadow_src[src_slots - 1]; - skip_bits = (((u64)dst + n) % KMSAN_ORIGIN_SIZE) * 8; - shadow = (shadow << skip_bits) >> skip_bits; - if (shadow) - /* src_slots > 0, therefore dst_slots is at least 2 */ - origin_dst[dst_slots - 1] = - origin_dst[dst_slots - 2]; - } else { - shadow = align_shadow_src[0]; - skip_bits = ((u64)dst % KMSAN_ORIGIN_SIZE) * 8; - shadow = (shadow >> skip_bits) << skip_bits; - if (shadow) - origin_dst[0] = origin_dst[1]; - } + origin_dst[oiter_dst] = new_origin; + prev_new_origin = new_origin; + prev_old_origin = old_origin; } } 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)); \ From patchwork Mon Sep 11 14:57:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Potapenko X-Patchwork-Id: 13379415 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 214FEEE57DF for ; Mon, 11 Sep 2023 14:57:22 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9F6686B02AD; Mon, 11 Sep 2023 10:57:21 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 97FC36B02AE; Mon, 11 Sep 2023 10:57:21 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 820C66B02AF; Mon, 11 Sep 2023 10:57:21 -0400 (EDT) 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 6A6C06B02AD for ; Mon, 11 Sep 2023 10:57:21 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 3CD1F1A0A24 for ; Mon, 11 Sep 2023 14:57:21 +0000 (UTC) X-FDA: 81224619882.09.72F9BC2 Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) by imf12.hostedemail.com (Postfix) with ESMTP id 8334F4001F for ; Mon, 11 Sep 2023 14:57:19 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=NmUvxcoX; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf12.hostedemail.com: domain of 3zir_ZAYKCE8x2zuv8x55x2v.t532z4BE-331Crt1.58x@flex--glider.bounces.google.com designates 209.85.128.201 as permitted sender) smtp.mailfrom=3zir_ZAYKCE8x2zuv8x55x2v.t532z4BE-331Crt1.58x@flex--glider.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1694444239; 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=35Wzlz8R5vpRX3Qc5T9eOyq5a0RR6jvjL1w5jIKVlmg=; b=6kyAb6de9pyZ0d9uPiuUxHkarNe6x3ZzkQ+ES07cbsVwn8VlAh49H95SmY5JrHfMKm1wZM pNvXbfbXmxMnf55rm+Djt3KVSQQDWcxWWJ/J/2HT1aoxIVGsL6dEbnY51mckVs1u9ytjug CDUZPqoPPFaxOHejGlYb7hbyUHQpOM4= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=NmUvxcoX; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf12.hostedemail.com: domain of 3zir_ZAYKCE8x2zuv8x55x2v.t532z4BE-331Crt1.58x@flex--glider.bounces.google.com designates 209.85.128.201 as permitted sender) smtp.mailfrom=3zir_ZAYKCE8x2zuv8x55x2v.t532z4BE-331Crt1.58x@flex--glider.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1694444239; a=rsa-sha256; cv=none; b=AFOU8t8Q878uCEXjue59V8hrQukAChTVuMj6vgaLV1tNyN/B+Ag4JFLx338Abf/sHQbRTj PlztkdRNW+X+5fa8FRVZ22I06lbN9paXXliyJf2yNTseHSyqpm7xm/Q2SS8/wGBIxGC02a xrOSlOkrwfsf8rYHyX+IrWppEHej9yk= Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-59204757627so46675487b3.1 for ; Mon, 11 Sep 2023 07:57:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1694444238; x=1695049038; 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=35Wzlz8R5vpRX3Qc5T9eOyq5a0RR6jvjL1w5jIKVlmg=; b=NmUvxcoXfGtbSte144IX2O5sWwjj7Bq2oLezOiMxr848rX11h60CZ9heftn7hTo7dt UtVXHPNFW6W+YZ209k98a0JHWEyNYkH16beAsZL6aPAjPxQ6bBbXl5qu9C7QiKfMg0Kn C1e9EFp3FXjuptYalz+GsEM3EcRKYc+Tta+qAvhjDecdwPhWdZn+S/wD0Qpf8BkZcaup oZGNFGnnVgXyf+vIFAup/nIkfFGu1TVO40EzZ9F1YhK7RCWTnDxQwJ0aRHeQQviK6OEf H1fjL3ftFo29U7G/Q7Y3vT+vaRcsCeuXspSb76SR4oIjw4uxdfrpTGqM4g7RDCvZky+K wm6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694444238; x=1695049038; 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=35Wzlz8R5vpRX3Qc5T9eOyq5a0RR6jvjL1w5jIKVlmg=; b=uq2bXFnH2nE5WMA3ieLukZB0yqjWV6+3fNi4l0TYZypnuR3d0nvqYGM/oD1pSzmB2n rfMO4nFaBWqh6+tbldI2SEyKvBW6oLLmNCLcBphrrQyS7Flgv3lV2207HmLysRjEC/y4 HxnnVpZYh/K4SMSishL0m2lTH9clhaO4tTtNa5lVrynxaXFqTsoKXCEb5nzTZbx0w8wX qcMPVJJCmyHYu+cK7+7VYQzAcY+M4cwRQMxG/il3ePl+kDiV9mYPJ3Mw4+oxA9PjbV9c YLXN7j+NEO1Grh8OOF+w59q2C8ydbL1wlQOzoVRaRe1QDQ0NoDNCWJrJiiEsukD1mcVw imeQ== X-Gm-Message-State: AOJu0YzC7betAf9kPQhyyiPSLGYfGxoxBpxk6ymXNikHg0zeVZOQVpxC EPYBY3nTqg33Lh5eqAotMigf+ZXsZWI= X-Google-Smtp-Source: AGHT+IFbDjXsFCpFPMP4O6untSuU2SDiFHSQUeHMJpN9MUJc//PbV795sAl5SlWWtJvTh2d0prjfDsssd4U= X-Received: from glider.muc.corp.google.com ([2a00:79e0:9c:201:62e7:6658:cb4:b858]) (user=glider job=sendgmr) by 2002:a81:7647:0:b0:57a:e0b:f66 with SMTP id j7-20020a817647000000b0057a0e0b0f66mr249145ywk.7.1694444238744; Mon, 11 Sep 2023 07:57:18 -0700 (PDT) Date: Mon, 11 Sep 2023 16:57:01 +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-3-glider@google.com> Subject: [PATCH v2 3/4] kmsan: merge test_memcpy_aligned_to_unaligned{,2}() together 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-Server: rspam09 X-Rspamd-Queue-Id: 8334F4001F X-Stat-Signature: nowsgabkrc77ofmm9xj4b3az51bcwrc7 X-Rspam-User: X-HE-Tag: 1694444239-338242 X-HE-Meta: U2FsdGVkX18lzwmvRgIs+J+B1Rjoow9ZkFYF1VfTceHt6NfMgtuodkcL3L7lEA9o0gwM53f3C2B7d0nayjBmabEgw5ZSGN16Vyxqu3FQATMG/MyKzYVXDtEAfKabht3KUbhgvetR67/iymX1iSpjsG6Zyc1X7MwI95+Jczi1aMyTT6lNKSRdAIIUJn+7ZVS299bOqy1EoXmP+TqkWJ4vxms9tclU65Q5yy4dL1KEpbeo/oe3nla09A+7jfihpKO42oZC/3rsgfpa84Jz9h+9ekRA0WHLwFuxCVWDcA0raXgu9a5nPV8V/yqhTWkH44wXR6akF7tHvX+spaJqpnjgyPrRcnlTL7aMLR5T23HUPsAxcyWKEoA3Qnz3AcmfEckftXenPzwb0QaqLRryCFrttc930NM5bKYyA8zql9GYIWFS6F6exYr4pvpkKyoTjwbdQOWOu5wduxZSUTofnzI4ZANzaKMKa6AtovmUiiW/rP1msonUnIGeQ+BaTkjRhrO2TXjoa87X8sXZ+ZirfubPO1gwxfVithi4FiszwDvz8FBt+dNImcZz2Ik27sf5DQ1zKu01qSgZD/C+ozLP2fstkhNNUDtz+co4Eaxf10/74LbaFsgalIdf8PqbcaLQ2APxXAzYHHBRqlj7IDIJ6IQQI8feSR0hb4r7cr8RoiFczEj0P2g/Uj5G4dMC73XxfTPJFe56HVdaPEeeK+qsH4wBZiJ+W0/ZlmpzNBFu5Tvo9vmEUnO1nYT8AsvqIP+kyoMMAok0VUoUW+SrjE0w1SBi3LhIGfzE0FI3ZhUjelCv2tEIfl2Sx5oofgwWfFbEKioy9AhBSFIK0dHGrEnAHxgveawt6uUx9QSBI/PCnCEmvsMblkTibCqGFDlWAaHydELJMRQAVqYNap5KNPOSOyVnKWMPj+xI9AKSny5epUX03SSAhhuKizaq/KS4UiQh6dNlSU9YSEP2aPVWFo7dHUx t5gJ0KrC Kop8LTsKjp0Rgt7WxsjRMtkXlgmpV/8SOGOXsPxZVR+fJEPZqQXB7uoAGW/QgHBobzrOGj0yTes8LDkLA0GsMCNcMS1YcilJitxyQ5tHzkOz1RBHuIvuZqjYZc7iUj407Ujbpc092DQPldYI5vp8kb6Zx2kIbiJ7P1cOT9KS4pZp1e9w/CqEDl/kqhAZl+F4IDQiFQzuzpYAvfZY8pN9v43QUTjgjSCLILM0oNzC6tGC7umj6VkSx22UA0MJTDQwHhgLWjJ+FLBhV2GQgwnl0aYI0cfZYo8S6WuuXk8QyvvU99QJMCWuNIuniKR/e/n8a1484pl0LgF3NuiTeTWpVnvnD3HnKLshG87jWyUBelggdlPIyFx+I5D+nSErbK1SiYZbXYrh+CtX34y5Tu7I1PrqnrBHB/QmFUGKHsNa7JMBuPBpiXSNhXg+8FkvlUS+3cCYgZCuKc9jchmHdsocVBIJozhRfMMDQew3iIUcrTSpyrVCa2gvywsTEeySh28/cXj+MeHA3rIusAP5wIy5i3ehb4ZVTR9IjqfqE1jMcMIoitFWnqIRqwR90BPe1ASNtSEfmUYwNIV0tuE0I7+2DwfeEtMy0Vng6z4dFRVmql1bLDt6oWlXCgBtxcT3XjdmAxsB71Ev/mhG7a4cMZ8k4pZD85w== 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: Introduce report_reset() that allows checking for more than one KMSAN report per testcase. Fold test_memcpy_aligned_to_unaligned2() into test_memcpy_aligned_to_unaligned(), so that they share the setup phase and check the behavior of a single memcpy() call. Signed-off-by: Alexander Potapenko Acked-by: Marco Elver --- mm/kmsan/kmsan_test.c | 37 +++++++++++++------------------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/mm/kmsan/kmsan_test.c b/mm/kmsan/kmsan_test.c index a8d4ca4a1066d..6eb1e1a4d08f9 100644 --- a/mm/kmsan/kmsan_test.c +++ b/mm/kmsan/kmsan_test.c @@ -67,6 +67,17 @@ static bool report_available(void) return READ_ONCE(observed.available); } +/* Reset observed.available, so that the test can trigger another report. */ +static void report_reset(void) +{ + unsigned long flags; + + spin_lock_irqsave(&observed.lock, flags); + WRITE_ONCE(observed.available, false); + observed.ignore = false; + spin_unlock_irqrestore(&observed.lock, flags); +} + /* Information we expect in a report. */ struct expect_report { const char *error_type; /* Error type. */ @@ -454,7 +465,7 @@ static void test_memcpy_aligned_to_aligned(struct kunit *test) * * Copying aligned 4-byte value to an unaligned one leads to touching two * aligned 4-byte values. This test case checks that KMSAN correctly reports an - * error on the first of the two values. + * error on the mentioned two values. */ static void test_memcpy_aligned_to_unaligned(struct kunit *test) { @@ -470,28 +481,7 @@ static void test_memcpy_aligned_to_unaligned(struct kunit *test) sizeof(uninit_src)); kmsan_check_memory((void *)dst, 4); KUNIT_EXPECT_TRUE(test, report_matches(&expect)); -} - -/* - * Test case: ensure that memcpy() correctly copies uninitialized values between - * aligned `src` and unaligned `dst`. - * - * Copying aligned 4-byte value to an unaligned one leads to touching two - * aligned 4-byte values. This test case checks that KMSAN correctly reports an - * error on the second of the two values. - */ -static void test_memcpy_aligned_to_unaligned2(struct kunit *test) -{ - EXPECTATION_UNINIT_VALUE_FN(expect, - "test_memcpy_aligned_to_unaligned2"); - volatile int uninit_src; - volatile char dst[8] = { 0 }; - - kunit_info( - test, - "memcpy()ing aligned uninit src to unaligned dst - part 2 (UMR report)\n"); - memcpy_noinline((void *)&dst[1], (void *)&uninit_src, - sizeof(uninit_src)); + report_reset(); kmsan_check_memory((void *)&dst[4], sizeof(uninit_src)); KUNIT_EXPECT_TRUE(test, report_matches(&expect)); } @@ -589,7 +579,6 @@ static struct kunit_case kmsan_test_cases[] = { 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), KUNIT_CASE(test_memset16), KUNIT_CASE(test_memset32), KUNIT_CASE(test_memset64), From patchwork Mon Sep 11 14:57:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Potapenko X-Patchwork-Id: 13379416 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 1CD4FEE57DF for ; Mon, 11 Sep 2023 14:57:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A6BE86B02AF; Mon, 11 Sep 2023 10:57:25 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9F4C36B02B0; Mon, 11 Sep 2023 10:57:25 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 870166B02B1; Mon, 11 Sep 2023 10:57:25 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 6BB216B02AF for ; Mon, 11 Sep 2023 10:57:25 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 38BCEC0B0A for ; Mon, 11 Sep 2023 14:57:25 +0000 (UTC) X-FDA: 81224620050.05.FBCA4AE Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf16.hostedemail.com (Postfix) with ESMTP id 652E818001E for ; Mon, 11 Sep 2023 14:57:23 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=2nXMqh0x; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf16.hostedemail.com: domain of 30ir_ZAYKCFM163yzC19916z.x97638FI-775Gvx5.9C1@flex--glider.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=30ir_ZAYKCFM163yzC19916z.x97638FI-775Gvx5.9C1@flex--glider.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1694444243; 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=J1LA3n6XS+9W5aKwW+ISlF8R6L/zQAaDfcEugGZs2mo=; b=hPVfoanFacwdlegIY3FpWj5IALgVB+3W46jA3cKMDE93fTi2AxrMIhLqbJ2fJv0dqoIzs1 zOxXZ/mulkkDNkyT5gvD7xytTteb+20SXWiEwla8F25OePa3xR/7IOkTQOYiRhns8OhrQC R/xh085ilOHMpLJ/90oHE2gJGXcr2rw= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=2nXMqh0x; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf16.hostedemail.com: domain of 30ir_ZAYKCFM163yzC19916z.x97638FI-775Gvx5.9C1@flex--glider.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=30ir_ZAYKCFM163yzC19916z.x97638FI-775Gvx5.9C1@flex--glider.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1694444243; a=rsa-sha256; cv=none; b=yf7GoR26aaFTpdboxNfUQPm5JlmfbD1IIGx/VTSjeMb0UEsYsj6IWW1mvmsqcHAvcTsh4U mdtcBdeX7DbswKDVHrbLXAkIdrhNKvH8GrdN9Wuu7K5XcaiNjFdGvfl4a48oA+ZWJiLyHA CXeD2SBq3Q9qJwHwHXFw8smtzpciG6M= Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-58fc7afa4beso53086217b3.2 for ; Mon, 11 Sep 2023 07:57:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1694444242; x=1695049042; 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=J1LA3n6XS+9W5aKwW+ISlF8R6L/zQAaDfcEugGZs2mo=; b=2nXMqh0xDCCLzkPr3vNLt+TJlnjC24mUyvDx8FlHZI9nfxU/sURHeSWCM45sIpXjWB 10KKpBtIwHqt6CejE9fqsKvMs1cBLZz8QKVgPcJc/6X2fTG8ImxnKIetUL8wf/xSWwbg HGG0WuLDtVm9UM4C3dfIrPg17doFF0AaQTVQNjtx/6eG3qnoG8KenTVQzQEm9ZifEqgK fs7lZqliSLpyv6Qv1/yWR5PJahSNqvftJK6CBXDsEHXIPL+Vc+b4St41w8wRKIEBZqDX MC3U0NOZlEq4SxJcHSaP7EAMNbX3+MULPtNXGkMtwGtLgudXcWPFypmByA4QyAeEit0c lO8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694444242; x=1695049042; 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=J1LA3n6XS+9W5aKwW+ISlF8R6L/zQAaDfcEugGZs2mo=; b=NlCrlRvAdHSBbt+gjIkKH3g5U5nRgV3OF1ZmUIqAwOzWRtiNQs8cGFgYwC4JFaxcqL navFj58azfsELDVY9RvxxB2x+XuL0cukPJfiCCmdPPsShT8Zz1K8hKfOTpyHZjITYyYa mENM1eLriIwIlUWBxe/0t0cdJ3kdyJQVMRrZcWHDDchxJmcA0aD6Mp/8RB5360qN0Ghg 7xCYp6aPi2CYshuG0rXb49avLP83qjxqNXXfTLjd5873Jbd/yhgyixHpY+PcImD2CAB0 hR1c4hUhfEWu0srSjIUnYH4KhT1cHU0gu1jhK4ucUEmMZSCxvOUe+R8Bgnv5oKP7Pjk6 kVbw== X-Gm-Message-State: AOJu0YyE5LfJiJA6+H58I6IvC6Y1zIeossjG+PId5ANyy8AExE+pnP7T rfWZUtoeZVTTcz++ECvmKvrilmVLx7k= X-Google-Smtp-Source: AGHT+IGgYo8cMxj1/e+FbOJOJcBQoXTfy8dYxQu7bb+1wqifAQTypCZx7AnQFhZSOBc5IXdfMrMY5NChrpE= X-Received: from glider.muc.corp.google.com ([2a00:79e0:9c:201:62e7:6658:cb4:b858]) (user=glider job=sendgmr) by 2002:a05:6902:68e:b0:d7e:add7:4de6 with SMTP id i14-20020a056902068e00b00d7eadd74de6mr237093ybt.4.1694444242566; Mon, 11 Sep 2023 07:57:22 -0700 (PDT) Date: Mon, 11 Sep 2023 16:57:02 +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-4-glider@google.com> Subject: [PATCH v2 4/4] kmsan: introduce test_memcpy_initialized_gap() 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: 652E818001E X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: usb7umbh9xdo5z7o651srwm9fi4ksrbx X-HE-Tag: 1694444243-102286 X-HE-Meta: U2FsdGVkX18zSYTu6lEyryrmu42SxpQLXDCSfxry5Z8S5pKy/QewehmaIc2RFKStqbesQjuvB9GbMCOZy5iDiWHM64MMeTFxiXyTVQLsVCF9xMQGgLaB9z8TGJ2GIs7rS69OXGU1/F0YIuhUcjrNz5AF49wK8HcHIe23nqywcgic5yZEo0kf2IF07oR4tv7wCYbRNmDmTK3O8Or7Yyfl4EU5kpmcwFXCLWthpkHWtM9SWSF4GyZx6hLsElSczg8kpHCXdivxs31lnF1Zpgpk7Mu2SjiKBRx6S6sjzP8juzQIsSytAw0+ga8PEgcE5YlF6XLUiP65ZLDSO8zIIG9RsAdk8N6nDyXb8DvtvnobhaGuJh4TdLvAGIzFv2/aCSawSPsP0C1OROtteFhnQg2Qp4BvIfNKTuonfrIwU3OCQw6Aoy1cLUyL+oZLUM9k+QfsXz1AvwWoLZOqPTNTRsoUh8w2fl9w26srcjJb018xjXcsasORehzz5TPM5xNfihj6iWmc9nKAyk19A1jqI+Gss3fI4rm373TBsiBFVjwHmAGISewM+RAhwPFn5yGJg73MozB4ItXGkQAB5Hrd6OSlfVTGb/JBVQBg+7KwNsd2ucjcQ6IhPxPKZ0bLfUhGbCCdEmTdmgrzfoyyQRJx4rOFbukilAhyVJAo8eeydhVUMUNgDSOvNYMK2pCCfQ7TaT79UmG3dJi/diRiE5hO/q9Sjd8xWBNY6wfbwjBygrlbrU8gpcNxOUBhcxeOFrNCsueDFcGzEqCvUSnJpBUtY0XABiLquS6kGBhdnTN+HWe7MKxVcT2lNWFTdPeKerNcO0jeJsFKaVLutrZb24MqIccjOA+AYBM6hV/lRCLT1ZshdjTVXUyndaQ6oW+CFkvAvurss0cfNlnALdDk0MC7E2y3i8+xSomjwz6DN4yByq7h4hrbzEuvP0EAvAoiEZxAyTecS8yZZ8LCtN3klNarj9s TMwMIcF5 Rp4iT40QeBdmB3sL4hd97tVoMa2Yk5FJb3x/HL6fy6WuVq/w2SoFPuOW3vcIHC2dD7HjN4EjTOJ4pWABR6Do+W4fK0NpvFYVN51Psm2R2bvfZMJVbZCZcsi5rWgA20+pBxQfsZliTQDsWV2zZPmEk0O4IhIOqEbSjsqQxa3T2XZVVAeB4RMK3Y1Ku4RLtfdCytN66q9UC0May90kN2jxDl9ZbvlYH6osWozgRQltr2j0JTNalHq5Hqcp2FMxn3w1BVsTSh4a7LuXWawPlNzHzqYqB/PIE6M9gE33eH6uQAb9AB+8qnbNnOHytbC/E3IM/U4f4+02QVUOgdFK3yCLFNsv9bJCSxe1+ERf8Sns1WL+eeSpbAQltMnpdZ5JtLjFfidZhlPXHVBBd2sW0oNosgaE/45MLmZZwnklupSNTFziLF/xlcd4Glx1bnZhrHBDoV39PjNkMm/OJV6+8mpvRxfPQBa0W0E8abQnUfpvHNPyIgfhJGAb3ybvCh4kQpCZ2zEJ16XpwCjm8+fQcwsOXxnPPdjm4SPH/X1nQZrPPgUKzlPn48DEJCj/HfxXuj/RA3f0LHCLYMyAFL/7mz9malC//OVvwZVuksiQBK2HFh/TRJJTX3+eq+Z4a1YksdESN4R3o5I0EbSLcbiYI9rqtjiSQWu9+kC5JYTFlhKzGX81cxBA= 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: Add a regression test for the special case where memcpy() previously failed to correctly set the origins: if upon memcpy() four aligned initialized bytes with a zero origin value ended up split between two aligned four-byte chunks, one of those chunks could've received the zero origin value even despite it contained uninitialized bytes from other writes. Signed-off-by: Alexander Potapenko Suggested-by: Marco Elver Acked-by: Marco Elver --- mm/kmsan/kmsan_test.c | 53 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/mm/kmsan/kmsan_test.c b/mm/kmsan/kmsan_test.c index 6eb1e1a4d08f9..07d3a3a5a9c52 100644 --- a/mm/kmsan/kmsan_test.c +++ b/mm/kmsan/kmsan_test.c @@ -486,6 +486,58 @@ static void test_memcpy_aligned_to_unaligned(struct kunit *test) KUNIT_EXPECT_TRUE(test, report_matches(&expect)); } +/* + * Test case: ensure that origin slots do not accidentally get overwritten with + * zeroes during memcpy(). + * + * Previously, when copying memory from an aligned buffer to an unaligned one, + * if there were zero origins corresponding to zero shadow values in the source + * buffer, they could have ended up being copied to nonzero shadow values in the + * destination buffer: + * + * memcpy(0xffff888080a00000, 0xffff888080900002, 8) + * + * src (0xffff888080900002): ..xx .... xx.. + * src origins: o111 0000 o222 + * dst (0xffff888080a00000): xx.. ..xx + * dst origins: o111 0000 + * (or 0000 o222) + * + * (here . stands for an initialized byte, and x for an uninitialized one. + * + * Ensure that this does not happen anymore, and for both destination bytes + * the origin is nonzero (i.e. KMSAN reports an error). + */ +static void test_memcpy_initialized_gap(struct kunit *test) +{ + EXPECTATION_UNINIT_VALUE_FN(expect, "test_memcpy_initialized_gap"); + volatile char uninit_src[12]; + volatile char dst[8] = { 0 }; + + kunit_info( + test, + "unaligned 4-byte initialized value gets a nonzero origin after memcpy() - (2 UMR reports)\n"); + + uninit_src[0] = 42; + uninit_src[1] = 42; + uninit_src[4] = 42; + uninit_src[5] = 42; + uninit_src[6] = 42; + uninit_src[7] = 42; + uninit_src[10] = 42; + uninit_src[11] = 42; + memcpy_noinline((void *)&dst[0], (void *)&uninit_src[2], 8); + + kmsan_check_memory((void *)&dst[0], 4); + KUNIT_EXPECT_TRUE(test, report_matches(&expect)); + report_reset(); + kmsan_check_memory((void *)&dst[2], 4); + KUNIT_EXPECT_FALSE(test, report_matches(&expect)); + report_reset(); + kmsan_check_memory((void *)&dst[4], 4); + KUNIT_EXPECT_TRUE(test, report_matches(&expect)); +} + /* Generate test cases for memset16(), memset32(), memset64(). */ #define DEFINE_TEST_MEMSETXX(size) \ static void test_memset##size(struct kunit *test) \ @@ -579,6 +631,7 @@ static struct kunit_case kmsan_test_cases[] = { KUNIT_CASE(test_init_memcpy), KUNIT_CASE(test_memcpy_aligned_to_aligned), KUNIT_CASE(test_memcpy_aligned_to_unaligned), + KUNIT_CASE(test_memcpy_initialized_gap), KUNIT_CASE(test_memset16), KUNIT_CASE(test_memset32), KUNIT_CASE(test_memset64),