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 2E5FEC83F22 for ; Thu, 17 Jul 2025 14:27:46 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6D3136B0095; Thu, 17 Jul 2025 10:27:45 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6AA166B0096; Thu, 17 Jul 2025 10:27:45 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 598FC6B0098; Thu, 17 Jul 2025 10:27:45 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 43E7C6B0095 for ; Thu, 17 Jul 2025 10:27:45 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id E88E81DA93B for ; Thu, 17 Jul 2025 14:27:44 +0000 (UTC) X-FDA: 83673985248.11.E404AFC Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) by imf05.hostedemail.com (Postfix) with ESMTP id 1189B100007 for ; Thu, 17 Jul 2025 14:27:42 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=euZtCiYu; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf05.hostedemail.com: domain of snovitoll@gmail.com designates 209.85.167.41 as permitted sender) smtp.mailfrom=snovitoll@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752762463; a=rsa-sha256; cv=none; b=XLyJgmf5gOdShdYRMsl//BywX0x1C3FffnBpg0anTCyzVdMDZGU4gdKmQAOGuqH6Z/6DS8 B1kBSqakDJZVaTtd49ql8deJWsetkHDD5yahFVZhEomOGKi8MJz5bntk4sLYh2b/T6l334 zji6mnCVZ405hLot+LYMu1n8pWbtqUU= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=euZtCiYu; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf05.hostedemail.com: domain of snovitoll@gmail.com designates 209.85.167.41 as permitted sender) smtp.mailfrom=snovitoll@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752762463; 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:references:dkim-signature; bh=S1+MAZvM+N/4+avawJ7fodWecsPBgKeK+9BQEGE2Ung=; b=UQ0DDG1V7L3Lvt4Onq4h4PqvQ88p1Xlogb+yTViBA0NV649JSVLQUEU0AKFUIrZiWdO/7l sY226Ep62rIzp3pyMVZS/LoZrTr33jVdpQwRNRxEmcIDtF+9aQoJpPX9bu6Ydz/Frv1lDG s4Pwx4y1ZvdVSIaTroNJgm4LBB1Smac= Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-55a2604ebc1so1000055e87.0 for ; Thu, 17 Jul 2025 07:27:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752762461; x=1753367261; darn=kvack.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=S1+MAZvM+N/4+avawJ7fodWecsPBgKeK+9BQEGE2Ung=; b=euZtCiYus4BoGdLY/lgRCs3CiCidAlxLwejieqZ0h9ymMppAynkFUZDy/VW6K62Q2E BzF/0y7cFywNC+aDqBoahqZl3zBT3XWTei2QgqMnDYAekQRWGjraTe2k7Q4G2K/Vk+Dj VpIeOg/wbZFAXAF0PeVmzNwUue/Z+lMO7vLxdy+OJTggnirZlga3UajIXgvie99zZRFx Wx7hZOmjQvsaQxjScQkgpFweauiWtS8pAsp8HeFnZd7unDvXWbngjjkvbx9j3WTtADPP HzzHQMEQKPrf+cxm3TA9VbRNFoRtRvBPUiOUiietRyvDf7LKqUNubl899sHmYtc6v5df 62Ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752762461; x=1753367261; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=S1+MAZvM+N/4+avawJ7fodWecsPBgKeK+9BQEGE2Ung=; b=smTKbnZpGT5u6W5FFMyJhTR2/0qdpqkhKvLSjOtswLDCeYWi8Ljn0XSB8v7T6xoCuu DFXjHUXMRB5I42QUvmB1ylrZaMZPV/zP/j1/FT0UGs17E3XJb0hrBSJgVgKOte8GXiGO JCWUyFyUSHdjkULuj6Nm5fb88h0EPuENFxLw5+K2GJ13wBgQPXIsYSBUfPLM3yraTP8V yN+TRtmVgjkQ4fT1BLVgqjukSJs42XNP+P5JWHZg9bKj827A0lv6T2sXjyvxIlsSuees 1WbYu7UENRzjDOkefTWhlhpFsO7FgILPXOuWpJv6cxw8G24oeuxudfj24n5pSni/wrAx Jx1g== X-Forwarded-Encrypted: i=1; AJvYcCWfvP2/evSZBV8lmvRIIvDmQvmscSiW+D+tHD3l76NiX77YVSV2QgqxZpmMZpLw3KHjpN3E0PcaqA==@kvack.org X-Gm-Message-State: AOJu0Yxa+jij6oe+Kt74/xVu+Lp1kC04vI2dABUl5mtM1r4JOMUnwJyR BWPdbfJY8ZdHooH6xvbVXq5iQMY68uZlA58nYwRG58YlF0VBLKf150M9 X-Gm-Gg: ASbGncuCaNtwo9fo+vz5Vs7YeelnP/HoaYUas+twYJaWuO7nPyj+IsiYmW/zEGQ1yPP inflCI2GMAj8NZxzVlaGMzKKMBupVr/0DP+UqzRTe8dwsFwRfkt2yXkfOABMpIpoXp5uwA7f5px apQpc2Iu9OnEmX2wIH/UwFOUU58lNxDOO/K0SW1ghs6HJ5UhPo1JL49HcZ/Q1REbqDpneLVoZ46 oHZHu4IXf05MD44gwTc3s1HGAixubeVV0Dsu6DnnnwuNNJUVMziYlDNUI9Ic8YLCbwkoT46u81P viE+0HIwNzlxQqzM7u+/pN4UWE9LdZ4K88vytymYX/Scb3PCw5FdTh76ofmaF0UD6BNDbXbklsU 8TwTRYd0qa1UIroK1Tqc0+cRdUuB3H+I3vIy4Vajy1o1tayKb8TG4UbNzx4Mq+pjTDH5v X-Google-Smtp-Source: AGHT+IHqw++1wkJOZK6ynl4Q5tnH7hMmNdvDCLMPwyvX9yJ+k47Bz9P2wFC8+PCgt0lXOF+TLWoP4g== X-Received: by 2002:a05:6512:b17:b0:553:ad81:4de1 with SMTP id 2adb3069b0e04-55a23f2d227mr2243765e87.24.1752762460660; Thu, 17 Jul 2025 07:27:40 -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.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Jul 2025 07:27:39 -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 00/12] kasan: unify kasan_arch_is_ready() and remove arch-specific implementations Date: Thu, 17 Jul 2025 19:27:20 +0500 Message-Id: <20250717142732.292822-1-snovitoll@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: 7upk1tbnkyo53e4z5zciur3z7imacgps X-Rspam-User: X-Rspamd-Queue-Id: 1189B100007 X-Rspamd-Server: rspam02 X-HE-Tag: 1752762462-830641 X-HE-Meta: U2FsdGVkX19rHAbtqRnPK+no1pHJZks5b+S0KG6XQKZjN3k1K0Q1hj+3+SIbvIXGUZPmr2NuK/aX4jbRtS9JF8/E1okKiO98tW2wREuhojazzP8/U4+OiwAiqtnNszq5RjTDtslk8ZdeiYywYQw/gcMoaBNkMI9AWjJ/41SG/jHsC2qq40t+uzdWEbxZMoZoQpY7TjM59ZSjUduim+B08Z3NQS4tCFaDNyoDzDRKyVIVjlTLbKCsAXeMaYJInn7usgXBPnARqHZeeJJHiOKMZ9J7Uh6tSHuQltv1i56NzGwz1GvqfMFZWcCMqspzgi8nnG/deTwSVW81VefCK0VY3v/M7NtqLBMxQL9ByQxd9YEqZyucrUfF/00/XrgUdfoGeDONVpAgQu7jJvdQJvHFg1U1L575jZHOrw8uwVSw7bNBEV0t6Nexu23dmNOTRjFsYS7OluFQiHhDRC+wM1zesYiyhom0FAh96njY9KuwZGmsbLdDBYDyAv1nPf2lLzQUgdIoO2fTLVBgIZ9TGgy4X4Q5d1Ugci+uh0XYmoBGJP6R80xPTWSh6vCOJl9iRFePxWIGMBuCn51Zjfi6oj8clZcY4xY4fqlM6XHlXZ6rOefFTjd11YA+SFYnXbT9+HburKw+Th120qSafJ4HbJh41cGtam6t7p9CdmbcQNVMW/Su6+qdpcp0ZZO/KqWgmi85mBBaIz0kEWzIv2O9DpXldCn2jjLqOH12tQ1SLvzttffExYpzwTO5r/oPjK7tvQ8vr2ZFEHo0SfekBY1M0952I9KyuWTYe3jVbpSBSANi114BNF6iauo6LGVab0dSwPgi5fG3xKTIuH8kWGOmc145OJP1oDqHUnieVBZ74mvE8fg4KAm+lQooleyO6oe4H87fuPxpJSbW0HZ8/V+UiNAOyAZ39kJc0AyMnFHm4+qKnfKJ7T0UIr9wwLbGCchz4CQSkDwgjnUvTMIaAu5aooi /MT0VxUv fWV5KTYWqv3TxQY4hOImFYca7xPYEankrG4bUEtWzOjQ70FJWeI8I+G11dEURmTr1oKdaBOH4p4XOIUmx7Rs7ntR+ooL/RjSee8u3Xi1bKRhosaR3zi7r6+Q30iU0/X3ZjUeyCZEKn/Jle7UA0aVUxjcNzBOQUzVEMbQtaYK940N3HoqD8Bt/dlY1sp+GgbBhK7lUoyzFktthXJQwIrsqdFyKrmNcixZHMskKEbTxieUqT0/DCJA66K8qVjy6PTsFgJXAivNqn5o95BOo6tRIyPDEnUoyaGP64rTxJ6TrFSZN1Lu9QyjuMSOtzYzG1LOK4iFWynes/2MQykUyHh/19dZjib4iNYA4vF0MwSfsTVZR1ImSnE6GwkzGSl6XFuPiI3zp2No60rrjQ9/mjtMfnnT//nhbL0D4W1YHZy1m/8JNk28oXfjW9lDrppQxUFYt1wRLxTwQy6t9wGPbzLgubuj+9qlhQMZGglmxFbTSzIpWrCDJOTIFzDFCflPXO8hCEzfn4iUvk0sIMbkZ0SfORQjxehGXxlrY4YBHO9vmlEi6B8ZCa8bZlsgc+w== 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: This patch series addresses the fragmentation in KASAN initialization across architectures by introducing a unified approach that eliminates duplicate static keys and arch-specific kasan_arch_is_ready() implementations. The core issue is that different architectures have inconsistent approaches to KASAN readiness tracking: - PowerPC, LoongArch, and um arch, each implement own kasan_arch_is_ready() - Only HW_TAGS mode had a unified static key (kasan_flag_enabled) - Generic and SW_TAGS modes relied on arch-specific solutions or always-on behavior This series implements two-level approach: 1. kasan_enabled() - compile-time check for KASAN configuration 2. kasan_shadow_initialized() - runtime check for shadow memory readiness Key improvements: - Unified static key infrastructure across all KASAN modes - Runtime overhead only for architectures that actually need it - Compile-time optimization for arch. with early KASAN initialization - Complete elimination of arch-specific kasan_arch_is_ready() - Consistent interface and reduced code duplication Previous v2 thread: https://lore.kernel.org/all/20250626153147.145312-1-snovitoll@gmail.com/ Changes in v3 (sorry for the 3-week gap): 0. Included in TO, CC only KASAN devs and people who commented in v2. 1. Addressed Andrey Konovalov's feedback: - Kept separate kasan_enabled() and kasan_shadow_initialized() functions - Added proper __wrapper functions with clean separation 2. Addressed Christophe Leroy's performance comments: - CONFIG_ARCH_DEFER_KASAN is only selected by architectures that need it - No static key overhead for architectures that can enable KASAN early - PowerPC 32-bit and book3e get compile-time optimization 3. Addressed Heiko Carstens and Alexander Gordeev s390 comments: - s390 doesn't select ARCH_DEFER_KASAN (no unnecessary static key overhead) - kasan_enable() is a no-op for architectures with early KASAN setup 4. Improved wrapper architecture: - All existing wrapper functions in include/linux/kasan.h now check both kasan_enabled() && kasan_shadow_initialized() - Internal implementation functions focus purely on core functionality - Shadow readiness logic is centralized in headers per Andrey's guidance Architecture-specific changes: - PowerPC radix MMU: selects ARCH_DEFER_KASAN for runtime control - LoongArch: selects ARCH_DEFER_KASAN, removes custom kasan_early_stage - um: selects ARCH_DEFER_KASAN, removes kasan_um_is_ready - Other architectures: get compile-time optimization, no runtime overhead The series maintains full backward compatibility while providing optimal performance for each architecture's needs. Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217049 === Current mainline KUnit status To see if there is any regression, I've tested via compiling a kernel with CONFIG_KASAN_KUNIT_TEST and running QEMU VM. There are failing tests in SW_TAGS and GENERIC modes in arm64: arm64 CONFIG_KASAN_HW_TAGS: # kasan: pass:62 fail:0 skip:13 total:75 # Totals: pass:62 fail:0 skip:13 total:75 ok 1 kasan arm64 CONFIG_KASAN_SW_TAGS=y: # kasan: pass:65 fail:1 skip:9 total:75 # Totals: pass:65 fail:1 skip:9 total:75 not ok 1 kasan # kasan_strings: EXPECTATION FAILED at mm/kasan/kasan_test_c.c:1598 KASAN failure expected in "strscpy(ptr, src + KASAN_GRANULE_SIZE, KASAN_GRANULE_SIZE)", but none occurred arm64 CONFIG_KASAN_GENERIC=y, CONFIG_KASAN_OUTLINE=y: # kasan: pass:61 fail:1 skip:13 total:75 # Totals: pass:61 fail:1 skip:13 total:75 not ok 1 kasan # same failure as above x86_64 CONFIG_KASAN_GENERIC=y: # kasan: pass:58 fail:0 skip:17 total:75 # Totals: pass:58 fail:0 skip:17 total:75 ok 1 kasan === Testing with patches Testing in v3: - Compiled every affected arch with no errors: $ make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \ OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump READELF=llvm-readelf \ HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar HOSTLD=ld.lld \ ARCH=$ARCH $ clang --version ClangBuiltLinux clang version 19.1.4 Target: x86_64-unknown-linux-gnu Thread model: posix - make ARCH=um produces the warning during compiling: MODPOST Module.symvers WARNING: modpost: vmlinux: section mismatch in reference: \ kasan_init+0x43 (section: .ltext) -> \ kasan_init_generic (section: .init.text) AFAIU, it's due to the code in arch/um/kernel/mem.c, where kasan_init() is placed in own section ".kasan_init", which calls kasan_init_generic() which is marked with "__init". - Booting via qemu-system- and running KUnit tests: * arm64 (GENERIC, HW_TAGS, SW_TAGS): no regression, same above results. * x86_64 (GENERIC): no regression, no errors Sabyrzhan Tasbolatov (12): lib/kasan: introduce CONFIG_ARCH_DEFER_KASAN option kasan: unify static kasan_flag_enabled across modes kasan/powerpc: select ARCH_DEFER_KASAN and call kasan_init_generic kasan/arm64: call kasan_init_generic in kasan_init kasan/arm: call kasan_init_generic in kasan_init kasan/xtensa: call kasan_init_generic in kasan_init kasan/loongarch: select ARCH_DEFER_KASAN and call kasan_init_generic kasan/um: select ARCH_DEFER_KASAN and call kasan_init_generic kasan/x86: call kasan_init_generic in kasan_init kasan/s390: call kasan_init_generic in kasan_init kasan/riscv: call kasan_init_generic in kasan_init kasan: add shadow checks to wrappers and rename kasan_arch_is_ready arch/arm/mm/kasan_init.c | 2 +- arch/arm64/mm/kasan_init.c | 4 +-- arch/loongarch/Kconfig | 1 + arch/loongarch/include/asm/kasan.h | 7 ----- arch/loongarch/mm/kasan_init.c | 7 ++--- arch/powerpc/Kconfig | 1 + arch/powerpc/include/asm/kasan.h | 12 -------- arch/powerpc/mm/kasan/init_32.c | 2 +- arch/powerpc/mm/kasan/init_book3e_64.c | 2 +- arch/powerpc/mm/kasan/init_book3s_64.c | 6 +--- arch/riscv/mm/kasan_init.c | 1 + arch/s390/kernel/early.c | 3 +- arch/um/Kconfig | 1 + arch/um/include/asm/kasan.h | 5 --- arch/um/kernel/mem.c | 4 +-- arch/x86/mm/kasan_init_64.c | 2 +- arch/xtensa/mm/kasan_init.c | 2 +- include/linux/kasan-enabled.h | 34 ++++++++++++++++----- include/linux/kasan.h | 42 ++++++++++++++++++++------ lib/Kconfig.kasan | 8 +++++ mm/kasan/common.c | 18 +++++++---- mm/kasan/generic.c | 23 ++++++++------ mm/kasan/hw_tags.c | 9 +----- mm/kasan/kasan.h | 36 ++++++++++++++++------ mm/kasan/shadow.c | 32 +++++--------------- mm/kasan/sw_tags.c | 2 ++ 26 files changed, 146 insertions(+), 120 deletions(-) -- 2.34.1