Received: by 2002:a05:6358:489b:b0:bb:da1:e618 with SMTP id x27csp5023155rwn; Mon, 12 Sep 2022 03:14:03 -0700 (PDT) X-Google-Smtp-Source: AA6agR4cjj0OAOnbYIVsaFwbs3t6WUlj2EEh2I8dCAgLSkoF4tfRmrkBgXL5P/6M5S4B92mZ8Lku X-Received: by 2002:a65:464b:0:b0:42c:b0:9643 with SMTP id k11-20020a65464b000000b0042c00b09643mr23409812pgr.232.1662977642864; Mon, 12 Sep 2022 03:14:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1662977642; cv=none; d=google.com; s=arc-20160816; b=GP4TZBSUDFvoAqJ++KcJlXSZZgeuP3REfqCVA3tVoC2YSiVXiuK/h1zfhhtDDnKrjw zxocXF+e/EwTifdCGaSO1DSk876y2aD06kk8CJE9nD9YiAemjxycndAAvOzTPK8n4PPI Ub54/ABpbrOmNiUXujuL9UKwhP+vmyziKy+UijqUn1L6B5mTr99lgWNAAIImYfPEcMxr VJYWTsljcmdiQLgDDoxMNQuynaKHj8n3M0vRmbIAbhIPDE+SDnVStbRmJ9xuDPQf8OuA ehuKb1IIlCJTHtTvf435Ai9KQ+RFEbdUuzdrGVijMC3WncwV0Fm61cSlRxzBNkpLla/i uhyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:mime-version:date :dkim-signature; bh=jBoH9dZtU8u1abW3Qj3aDrAs7nz5caMLzMPJv+JY2CE=; b=Xz0LZUhrIwwKaD2MQxjNJ7QcuaVtwdT85rWDYMcsbJDUcjRKqJQqadeZRNco+iiREA xBXMFfNvkSUv7HSwN4JJq8rJInzWZ7qcqvB+BXOD/uIq839S8oxjfOPhMQJfRiyZY4pQ xkniSQNhlc2wHiFYk5Cq2kza+k1C8hWaNhPYnQnags09W5DzMotymIRFtxNYETLsM/Ow awAlZTvqM3+We0Ep1FFbkvH98yrVDxm+i8Bm4QttXtWf4q5aP3rvUSI4PJZf7gEvBiHx P4xrY3w9tjZJk+Gk6sroMBy/Er0MwOplnZEU04fLtub033586Zkg8PHbgUj9I/jr6EUh pgPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=MR5DigsB; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n14-20020a170902d2ce00b001729cfb3cb5si9722126plc.610.2022.09.12.03.13.50; Mon, 12 Sep 2022 03:14:02 -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=@google.com header.s=20210112 header.b=MR5DigsB; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229626AbiILJp4 (ORCPT + 99 others); Mon, 12 Sep 2022 05:45:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43022 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229616AbiILJpy (ORCPT ); Mon, 12 Sep 2022 05:45:54 -0400 Received: from mail-ed1-x54a.google.com (mail-ed1-x54a.google.com [IPv6:2a00:1450:4864:20::54a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 864A633438 for ; Mon, 12 Sep 2022 02:45:52 -0700 (PDT) Received: by mail-ed1-x54a.google.com with SMTP id i17-20020a05640242d100b0044f18a5379aso5826724edc.21 for ; Mon, 12 Sep 2022 02:45:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date; bh=jBoH9dZtU8u1abW3Qj3aDrAs7nz5caMLzMPJv+JY2CE=; b=MR5DigsBS0/ITOnUWHz7rgazRDEBSqjosdzYJAXuVO6gDRUXtNg9chMfS+KizD1tgT 9NaYvF1m/6aPRfa8q0xlZJcT7MFNTWJt/SK7OV5dCQEJyRr1taZhhd3hLeVb7dRd+rHb UGUKoKbJFmxiV2W/B6LtSwf4iwULzTbONwflcqTnChdS03U+IxEJ/yFcZ7dVJ7NnN4Gd d1pPqhxUY0oWLOmM1K3C76rAD19FozAhJvuGY7E4b0idk28B42yT/GrEy+1W15xnFWdW 0uwCqdrVJ2BrFjX0Gypno+SDEw850aI/+OeTLYWq/BCXtDetEIgN54LDioLlIM3kfgpT MfYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date; bh=jBoH9dZtU8u1abW3Qj3aDrAs7nz5caMLzMPJv+JY2CE=; b=vQbzpaC6tXg4ZqZVd9pHDr2TMJQm8Ape3uJldZQAwNJtwLI5BJakrtTgsQgXpzPTVA ZqjC0tS9WvL0Hww23OMLL26EcjqZ4EG8sa7KTBbA6CMtRtrOIq83rguSzIsmdkZP1C0W PUz+KgpWk2h5LfnyFWGy0FmSFqwHAxlpPvBFWODtmfT8e8g7fDSRCBQgbHCBytQuJ0DR s/Q9XqXJ+5G6UFpBccw44vaCJu5ZfL1/Z2oXaE1Ucb5mU2zAYw3YAQ1vyG3Aa+wG0sxZ JXcK7nnyBq+aWtTQLaQ107p6kAVeKJADhzMxIw2dARLnw35TfRvipbEn6jTixKRYS/Sz 9bkQ== X-Gm-Message-State: ACgBeo249g/CRR6Mlmn6TqUlGro2YZo4JT6qsWhcxdEPTufxhdepoPIn 83ASPX5jfUxxgXEbFEtOH69+7OWFhQ== X-Received: from elver.muc.corp.google.com ([2a00:79e0:9c:201:f693:9fff:fef4:2449]) (user=elver job=sendgmr) by 2002:a05:6402:5002:b0:444:26fd:d341 with SMTP id p2-20020a056402500200b0044426fdd341mr21825632eda.351.1662975950998; Mon, 12 Sep 2022 02:45:50 -0700 (PDT) Date: Mon, 12 Sep 2022 11:45:40 +0200 Mime-Version: 1.0 X-Mailer: git-send-email 2.37.2.789.g6183377224-goog Message-ID: <20220912094541.929856-1-elver@google.com> Subject: [PATCH v3 1/2] kcsan: Instrument memcpy/memset/memmove with newer Clang From: Marco Elver To: elver@google.com, "Paul E. McKenney" 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 Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE,USER_IN_DEF_DKIM_WL 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 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 --- 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