From patchwork Wed Jan 24 16:42:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Potapenko X-Patchwork-Id: 13529403 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 31310C46CD2 for ; Wed, 24 Jan 2024 16:42:29 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A05356B007D; Wed, 24 Jan 2024 11:42:28 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 9B4E36B007E; Wed, 24 Jan 2024 11:42:28 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 82F966B0080; Wed, 24 Jan 2024 11:42:28 -0500 (EST) 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 6C75B6B007D for ; Wed, 24 Jan 2024 11:42:28 -0500 (EST) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 37A941403AC for ; Wed, 24 Jan 2024 16:42:28 +0000 (UTC) X-FDA: 81714772776.25.02A7608 Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) by imf14.hostedemail.com (Postfix) with ESMTP id 7169A10001B for ; Wed, 24 Jan 2024 16:42:25 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=mpsVS3L2; spf=pass (imf14.hostedemail.com: domain of 38D2xZQYKCGUJOLGHUJRRJOH.FRPOLQXa-PPNYDFN.RUJ@flex--glider.bounces.google.com designates 209.85.128.201 as permitted sender) smtp.mailfrom=38D2xZQYKCGUJOLGHUJRRJOH.FRPOLQXa-PPNYDFN.RUJ@flex--glider.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1706114545; a=rsa-sha256; cv=none; b=KbLfpl1jbuHr4WCrhT/cu6kZMPLqvcgIcFx0Z61ZhUT7HdK2LxjbJDDbg/1YkYiEp445sq ALfvkQjesAxqBI4bvnkfyWGLXg579CCvxQ4TJj97569rDkfmZYodAU3V6Ghcf0PlrEDx/W Pg+8BxHjSXueq41kDrxWFWOY89YtOY8= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=mpsVS3L2; spf=pass (imf14.hostedemail.com: domain of 38D2xZQYKCGUJOLGHUJRRJOH.FRPOLQXa-PPNYDFN.RUJ@flex--glider.bounces.google.com designates 209.85.128.201 as permitted sender) smtp.mailfrom=38D2xZQYKCGUJOLGHUJRRJOH.FRPOLQXa-PPNYDFN.RUJ@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=1706114545; 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=m7Y5l6OToLybSucRHht2qJXpk8kuciDNbQY5osmgoqQ=; b=Xl8IQ7I7KGXYWACjjGQTKxvLPKY9y1YViwwkD7GYn8q9uT7Di2Iajgz/72ly8cbeLIUmQZ Vd5WWq00kUoYsMTr5PBlAnyN3q/vWSKN9ccvHelwSxz9TtPX8L1Nu+YLoj3uuiSRr7EX8C +qbfKu9IWAJX9in/tNN1pWMDpp+aDWY= Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-5e6f42b1482so88473737b3.3 for ; Wed, 24 Jan 2024 08:42:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1706114544; x=1706719344; darn=kvack.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=m7Y5l6OToLybSucRHht2qJXpk8kuciDNbQY5osmgoqQ=; b=mpsVS3L2+V59CQz6nGHEzz4W7AN7bYOHodcVnjNboZZK9NoS/lDHB+QihDLTCYEN8n EdQlQ47V2gml6sqb/9thgcGn7i+l203V1HctqcmV195gF9vV/+p2MmqtG0DR/1MEi/3/ CwF05VMJpMhyu1QEp5zUw2u0aCTFjVihDQNfdkfWiCEmDGtl/OLlJOIUwj2S6cp4afSt gj4F+OfXAZH0dcR04YellAS7yiw7OWOrk/0o+p0lgCf/v7WHRCCGEd0O3EzFfogZO99X Ev1vmHs2kwYgP/vnBp3/6gFCVhp/Ro/oLakL4GG7bocySmyxjstkG6eqry9p8+J/r+HW u34g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706114544; x=1706719344; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=m7Y5l6OToLybSucRHht2qJXpk8kuciDNbQY5osmgoqQ=; b=PBWCsT/jfMJR+9f5k6iUPLRFSTqBpumLhWr3B7ou1il7vdnL664hN/mjr83qLK0TRP 5UWwq77Btq1ZSVSc76Khil1XtmBhsMHn+jCw41NbFcukpuzZzdTkDnBMfvdw6JhpKG0x 98cD/fq8vpJmppmO9ToQ0TPfk8koGXRsBtvqDzu/m7lpoO0vd+RGdjEu4jMLFjOFP7tK 46fwX4PveOomLJCxY0ZXM2hzzaPf7Ow6OqfKAnmMFRCQCQdVfff5jKUDmhPeyyE7ovzj ZBPRwU3E+ZfLtdTiTc6BSKBZnbviy3Hsuw0vBvfbqZYFDuc92u8xoKG0DOkphxu44h4y 5Dqw== X-Gm-Message-State: AOJu0Yyalorc+rercgcBtrwrz0XKuBD6s2LuX+YUvV7mdC+Eq4GoxJnC 6yJcVRMohKnPS25Is1Ht8tjLZSSCV+IblJFIdhphQGgzhxHZtEKIwNc/rLStCGh2WxYZkOd3ccf sPQ== X-Google-Smtp-Source: AGHT+IE8G4CSoHGmvsFg4U8Twsy6s+ghNL6n63NA7hAkz/CeB7MqCLzFD9amGXbO14msKZhvzjbQmeFXswY= X-Received: from glider.muc.corp.google.com ([2a00:79e0:9c:201:ca56:4222:6893:5055]) (user=glider job=sendgmr) by 2002:a0d:d708:0:b0:5d4:263e:c819 with SMTP id z8-20020a0dd708000000b005d4263ec819mr360803ywd.8.1706114544464; Wed, 24 Jan 2024 08:42:24 -0800 (PST) Date: Wed, 24 Jan 2024 17:42:11 +0100 Mime-Version: 1.0 X-Mailer: git-send-email 2.43.0.429.g432eaa2c6b-goog Message-ID: <20240124164211.1141742-1-glider@google.com> Subject: [PATCH] mm: kmsan: remove runtime checks from kmsan_unpoison_memory() From: Alexander Potapenko To: glider@google.com, akpm@linux-foundation.org Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, kasan-dev@googlegroups.com, Marco Elver , Dmitry Vyukov , Ilya Leoshkevich , Nicholas Miehlbradt X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 7169A10001B X-Stat-Signature: idgqzzet91qgrcbn1bm51mwedua9dk65 X-Rspam-User: X-HE-Tag: 1706114545-481379 X-HE-Meta: U2FsdGVkX1/BRYetRGMpG3wBDMMQO+cwnP6i0iflSwpceuli1RC472/zCndp9qJpqe0EMjRXf07H/XKb9iSn55vmeKTieFWdo1bo+STheiSpXGYoEto+FnOLfzPX5j+PiSsq2PzWcDE9ZvgOEhC5DVaoR3B2d32c60SfZ817BUQ94BkEdUyx4dt+NCimXcDfjCUkb8UJxpbDs5+Qn5x4iYQDeA+8QI9/r0OeoDbTHdFLTVQg6ssWy3b0L5/TBprVGStK8sSsaDrbJdd58EGPZjAe/ZFbvb8cPH6Vb5JrhtLu2ipa3Qvz/G9V8ImD6Dai/qLzxoqwphYnkg7TK7hS2QwL7Q3VnaGuyj+eE28aVNAku0VtZochHI9GJzHdJ2xZG44/qeKQx+Q9zDA0bGUR1RlI/+SyCRJHgo92pNpm6PTIqrzjwdrNo8RTCOnOQJ8+Cx2pZ7obSftVxktJ1GIC1gT+KqXUeDdPim/jk97aVp7dB3wadLd46cxQ9oFq4bnpd0qKZN2x9qsSf+uW5wj/A0WMgbcWnTAams3/DGMT1cpMO/2P6xQVi6b/JkP90jUHGzYSOdnHTASasSlUD21zDbSP2faZjgCsYDoRWoo6FCQJSuPimf+ZCBK7Bk7rpphFmN1KB2Eizr1p81ypRDHr+EHC2BeloXXMfIuS2XAWKSZlbz7wqFmFDWADPkUrtVb8xVv3rEwMhRjkSC6xW6NQuiVP6LA8H76qLjSSZN2DN+MFDOgHLetNPWs1g3zZnpWUTrUn6k9gqeVpbN9bvh4U7ijj3qfHCtDeGSfGRKzxd5YLDHaXD5iHdHQQdCNuD6OHMtH1GDCikKkb8bzojyXk6eOcg+aj+C2TSdoZNqM/pt0SYO1oW7+GxxDVaF7vcc34bXXSKg3kBj6zx18M8/ZmXq4SgVtRppQnDJyLzmGpNFPHC6u+oGUYgllEb8l7nBUEF3UGqI0PKFMOpAMThbZ iHS7Zi8g bEjFQeaHNtQIPwKgQWNyGRVzNIVPDHdVxTWDapzYmcGPB9tNdCEvZLU+lKODcgqohf0XRBb59JeshPt6FZR+0K540vMGYDclaemRcMmpaqju6/ZyaLc7Qrmgr9fZJEeVhDFGIdpkCqPf9mxnwMbbzp8s7V4ZjfvARXY+EiH1NCh235QIqXvUWTJV/E3ZxdWw93UOwoOkl2qGDZfAcOTXcxFsB7bmOU+9pXYnh0HZBNUPS4Mi1u+wgpej7Yj96Dcxve5prDsIskp97iZ3Y7QIuCY58n2AdEID4VG3zUu2kJ2CzFeeoFGjXYGo6hJVMkvHGXxRPYdnAbpDKlCegA1aVA09QOQY9txJ9R8rExO7goqU10oA2WTRBOIVy7Njuf8alMWMrlnibS6EYu32X9p1fAI1CVzj8aA+l+PRO7bNgGZvLO7npaO819cnhOK39kjOknFuZ+ClfaCFfgEUhdBchZq55wI7Hzed9/d1pGVP/g/qjORlIuLuedU4WyPuFkbtkB2JKKjA7FsWsZ7eE7X8x5aSNvha6+n1ma92Yb0Iko3jCY4QIWIUyaA4Yt+eBX5HnRSK8qmGw8UtxJAgpBKEiie5Wf76x/NYvij4Cw7IAGbPYTiTZl8VN95TOVx+i7ZygsjKfrvQ85ZX5agwwYD7z7K9vL8K2/8mO+wOWvEE64Ss+iC0= X-Bogosity: Ham, tests=bogofilter, spamicity=0.001194, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Similarly to what's been done in commit ff444efbbb9be ("kmsan: allow using __msan_instrument_asm_store() inside runtime"), it should be safe to call kmsan_unpoison_memory() from within the runtime, as it does not allocate memory or take locks. Remove the redundant runtime checks. This should fix false positives seen with CONFIG_DEBUG_LIST=y when the non-instrumented lib/stackdepot.c failed to unpoison the memory chunks later checked by the instrumented lib/list_debug.c Also replace the implementation of kmsan_unpoison_entry_regs() with a call to kmsan_unpoison_memory(). Signed-off-by: Alexander Potapenko Cc: Marco Elver Cc: Dmitry Vyukov Cc: Ilya Leoshkevich Cc: Nicholas Miehlbradt Tested-by: Marco Elver --- mm/kmsan/hooks.c | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/mm/kmsan/hooks.c b/mm/kmsan/hooks.c index 5d6e2dee5692a..8a990cbf6d670 100644 --- a/mm/kmsan/hooks.c +++ b/mm/kmsan/hooks.c @@ -359,6 +359,12 @@ void kmsan_handle_dma_sg(struct scatterlist *sg, int nents, } /* Functions from kmsan-checks.h follow. */ + +/* + * To create an origin, kmsan_poison_memory() unwinds the stacks and stores it + * into the stack depot. This may cause deadlocks if done from within KMSAN + * runtime, therefore we bail out if kmsan_in_runtime(). + */ void kmsan_poison_memory(const void *address, size_t size, gfp_t flags) { if (!kmsan_enabled || kmsan_in_runtime()) @@ -371,47 +377,31 @@ void kmsan_poison_memory(const void *address, size_t size, gfp_t flags) } EXPORT_SYMBOL(kmsan_poison_memory); +/* + * Unlike kmsan_poison_memory(), this function can be used from within KMSAN + * runtime, because it does not trigger allocations or call instrumented code. + */ void kmsan_unpoison_memory(const void *address, size_t size) { unsigned long ua_flags; - if (!kmsan_enabled || kmsan_in_runtime()) + if (!kmsan_enabled) return; ua_flags = user_access_save(); - kmsan_enter_runtime(); /* The users may want to poison/unpoison random memory. */ kmsan_internal_unpoison_memory((void *)address, size, KMSAN_POISON_NOCHECK); - kmsan_leave_runtime(); user_access_restore(ua_flags); } EXPORT_SYMBOL(kmsan_unpoison_memory); /* - * Version of kmsan_unpoison_memory() that can be called from within the KMSAN - * runtime. - * - * Non-instrumented IRQ entry functions receive struct pt_regs from assembly - * code. Those regs need to be unpoisoned, otherwise using them will result in - * false positives. - * Using kmsan_unpoison_memory() is not an option in entry code, because the - * return value of in_task() is inconsistent - as a result, certain calls to - * kmsan_unpoison_memory() are ignored. kmsan_unpoison_entry_regs() ensures that - * the registers are unpoisoned even if kmsan_in_runtime() is true in the early - * entry code. + * Version of kmsan_unpoison_memory() called from IRQ entry functions. */ void kmsan_unpoison_entry_regs(const struct pt_regs *regs) { - unsigned long ua_flags; - - if (!kmsan_enabled) - return; - - ua_flags = user_access_save(); - kmsan_internal_unpoison_memory((void *)regs, sizeof(*regs), - KMSAN_POISON_NOCHECK); - user_access_restore(ua_flags); + kmsan_unpoison_memory((void *)regs, sizeof(*regs); } void kmsan_check_memory(const void *addr, size_t size)