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 AC059C36014 for ; Fri, 4 Apr 2025 13:18:07 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 73A8D280011; Fri, 4 Apr 2025 09:18:05 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6E869280001; Fri, 4 Apr 2025 09:18:05 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5618C280011; Fri, 4 Apr 2025 09:18:05 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 31421280001 for ; Fri, 4 Apr 2025 09:18:05 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id A96AF1201CE for ; Fri, 4 Apr 2025 13:18:06 +0000 (UTC) X-FDA: 83296414572.09.B6F64FA Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.11]) by imf18.hostedemail.com (Postfix) with ESMTP id 729C81C0005 for ; Fri, 4 Apr 2025 13:18:04 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="SF/dxn65"; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf18.hostedemail.com: domain of maciej.wieczor-retman@intel.com designates 198.175.65.11 as permitted sender) smtp.mailfrom=maciej.wieczor-retman@intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1743772684; a=rsa-sha256; cv=none; b=MfB5esml/dZJBYhruNY7CmSmOLUpSRDB95JMahGuKMXOdjxP3kkcOvsmLGaavXgtcDTNgR mQec6Ztugn1KXQ1TzR17urncpftsHC7s7RhnAEPQSDUGMuGBnUM83AZzr+O9jWFv7d2fG5 a5NbAwc924ipFduAKD7kyarG++Jxcgw= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="SF/dxn65"; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf18.hostedemail.com: domain of maciej.wieczor-retman@intel.com designates 198.175.65.11 as permitted sender) smtp.mailfrom=maciej.wieczor-retman@intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1743772684; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=hZzhASaz3Qj/h/GRsL/4I1VLPg+/CfxJsMQCXOGKIVU=; b=7e7wXtyFsleUhGHfqQ3xEtf0Mf6HU4z0DHlRhO2vZZhFs3Kahyj7PZXdL/Eopuzilu6c7K myGAJ13jf/XSppcrbXlZH2Mabhp3iqsIND1/Afg91W7cDnLLFp7V6Q/0j3TjpjKOH8BoLe F6dhFVIztakilI/L07+UhKHnOGUNFiw= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1743772685; x=1775308685; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ZsxDv6qG66vEKuwTwHaEtrjd9tBd4kf+DSHvVgMU/8M=; b=SF/dxn65YYYo0yvQ2KDfjGCUBbNKl8b87uR6ix5EMzG0s/K4DmZxUDVj f6T9lclGvDUxA1v5UR4GQIYWRwXYARcB9hbRh6h23u11fm9ow+tq6SCky zvY7tF2y5LB4ku2D3NnT2Ll28xe5wJdUNMtVlQDCTGUf7+YATJi1m8F28 dc/hBQRdPXjIPf5Qp+onExgceMrEBhonwkIY+9TPG7241Y8unV8XF6i1a LsRLnIdOyUYY5AEfbInsmbTw1cRtMSSNWmcUdDxfyuy9v+KOKbl4Cjw07 MARlHZc+837RyJlXZzoZqxnc21MOOurpIGzxGoZJnqLvkWWYIHG5O3/7V g==; X-CSE-ConnectionGUID: gZpvQPjpQuiBSRY1rdynPw== X-CSE-MsgGUID: qXWOdOOwRa2GQ0wllKvYUQ== X-IronPort-AV: E=McAfee;i="6700,10204,11394"; a="55402064" X-IronPort-AV: E=Sophos;i="6.15,188,1739865600"; d="scan'208";a="55402064" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Apr 2025 06:18:03 -0700 X-CSE-ConnectionGUID: vtMsu7eRSsCTmkinYXKa3w== X-CSE-MsgGUID: mneJnZk0QlShqxm/wu1ARw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.15,188,1739865600"; d="scan'208";a="128157400" Received: from opintica-mobl1 (HELO wieczorr-mobl1.intel.com) ([10.245.245.50]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Apr 2025 06:17:48 -0700 From: Maciej Wieczor-Retman To: hpa@zytor.com, hch@infradead.org, nick.desaulniers+lkml@gmail.com, kuan-ying.lee@canonical.com, masahiroy@kernel.org, samuel.holland@sifive.com, mingo@redhat.com, corbet@lwn.net, ryabinin.a.a@gmail.com, guoweikang.kernel@gmail.com, jpoimboe@kernel.org, ardb@kernel.org, vincenzo.frascino@arm.com, glider@google.com, kirill.shutemov@linux.intel.com, apopple@nvidia.com, samitolvanen@google.com, maciej.wieczor-retman@intel.com, kaleshsingh@google.com, jgross@suse.com, andreyknvl@gmail.com, scott@os.amperecomputing.com, tony.luck@intel.com, dvyukov@google.com, pasha.tatashin@soleen.com, ziy@nvidia.com, broonie@kernel.org, gatlin.newhouse@gmail.com, jackmanb@google.com, wangkefeng.wang@huawei.com, thiago.bauermann@linaro.org, tglx@linutronix.de, kees@kernel.org, akpm@linux-foundation.org, jason.andryuk@amd.com, snovitoll@gmail.com, xin@zytor.com, jan.kiszka@siemens.com, bp@alien8.de, rppt@kernel.org, peterz@infradead.org, pankaj.gupta@amd.com, thuth@redhat.com, andriy.shevchenko@linux.intel.com, joel.granados@kernel.org, kbingham@kernel.org, nicolas@fjasle.eu, mark.rutland@arm.com, surenb@google.com, catalin.marinas@arm.com, morbo@google.com, justinstitt@google.com, ubizjak@gmail.com, jhubbard@nvidia.com, urezki@gmail.com, dave.hansen@linux.intel.com, bhe@redhat.com, luto@kernel.org, baohua@kernel.org, nathan@kernel.org, will@kernel.org, brgerst@gmail.com Cc: llvm@lists.linux.dev, linux-mm@kvack.org, linux-doc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, x86@kernel.org Subject: [PATCH v3 13/14] mm: Unpoison pcpu chunks with base address tag Date: Fri, 4 Apr 2025 15:14:17 +0200 Message-ID: <61033ef5b70277039ceeb8f6173e8b3fbc271c08.1743772053.git.maciej.wieczor-retman@intel.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspam-User: X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: 729C81C0005 X-Stat-Signature: xhg9jikhumkdbjubr4xiftbbatbz1in3 X-HE-Tag: 1743772684-482534 X-HE-Meta: U2FsdGVkX18mFxQgt9nJw8D4ew6ZmIuNVW8eoGz8dC82zsaZcio12SCNjNLY3Vrr78bKkWhjANPwJxH8LzsMC6nQZ3GQnKx6JMwReiclrkGrrlw4mwHdB4eoCDlNZKGukqII8rasWYqfKXbJdeE+N/ca6Zg8rdpJDbq+TBsZGpvxKLhn07HmhytH6UjnPqRRnl/hANNogGMfPg4RucVg+9w8UWzJYuwavUTkbYG8p+bUbEGUULxDD/7yeWV1iAI5C2s47xoG9qJnPFPJkm/aTrZKkrAIBr9aAPpFG8WnTvb1pK5e9eEpkG27H+ZPLWAxYvsHFDnu5Gf9EH1vJ2MZsU+dE9O96wos0vPSfC7av3WxALIFBT5SBxgyRkkaPHSHJGIL9wQXEGJrVWTRqZdBFJaZfNRLOGtSgVtESikgm1u8+eNESFI8vrYNsLL4bpqROndnCZEzmseiY+vZZFGDDMRmVYc53r24k4XkxbobJEuUWHVEXA3uGwNMcRvNsyDmDwViN4EJIO4WATFBksxaV4L3Qi+qPoZ3gNp7R4f2WCuSJiqnikBSy7pof6nhksRtX4RKDodiEEeNBe0rciXbbFv577jDtHDK0hgmPRgTzjtgNnxlj7O7pwodS/4mz0VWlpvLCpkVOOdqPzroHcMwhKjlgRrkHHaUeYP39jimezoW/kG3G30X8wbIALcJhcxKF2Aqurd0HWWY9efQDQ++DeTkdpfjTeCxxibxA8Uqm1OPw+70Zai5SWncNnKV+RbIrQOmMvbYvRgsgPfji76qfqdfTCXt19QswPD6HmGqAOrNrx8b9fQ7jcUytfT8e0n4w8ryhem0x2B2bu0YgNnW7402rM1hQ+W4zNmaxvlMY9m9dTozDmkvM+UUj3icCYsnAGYTAflxj+Ty6gG8jXACvNZoR9hDiGCEWSRO+qxFtU1Il2CV/OOW8/bjREkkHLxFVosq779Ebw+qXSc4yxA SxN0cQJB DYr4JmI76IHwC0wzmxb9LM7yVrLNLniJ6yv3ZSY3YnD4KCUUmdxMRnWS+A5YqBr0jEZW3nxXXjGBaGGEpOr7E7JBNbzHw4W3Ux2nzUHP/KOd+lV9OoQlFCnPYGeIe4sieiA1XmzGv6hCQUPB44HM0sAIZZh2crX6N03H/eHlm0Zw6L88qNyYAV4H9UYNV56uqf0tEq0oxGbNqW8kRXjS2pYfAp+qAibCo5W6mZpvhIv788Xgj+Lcy/WPgyYymmKD/aBePBdM9zD8CslV8p6FPPu7RvVG2qdKRZcNr 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: List-Subscribe: List-Unsubscribe: The problem presented here is related to NUMA systems and tag-based KASAN mode. Getting to it can be explained in the following points: 1. A new chunk is created with pcpu_create_chunk() and vm_structs are allocated. On systems with one NUMA node only one is allocated, but with more NUMA nodes at least a second one will be allocated too. 2. chunk->base_addr is assigned the modified value of vms[0]->addr and thus inherits the tag of this allocated structure. 3. In pcpu_alloc() for each possible cpu pcpu_chunk_addr() is executed which calculates per cpu pointers that correspond to the vms structure addresses. The calculations are based on adding an offset from a table to chunk->base_addr. Here the problem presents itself since for addresses based on vms[1] and up, the tag will be different than the ones based on vms[0] (base_addr). The tag mismatch happens and an error is reported. Unpoison all the vms[]->addr with the same tag to resolve the mismatch. Signed-off-by: Maciej Wieczor-Retman --- Changelog v3: - Remove last version of this patch that just resets the tag on base_addr and add this patch that unpoisons all areas with the same tag instead. include/linux/kasan.h | 10 ++++++++++ mm/kasan/shadow.c | 11 +++++++++++ mm/vmalloc.c | 3 +-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/include/linux/kasan.h b/include/linux/kasan.h index 54481f8c30c5..bd033b2ba383 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -613,6 +613,13 @@ static __always_inline void kasan_poison_vmalloc(const void *start, __kasan_poison_vmalloc(start, size); } +void __kasan_unpoison_vmap_areas(struct vm_struct **vms, int nr_vms); +static __always_inline void kasan_unpoison_vmap_areas(struct vm_struct **vms, int nr_vms) +{ + if (kasan_enabled()) + __kasan_unpoison_vmap_areas(vms, nr_vms); +} + #else /* CONFIG_KASAN_VMALLOC */ static inline void kasan_populate_early_vm_area_shadow(void *start, @@ -637,6 +644,9 @@ static inline void *kasan_unpoison_vmalloc(const void *start, static inline void kasan_poison_vmalloc(const void *start, unsigned long size) { } +static inline void kasan_unpoison_vmap_areas(struct vm_struct **vms, int nr_vms) +{ } + #endif /* CONFIG_KASAN_VMALLOC */ #if (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) && \ diff --git a/mm/kasan/shadow.c b/mm/kasan/shadow.c index 88d1c9dcb507..9496f256bc0f 100644 --- a/mm/kasan/shadow.c +++ b/mm/kasan/shadow.c @@ -582,6 +582,17 @@ void __kasan_poison_vmalloc(const void *start, unsigned long size) kasan_poison(start, size, KASAN_VMALLOC_INVALID, false); } +void __kasan_unpoison_vmap_areas(struct vm_struct **vms, int nr_vms) +{ + int area; + + for (area = 0 ; area < nr_vms ; area++) { + kasan_poison(vms[area]->addr, vms[area]->size, + arch_kasan_get_tag(vms[0]->addr), false); + arch_kasan_set_tag(vms[area]->addr, arch_kasan_get_tag(vms[0]->addr)); + } +} + #else /* CONFIG_KASAN_VMALLOC */ int kasan_alloc_module_shadow(void *addr, size_t size, gfp_t gfp_mask) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 61981ee1c9d2..fbd56bf8aeb2 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -4783,8 +4783,7 @@ struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets, * non-VM_ALLOC mappings, see __kasan_unpoison_vmalloc(). */ for (area = 0; area < nr_vms; area++) - vms[area]->addr = kasan_unpoison_vmalloc(vms[area]->addr, - vms[area]->size, KASAN_VMALLOC_PROT_NORMAL); + kasan_unpoison_vmap_areas(vms, nr_vms); kfree(vas); return vms; -- 2.49.0