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 A5021C83F22 for ; Thu, 17 Jul 2025 14:27:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 43ABB6B0099; Thu, 17 Jul 2025 10:27:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3C5196B009A; Thu, 17 Jul 2025 10:27:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2B34A6B009B; Thu, 17 Jul 2025 10:27:52 -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 1B0276B0099 for ; Thu, 17 Jul 2025 10:27:52 -0400 (EDT) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id B3F6C14077A for ; Thu, 17 Jul 2025 14:27:51 +0000 (UTC) X-FDA: 83673985542.18.37FF6FD Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) by imf24.hostedemail.com (Postfix) with ESMTP id 9E0C3180007 for ; Thu, 17 Jul 2025 14:27:49 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="ghiMeN/x"; spf=pass (imf24.hostedemail.com: domain of snovitoll@gmail.com designates 209.85.167.49 as permitted sender) smtp.mailfrom=snovitoll@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752762469; 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=CtzrgmhXOlDN0Ac+5J9qvgdYRUcauOXxnB1y58JGUsg=; b=2XWgrPjGkr3kVnDqoOZOkOf4pfsj2d7/olIzUNTBP1k5YX47ZNaYZsv+9Te9v5XZCWx4dE Cc8oPC+jOd4uOnLwYZyuQkIn12gSVkYyuyBgo/bATj4yLcayZ8tQ+X64asNC7uOFgIdW5E wXMYfUNiPJuASyDb1O2DYL6Mt53GT9Y= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="ghiMeN/x"; spf=pass (imf24.hostedemail.com: domain of snovitoll@gmail.com designates 209.85.167.49 as permitted sender) smtp.mailfrom=snovitoll@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752762469; a=rsa-sha256; cv=none; b=AmUnPLInbVWKdjc/t9DLyptOK2dQxlDRl/3g9ISSXgIcNZcjsdZJTxYczskH6lJiM6cZ8M D1x5gsn4PeD1CrHs0S/mk9l6YsHONgRV9YveOJWUxcDGjN+VQkwJZ4RPa37E+Zf4VpFlxu vsyJOs3RQERkbxajFNA7v9WDBVSE7wk= Received: by mail-lf1-f49.google.com with SMTP id 2adb3069b0e04-558f7472d64so1841531e87.0 for ; Thu, 17 Jul 2025 07:27:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752762468; x=1753367268; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CtzrgmhXOlDN0Ac+5J9qvgdYRUcauOXxnB1y58JGUsg=; b=ghiMeN/xq1rPluglLOu3kO8OGmd2CvLPm3stU1uJn2nm9ySHg0lIIzpo1KYcVon//o IICF2xrixEz4i8O3K2n2P9alcL7BV9Co7qJuyX21OK7f8FfiC2B//buP+wIaGTC6sWtZ DnqV+FRaIuvI22ic9mIhuNGyr0qVgBNv1IF5HJPVHhEaQmKNTF3mNDCgTT/dZI99E1/1 0uBIVfJ7a1Jt6Syju2wpsJQQShRlTo9yu5R17glHPeBjPwRIEwQEZMezs+fWClIPvV5Z igNwVgnN052BuLFZzzDPIlOEmJ4MmTVmaaRUR56Ue2yUMgKnsQ6FWQNN8fJyj4AXkBs7 aN6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752762468; x=1753367268; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CtzrgmhXOlDN0Ac+5J9qvgdYRUcauOXxnB1y58JGUsg=; b=OxYu8DSCUPO9ZU8Y6AibiFVKE/D+yujV792FOXzCx1nDl3ZGWf63QYIEBFD2dJvBK1 Wc/hu/76K9oHhGdrFsO+u5++OyOyFoYPM511QY0tGSz0231CniC+pmat25k4Uq1ipNro tvvA6XjsyGauFQcfDUGCEDdNDrcdsBjqHu34PvT2rdLbOzBAw+BBJFq8+V5v1kTFwy8G hYJH+aesoB0IlEctkMx8/PBH+AxmiW5mkVPavC/fe0oIBFpcBziimpHGP+r5RrVaVfa6 +Iu2hnXeo4XqQuc2ElMUwI7nmHvkIMWXZmmYdH9p5VeL77LArtORiFLoh2zVepi7DNJF AmLw== X-Forwarded-Encrypted: i=1; AJvYcCWrko2LTrJc/5gPQ+QDZC2Yt+L86vPrk+nLbkvYFDZPpeZxw+HnrxRAb94dMQk8oBe16Gad1Ws47g==@kvack.org X-Gm-Message-State: AOJu0YxyrzPmpoqtp2Nw15rd51Po1zonQ6Uoq/S+Y5e42zD9QkX3W7xZ gTGZD2/5xZqPqi6fYp7VjXcDoxYSvPUUUaSuEnNj7kxUMucBdPgQ4+Os X-Gm-Gg: ASbGnctbg+2Sg8Qjc07+I3Gk/qfPHck4X+hefNRfyVH1HWvMqQt8XB0kYbyeYz5Usvl u1I+t7X+9KWWBqtGyAhbaMnKKC4UukYjtEPXNQRXpJgccitlh43bF9I1KPSgRYL29F6/MdDfVEk ZmX2FFjzobGPlgELAmHIv1LPaDawsm1V/ft7GwoN1x4Wdxwlt0LB0KjLnSVh9J0fLsISY3qN3So pusAxc1kDxsLxNy3cRgQx/xo6h54I3dgCJU/JfbKPIgKvVP16dWSE34IdQXLjsOuwpGym9WOrJ+ avRrSwXPJufKIg08hykwXwZQOTP8glmFfsqBQ9iL2c2aF66/tZHYnNiQrSyYCqv6qC9YL8vP2HS J5+9uEvMq4OxmfjBjUzJq5UC9x57ksCBR82ArT3tmFqiv0rdlq64DoIlDojkqlGD6yav+ X-Google-Smtp-Source: AGHT+IGFU/9g3XHsICupAR2OwO3I+VhsbowqxnMbfcNePQa3z69BAqmHMKuwXCkJ+RRLdmWNcXslSQ== X-Received: by 2002:a05:6512:1254:b0:553:2c01:ff4a with SMTP id 2adb3069b0e04-55a2fdd97dbmr24308e87.3.1752762467575; Thu, 17 Jul 2025 07:27:47 -0700 (PDT) Received: from localhost.localdomain (178.90.89.143.dynamic.telecom.kz. [178.90.89.143]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-55989825fe3sm3022975e87.223.2025.07.17.07.27.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Jul 2025 07:27:46 -0700 (PDT) From: Sabyrzhan Tasbolatov To: hca@linux.ibm.com, christophe.leroy@csgroup.eu, andreyknvl@gmail.com, agordeev@linux.ibm.com, akpm@linux-foundation.org Cc: ryabinin.a.a@gmail.com, glider@google.com, dvyukov@google.com, kasan-dev@googlegroups.com, linux-kernel@vger.kernel.org, loongarch@lists.linux.dev, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, linux-um@lists.infradead.org, linux-mm@kvack.org, snovitoll@gmail.com Subject: [PATCH v3 02/12] kasan: unify static kasan_flag_enabled across modes Date: Thu, 17 Jul 2025 19:27:22 +0500 Message-Id: <20250717142732.292822-3-snovitoll@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250717142732.292822-1-snovitoll@gmail.com> References: <20250717142732.292822-1-snovitoll@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: rxwd66bfrrfyk7zzgpj3tqszcnzsom84 X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 9E0C3180007 X-Rspam-User: X-HE-Tag: 1752762469-175517 X-HE-Meta: U2FsdGVkX185FN9b9epciHeQGwB4XIFKyayruHAWxghxgGclpNxWC3AubEzoMG/erCOphpBG+ygsfnyNzyZwigXIXcmUN/v4dZSLmhGVa9Jbh1w5tZac22YyIM7nq4Owo/4cKkvXL6sWlKsprMqpFc6rtXcv0n8nvN3T72Wvfcd4uTkE3RmV4olUdUVy42kJY6lMcNB0S+dNUFnUmGJUePPOEDRQxZw/DRkskz0MU6OCU5kGk+C1ec2YRaoMXOfSMl81lz4IJNzy0AqmkTfVt6I2TLsa5/vz9FCgHO1HjRbC5PECCZ+bm89MturEnvp+RxKkiVd1XacXs7p6p8syfCXSxk/0B7KT5vwB6yF3bL1c5+FyeJ7PH+EhBuSZ377ZtmUIfuzd52nxAiCplyXMsG8w9Me3VlNUASMEaU8EBTWrxVZCF4fhGAVnOXv+ZNqd/qmhZqBVc7FVxCpmN9kbkJQwmOTNcxjwtuds4QioF6HY6TbjW+l3xWYbNYeZHMILma4JZlH5yjmfDGczAwzkWDicCcMxnuhClQNWr5WCpDSTzeKXTLKgga4TctuqpMRy6/dFEHtRWlLHcb5NVPq9KEEgplFvaVsVR+wbjrPp29YdXY/h4WQv9AY5m0D+DrDnKTQd8tIq/NpJRLppRJNKAPyFzvlQTmnhLvmELcduvGRo6jkSdXYWRX1Rqd6vPMh/LXer9Nt+wfZpWGSGyQ0PxOxwJkstaf2Iir0KUr9MzzNVaBbxTYD1gsN0OHRd237ONv/WEyXUk4H2qxzMhXwMTCGsfKvt3/o0H1FjEB1flM6SiRA/ZmTc9fmok4qCUNJ3z9wb3HWbetl1nvum6WD9SZZTUKo+IMc2e2iV5esBwtysuEzUkUDIyxpSB9fwHMV3JZdPqBj/do+gaBu0my3ZCNe9AI4EbPK2+H7cZH6eTl/JhdZilh+/Oyj0yRVOUTpcZErlG3w8LX1rh0GFcSo sIw0xl5f 62RI5Kiux6PRNNeZX/9/nAPWYuWXOtsywHFmFxrGfaCrapmXzXPeMZmJ3kEwSVZHgnsJ+fpqIv6+irWubqh9lDk9BJvumV9l3fmW29pjCJ8sjE6Ja4X7+DIOt+BTx3JjUmItJRCEb+14io1PUXF2xcpvWC+lxPJW2r0PmPXbiQ9y2cefjo2MkuMs1/TTZZXppvGwjMF0kr1D00yf7pA97eJXq5M4imFZekmh+/wLpklefSqLiBk/L7fiB8rCQ5wGyP4I4Obo2IQel4gBUYGLkd9/QuNsvyp6KCY1D8tMKFga/2RvNstjxWm6/2iD9uJSAOPiQkYfyc/Or7UQ9i8wMHWIr+3Qb7XCsIy0bGd/qfDUgQBn4Wl93ri+SGYoFpLfvi13V8UImMRszB9inmX2yKW38ICBMRLKIGBjlG2jHQBIWIOpmTrnwMjimiogMOo7KXWB4E97b4jFAF/FtAJ/x6kiba1TLnRxRXNRzlgP4DXymo2s6hiVHp9VnX9kIr5y8h6lrkaTdkthpfxFh3hrs9O3ioLSdUoXooSfDfMZRNtZp9M2G3RabRFTFKi2+6TQjtqJ4goiWn78VAbQxjb3ikHrmJw== 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: Historically, the runtime static key kasan_flag_enabled existed only for CONFIG_KASAN_HW_TAGS mode. Generic and SW_TAGS modes either relied on architecture-specific kasan_arch_is_ready() implementations or evaluated KASAN checks unconditionally, leading to code duplication. This patch implements two-level approach: 1. kasan_enabled() - controls if KASAN is enabled at all (compile-time) 2. kasan_shadow_initialized() - tracks shadow memory initialization (runtime) For architectures that select ARCH_DEFER_KASAN: kasan_shadow_initialized() uses a static key that gets enabled when shadow memory is ready. For architectures that don't: kasan_shadow_initialized() returns IS_ENABLED(CONFIG_KASAN) since shadow is ready from the start. This provides: - Consistent interface across all KASAN modes - Runtime control only where actually needed - Compile-time constants for optimal performance where possible - Clear separation between "KASAN configured" vs "shadow ready" Also adds kasan_init_generic() function that enables the shadow flag and handles initialization for Generic mode, and updates SW_TAGS and HW_TAGS to use the unified kasan_shadow_enable() function. Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217049 Signed-off-by: Sabyrzhan Tasbolatov --- Changes in v3: - Only architectures that need deferred KASAN get runtime overhead - Added kasan_shadow_initialized() for shadow memory readiness tracking - kasan_enabled() now provides compile-time check for KASAN configuration --- include/linux/kasan-enabled.h | 34 ++++++++++++++++++++++++++-------- include/linux/kasan.h | 6 ++++++ mm/kasan/common.c | 9 +++++++++ mm/kasan/generic.c | 11 +++++++++++ mm/kasan/hw_tags.c | 9 +-------- mm/kasan/sw_tags.c | 2 ++ 6 files changed, 55 insertions(+), 16 deletions(-) diff --git a/include/linux/kasan-enabled.h b/include/linux/kasan-enabled.h index 6f612d69ea0..fa99dc58f95 100644 --- a/include/linux/kasan-enabled.h +++ b/include/linux/kasan-enabled.h @@ -4,32 +4,50 @@ #include -#ifdef CONFIG_KASAN_HW_TAGS +/* Controls whether KASAN is enabled at all (compile-time check). */ +static __always_inline bool kasan_enabled(void) +{ + return IS_ENABLED(CONFIG_KASAN); +} +#ifdef CONFIG_ARCH_DEFER_KASAN +/* + * Global runtime flag for architectures that need deferred KASAN. + * Switched to 'true' by the appropriate kasan_init_*() + * once KASAN is fully initialized. + */ DECLARE_STATIC_KEY_FALSE(kasan_flag_enabled); -static __always_inline bool kasan_enabled(void) +static __always_inline bool kasan_shadow_initialized(void) { return static_branch_likely(&kasan_flag_enabled); } -static inline bool kasan_hw_tags_enabled(void) +static inline void kasan_enable(void) +{ + static_branch_enable(&kasan_flag_enabled); +} +#else +/* For architectures that can enable KASAN early, use compile-time check. */ +static __always_inline bool kasan_shadow_initialized(void) { return kasan_enabled(); } -#else /* CONFIG_KASAN_HW_TAGS */ +/* No-op for architectures that don't need deferred KASAN. */ +static inline void kasan_enable(void) {} +#endif /* CONFIG_ARCH_DEFER_KASAN */ -static inline bool kasan_enabled(void) +#ifdef CONFIG_KASAN_HW_TAGS +static inline bool kasan_hw_tags_enabled(void) { - return IS_ENABLED(CONFIG_KASAN); + return kasan_enabled(); } - +#else static inline bool kasan_hw_tags_enabled(void) { return false; } - #endif /* CONFIG_KASAN_HW_TAGS */ #endif /* LINUX_KASAN_ENABLED_H */ diff --git a/include/linux/kasan.h b/include/linux/kasan.h index 890011071f2..51a8293d1af 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -543,6 +543,12 @@ void kasan_report_async(void); #endif /* CONFIG_KASAN_HW_TAGS */ +#ifdef CONFIG_KASAN_GENERIC +void __init kasan_init_generic(void); +#else +static inline void kasan_init_generic(void) { } +#endif + #ifdef CONFIG_KASAN_SW_TAGS void __init kasan_init_sw_tags(void); #else diff --git a/mm/kasan/common.c b/mm/kasan/common.c index ed4873e18c7..c3a6446404d 100644 --- a/mm/kasan/common.c +++ b/mm/kasan/common.c @@ -32,6 +32,15 @@ #include "kasan.h" #include "../slab.h" +#ifdef CONFIG_ARCH_DEFER_KASAN +/* + * Definition of the unified static key declared in kasan-enabled.h. + * This provides consistent runtime enable/disable across KASAN modes. + */ +DEFINE_STATIC_KEY_FALSE(kasan_flag_enabled); +EXPORT_SYMBOL(kasan_flag_enabled); +#endif + struct slab *kasan_addr_to_slab(const void *addr) { if (virt_addr_valid(addr)) diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c index d54e89f8c3e..03b6d322ff6 100644 --- a/mm/kasan/generic.c +++ b/mm/kasan/generic.c @@ -36,6 +36,17 @@ #include "kasan.h" #include "../slab.h" +/* + * Initialize Generic KASAN and enable runtime checks. + * This should be called from arch kasan_init() once shadow memory is ready. + */ +void __init kasan_init_generic(void) +{ + kasan_enable(); + + pr_info("KernelAddressSanitizer initialized (generic)\n"); +} + /* * All functions below always inlined so compiler could * perform better optimizations in each of __asan_loadX/__assn_storeX diff --git a/mm/kasan/hw_tags.c b/mm/kasan/hw_tags.c index 9a6927394b5..c8289a3feab 100644 --- a/mm/kasan/hw_tags.c +++ b/mm/kasan/hw_tags.c @@ -45,13 +45,6 @@ static enum kasan_arg kasan_arg __ro_after_init; static enum kasan_arg_mode kasan_arg_mode __ro_after_init; static enum kasan_arg_vmalloc kasan_arg_vmalloc __initdata; -/* - * Whether KASAN is enabled at all. - * The value remains false until KASAN is initialized by kasan_init_hw_tags(). - */ -DEFINE_STATIC_KEY_FALSE(kasan_flag_enabled); -EXPORT_SYMBOL(kasan_flag_enabled); - /* * Whether the selected mode is synchronous, asynchronous, or asymmetric. * Defaults to KASAN_MODE_SYNC. @@ -260,7 +253,7 @@ void __init kasan_init_hw_tags(void) kasan_init_tags(); /* KASAN is now initialized, enable it. */ - static_branch_enable(&kasan_flag_enabled); + kasan_enable(); pr_info("KernelAddressSanitizer initialized (hw-tags, mode=%s, vmalloc=%s, stacktrace=%s)\n", kasan_mode_info(), diff --git a/mm/kasan/sw_tags.c b/mm/kasan/sw_tags.c index b9382b5b6a3..275bcbbf612 100644 --- a/mm/kasan/sw_tags.c +++ b/mm/kasan/sw_tags.c @@ -45,6 +45,8 @@ void __init kasan_init_sw_tags(void) kasan_init_tags(); + kasan_enable(); + pr_info("KernelAddressSanitizer initialized (sw-tags, stacktrace=%s)\n", str_on_off(kasan_stack_collection_enabled())); } -- 2.34.1