Received: by 2002:a05:6358:489b:b0:bb:da1:e618 with SMTP id x27csp7864729rwn; Wed, 14 Sep 2022 05:47:09 -0700 (PDT) X-Google-Smtp-Source: AA6agR6NM2U4/2XtIw3TTUnE1WKgMv0gwDWgw+cm20PrBp7ECwdEGR99PMe0920WkyTYe8Nrv1sy X-Received: by 2002:a17:906:6a14:b0:774:a998:d9a2 with SMTP id qw20-20020a1709066a1400b00774a998d9a2mr20681165ejc.496.1663159628811; Wed, 14 Sep 2022 05:47:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1663159628; cv=none; d=google.com; s=arc-20160816; b=nnxXBL+As5Y3Z0LrchudsPz3LVPJyLuWO0Qb4a4kujW8iZCEEmgYoS2etGqVNWd/AZ ed6SwkPqh+3H6hmpglRGJfdfGfma9msZVFLV06SZTIUo9TJalk+walnGQKyLz2KvTTNk JvSKWmuvQjZDS60jeWLPJfP55cI+4oRRoPdGRrvAC8EpP+AwxQsaHQ5sZHuKXs+4tr86 0jX9VtgrH5Mf5E52CZ7+aMdUHXIAoiszVnRpiC0+8dkLmnf6ud2GbI/e9kAoWxn43Cqm WSqXCuW14NjVqbUzsylq5YkNWYQ77b/4WJsSovF2i4kLIsU9Gh2qZCp0DMNBaqGr8Hdg fLug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:reply-to:message-id:subject:cc:to:from:date :dkim-signature; bh=5BvhJMkrkPfuADEpjG7EtXP+7RJ2C/gU5N4ATj/PT0g=; b=sdYIiTqX6k+8muqN8siKMPcA/p6dyoNU0gQApPGhZb2GvgoMBzb9H1QN2iCHaY2KyW uFxxlnfR3G8Eoum1c2WS3dHtQiwAY3xdaNOAWGg6aw5lXjepoLb/tbjfYQLgJMCsw1Zl 1TJ1t4ZciknQ+9QTo+ebIEhcK54KiVvPZDJx52FUdu0lHSh6tZvx2YtSgWB4F4ZwPzfu RiWAPbeksSQg+05rxpJnKJZiuafJIv8rGhDc15/S7wB0+z78rRXeUfMCSuIQQ4A0OdCA x/Xr1fEZraFCp1MnIedwbTVCAMxgNUtk227WoLXYHB/SnAFzy/JukfrqdD73hd/aRW/z H8kA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="Qy/Fb2wv"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id xa8-20020a170906fd8800b0072b1964e54esi13096670ejb.1007.2022.09.14.05.46.42; Wed, 14 Sep 2022 05:47:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="Qy/Fb2wv"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230081AbiINMM1 (ORCPT + 99 others); Wed, 14 Sep 2022 08:12:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47248 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229510AbiINMMZ (ORCPT ); Wed, 14 Sep 2022 08:12:25 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5391D30F72; Wed, 14 Sep 2022 05:12:24 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 11A1AB81AA1; Wed, 14 Sep 2022 12:12:23 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A239AC433C1; Wed, 14 Sep 2022 12:12:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1663157541; bh=hjuXbnWXJ+x/tKRxSvQIiKmnjkb9e4J1VOi2HUS1+aU=; h=Date:From:To:Cc:Subject:Reply-To:References:In-Reply-To:From; b=Qy/Fb2wvXLrIG4vNfFCGHghjwjqoe2bQVHqlEMR/Rv1lTN+/aoF2CSko0EGDPJm9u AC25Xz6PAc5EzVJq6EDSAUuIFQ3yJUurSarFqalRcpe3PoPZWKKZB3uTu0NfM3wUo6 dqz3+sP8iTHeO3mmepNP9HhV3HH/zZLunM6r4rbrZxwZ8Jyg0LZT/qGOv7pq0E277F eSwiSeaBktCR+khewocGLN/8285R1c6kciZMYOT1LV2FNMPglxafQFwcPYwq4knxf1 a1MPwdd7WWxnjnVd8RDVUqvSdBMd2ro6an6pCM7RnQPutGEiJ2SvUhQ+A44GArwSz7 1MX20d/uDKeFg== Received: by paulmck-ThinkPad-P17-Gen-1.home (Postfix, from userid 1000) id 1A4025C06AB; Wed, 14 Sep 2022 05:12:19 -0700 (PDT) Date: Wed, 14 Sep 2022 05:12:19 -0700 From: "Paul E. McKenney" To: Marco Elver Cc: Mark Rutland , Dmitry Vyukov , Alexander Potapenko , Boqun Feng , kasan-dev@googlegroups.com, linux-kernel@vger.kernel.org, Nathan Chancellor , Nick Desaulniers , llvm@lists.linux.dev, Josh Poimboeuf , Peter Zijlstra , stable@vger.kernel.org Subject: Re: [PATCH v3 1/2] kcsan: Instrument memcpy/memset/memmove with newer Clang Message-ID: <20220914121219.GA360920@paulmck-ThinkPad-P17-Gen-1> Reply-To: paulmck@kernel.org References: <20220912094541.929856-1-elver@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20220912094541.929856-1-elver@google.com> X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_HI,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Sep 12, 2022 at 11:45:40AM +0200, Marco Elver wrote: > With Clang version 16+, -fsanitize=thread will turn > memcpy/memset/memmove calls in instrumented functions into > __tsan_memcpy/__tsan_memset/__tsan_memmove calls respectively. > > Add these functions to the core KCSAN runtime, so that we (a) catch data > races with mem* functions, and (b) won't run into linker errors with > such newer compilers. > > Cc: stable@vger.kernel.org # v5.10+ > Signed-off-by: Marco Elver Queued and pushed, thank you! Thanx, Paul > --- > v3: > * Truncate sizes larger than MAX_ENCODABLE_SIZE, so we still set up > watchpoints on them. Iterating through MAX_ENCODABLE_SIZE blocks may > result in pathological cases where performance would seriously suffer. > So let's avoid that for now. > * Just use memcpy/memset/memmove instead of __mem*() functions. Many > architectures that already support KCSAN don't define them (mips, > s390), and having both __mem* and mem versions of the functions > provides little benefit elsewhere; and backporting would become more > difficult, too. The compiler should not inline them given all > parameters are non-constants here. > > v2: > * Fix for architectures which do not provide their own > memcpy/memset/memmove and instead use the generic versions in > lib/string. In this case we'll just alias the __tsan_ variants. > --- > kernel/kcsan/core.c | 50 +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 50 insertions(+) > > diff --git a/kernel/kcsan/core.c b/kernel/kcsan/core.c > index fe12dfe254ec..54d077e1a2dc 100644 > --- a/kernel/kcsan/core.c > +++ b/kernel/kcsan/core.c > @@ -14,10 +14,12 @@ > #include > #include > #include > +#include > #include > #include > #include > #include > +#include > #include > > #include "encoding.h" > @@ -1308,3 +1310,51 @@ noinline void __tsan_atomic_signal_fence(int memorder) > } > } > EXPORT_SYMBOL(__tsan_atomic_signal_fence); > + > +#ifdef __HAVE_ARCH_MEMSET > +void *__tsan_memset(void *s, int c, size_t count); > +noinline void *__tsan_memset(void *s, int c, size_t count) > +{ > + /* > + * Instead of not setting up watchpoints where accessed size is greater > + * than MAX_ENCODABLE_SIZE, truncate checked size to MAX_ENCODABLE_SIZE. > + */ > + size_t check_len = min_t(size_t, count, MAX_ENCODABLE_SIZE); > + > + check_access(s, check_len, KCSAN_ACCESS_WRITE, _RET_IP_); > + return memset(s, c, count); > +} > +#else > +void *__tsan_memset(void *s, int c, size_t count) __alias(memset); > +#endif > +EXPORT_SYMBOL(__tsan_memset); > + > +#ifdef __HAVE_ARCH_MEMMOVE > +void *__tsan_memmove(void *dst, const void *src, size_t len); > +noinline void *__tsan_memmove(void *dst, const void *src, size_t len) > +{ > + size_t check_len = min_t(size_t, len, MAX_ENCODABLE_SIZE); > + > + check_access(dst, check_len, KCSAN_ACCESS_WRITE, _RET_IP_); > + check_access(src, check_len, 0, _RET_IP_); > + return memmove(dst, src, len); > +} > +#else > +void *__tsan_memmove(void *dst, const void *src, size_t len) __alias(memmove); > +#endif > +EXPORT_SYMBOL(__tsan_memmove); > + > +#ifdef __HAVE_ARCH_MEMCPY > +void *__tsan_memcpy(void *dst, const void *src, size_t len); > +noinline void *__tsan_memcpy(void *dst, const void *src, size_t len) > +{ > + size_t check_len = min_t(size_t, len, MAX_ENCODABLE_SIZE); > + > + check_access(dst, check_len, KCSAN_ACCESS_WRITE, _RET_IP_); > + check_access(src, check_len, 0, _RET_IP_); > + return memcpy(dst, src, len); > +} > +#else > +void *__tsan_memcpy(void *dst, const void *src, size_t len) __alias(memcpy); > +#endif > +EXPORT_SYMBOL(__tsan_memcpy); > -- > 2.37.2.789.g6183377224-goog >