From nobody Sat Oct 4 22:35:31 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 38CC5242D94 for ; Tue, 12 Aug 2025 12:50:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755003011; cv=none; b=XBMoA26cMsdnliWn4rn1zvQz1fRTRYtldXl0F3LU7Zfmw6JyrHDba4fT3mE+6SgNOILH58k+EAWyBqwgI9RCeGco86biR8PcjQml7YQiwp79FwA8l+5+TBzERShjZHtMxqXx2R/3u2HVHLfcG7W5VRxke6zSKejKCHumwCUkmRw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755003011; c=relaxed/simple; bh=8jk0i++LAnDk3WELsHB9+3LcJrHqFyRw/1w+tpO9zNs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-type; b=PB62b74mcfluVziImtjxbPjFtUt/Lmv1N1Yu7iyaqVjzShffj2ZxV7nNJfOGFG2A41Jstsued3rz0VafKqiwpmFL1JfbZ4OUzJ5p02OEweRiv75Rq06ENIRbeerdVqPp03JBYsoWImSdMS2SVlPdARMJvEJnabVf8pIcYXB6gqo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=WvBDM3Kt; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="WvBDM3Kt" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1755003008; h=from:from: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:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nAFiQLTxZfWIjT2BgzBfUHBH1TsYFyFlhKTQvwrw4NE=; b=WvBDM3KtuHvEbvM5WZMnKJ6JyvajikNA2p05vKxrlf9pJeWT64ydALXnv+1ZH+gJ1mC1dI AWvkH2jpo4uA5VYXilAowvCtw/nlq9EJFR2lAqbUt3TBGWstpOTaJc2K9Y9jCVZ4dtn6aT 5SPpYcbfeBs/4rro+mmTcwYkAsjNQXo= Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-21-pCgxLexbPZWoogFBtgeuVQ-1; Tue, 12 Aug 2025 08:50:01 -0400 X-MC-Unique: pCgxLexbPZWoogFBtgeuVQ-1 X-Mimecast-MFC-AGG-ID: pCgxLexbPZWoogFBtgeuVQ_1755002999 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 937D9195605B; Tue, 12 Aug 2025 12:49:59 +0000 (UTC) Received: from MiWiFi-R3L-srv.redhat.com (unknown [10.72.112.156]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id A119E300146B; Tue, 12 Aug 2025 12:49:52 +0000 (UTC) From: Baoquan He To: linux-mm@kvack.org Cc: ryabinin.a.a@gmail.com, glider@google.com, andreyknvl@gmail.com, dvyukov@google.com, vincenzo.frascino@arm.com, akpm@linux-foundation.org, kasan-dev@googlegroups.com, linux-kernel@vger.kernel.org, kexec@lists.infradead.org, sj@kernel.org, lorenzo.stoakes@oracle.com, elver@google.com, snovitoll@gmail.com, Baoquan He Subject: [PATCH v2 01/12] mm/kasan: add conditional checks in functions to return directly if kasan is disabled Date: Tue, 12 Aug 2025 20:49:30 +0800 Message-ID: <20250812124941.69508-2-bhe@redhat.com> In-Reply-To: <20250812124941.69508-1-bhe@redhat.com> References: <20250812124941.69508-1-bhe@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 Content-Type: text/plain; charset="utf-8" The current code only does the check if kasan is disabled for hw_tags mode. Here add the conditional checks for functional functions of generic mode and sw_tags mode. This is prepared for later adding kernel parameter kasan=3Don|off for all kasan modes. Signed-off-by: Baoquan He --- mm/kasan/generic.c | 20 ++++++++++++++++++-- mm/kasan/init.c | 6 ++++++ mm/kasan/quarantine.c | 3 +++ mm/kasan/report.c | 4 +++- mm/kasan/shadow.c | 23 ++++++++++++++++++++++- mm/kasan/sw_tags.c | 3 +++ 6 files changed, 55 insertions(+), 4 deletions(-) diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c index d54e89f8c3e7..8daea5892754 100644 --- a/mm/kasan/generic.c +++ b/mm/kasan/generic.c @@ -165,6 +165,9 @@ static __always_inline bool check_region_inline(const v= oid *addr, size_t size, bool write, unsigned long ret_ip) { + if (!kasan_enabled()) + return true; + if (!kasan_arch_is_ready()) return true; =20 @@ -203,12 +206,13 @@ bool kasan_byte_accessible(const void *addr) =20 void kasan_cache_shrink(struct kmem_cache *cache) { - kasan_quarantine_remove_cache(cache); + if (kasan_enabled()) + kasan_quarantine_remove_cache(cache); } =20 void kasan_cache_shutdown(struct kmem_cache *cache) { - if (!__kmem_cache_empty(cache)) + if (kasan_enabled() && !__kmem_cache_empty(cache)) kasan_quarantine_remove_cache(cache); } =20 @@ -228,6 +232,9 @@ void __asan_register_globals(void *ptr, ssize_t size) int i; struct kasan_global *globals =3D ptr; =20 + if (!kasan_enabled()) + return; + for (i =3D 0; i < size; i++) register_global(&globals[i]); } @@ -358,6 +365,9 @@ void kasan_cache_create(struct kmem_cache *cache, unsig= ned int *size, unsigned int rem_free_meta_size; unsigned int orig_alloc_meta_offset; =20 + if (!kasan_enabled()) + return; + if (!kasan_requires_meta()) return; =20 @@ -510,6 +520,9 @@ size_t kasan_metadata_size(struct kmem_cache *cache, bo= ol in_object) { struct kasan_cache *info =3D &cache->kasan_info; =20 + if (!kasan_enabled()) + return 0; + if (!kasan_requires_meta()) return 0; =20 @@ -535,6 +548,9 @@ void kasan_record_aux_stack(void *addr) struct kasan_alloc_meta *alloc_meta; void *object; =20 + if (!kasan_enabled()) + return; + if (is_kfence_address(addr) || !slab) return; =20 diff --git a/mm/kasan/init.c b/mm/kasan/init.c index ced6b29fcf76..43d95f329675 100644 --- a/mm/kasan/init.c +++ b/mm/kasan/init.c @@ -449,6 +449,9 @@ void kasan_remove_zero_shadow(void *start, unsigned lon= g size) unsigned long addr, end, next; pgd_t *pgd; =20 + if (!kasan_enabled()) + return; + addr =3D (unsigned long)kasan_mem_to_shadow(start); end =3D addr + (size >> KASAN_SHADOW_SCALE_SHIFT); =20 @@ -484,6 +487,9 @@ int kasan_add_zero_shadow(void *start, unsigned long si= ze) int ret; void *shadow_start, *shadow_end; =20 + if (!kasan_enabled()) + return 0; + shadow_start =3D kasan_mem_to_shadow(start); shadow_end =3D shadow_start + (size >> KASAN_SHADOW_SCALE_SHIFT); =20 diff --git a/mm/kasan/quarantine.c b/mm/kasan/quarantine.c index 6958aa713c67..a6dc2c3d8a15 100644 --- a/mm/kasan/quarantine.c +++ b/mm/kasan/quarantine.c @@ -405,6 +405,9 @@ static int __init kasan_cpu_quarantine_init(void) { int ret =3D 0; =20 + if (!kasan_enabled()) + return 0; + ret =3D cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "mm/kasan:online", kasan_cpu_online, kasan_cpu_offline); if (ret < 0) diff --git a/mm/kasan/report.c b/mm/kasan/report.c index 62c01b4527eb..884357fa74ed 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -576,7 +576,9 @@ bool kasan_report(const void *addr, size_t size, bool i= s_write, unsigned long irq_flags; struct kasan_report_info info; =20 - if (unlikely(report_suppressed_sw()) || unlikely(!report_enabled())) { + if (unlikely(report_suppressed_sw()) || + unlikely(!report_enabled()) || + !kasan_enabled()) { ret =3D false; goto out; } diff --git a/mm/kasan/shadow.c b/mm/kasan/shadow.c index d2c70cd2afb1..637f2d02d2a3 100644 --- a/mm/kasan/shadow.c +++ b/mm/kasan/shadow.c @@ -125,6 +125,9 @@ void kasan_poison(const void *addr, size_t size, u8 val= ue, bool init) { void *shadow_start, *shadow_end; =20 + if (!kasan_enabled()) + return; + if (!kasan_arch_is_ready()) return; =20 @@ -150,6 +153,9 @@ EXPORT_SYMBOL_GPL(kasan_poison); #ifdef CONFIG_KASAN_GENERIC void kasan_poison_last_granule(const void *addr, size_t size) { + if (!kasan_enabled()) + return; + if (!kasan_arch_is_ready()) return; =20 @@ -164,6 +170,8 @@ void kasan_unpoison(const void *addr, size_t size, bool= init) { u8 tag =3D get_tag(addr); =20 + if (!kasan_enabled()) + return; /* * Perform shadow offset calculation based on untagged address, as * some of the callers (e.g. kasan_unpoison_new_object) pass tagged @@ -277,7 +285,8 @@ static int __meminit kasan_mem_notifier(struct notifier= _block *nb, =20 static int __init kasan_memhotplug_init(void) { - hotplug_memory_notifier(kasan_mem_notifier, DEFAULT_CALLBACK_PRI); + if (kasan_enabled()) + hotplug_memory_notifier(kasan_mem_notifier, DEFAULT_CALLBACK_PRI); =20 return 0; } @@ -390,6 +399,9 @@ int kasan_populate_vmalloc(unsigned long addr, unsigned= long size) unsigned long shadow_start, shadow_end; int ret; =20 + if (!kasan_enabled()) + return 0; + if (!kasan_arch_is_ready()) return 0; =20 @@ -560,6 +572,9 @@ void kasan_release_vmalloc(unsigned long start, unsigne= d long end, unsigned long region_start, region_end; unsigned long size; =20 + if (!kasan_enabled()) + return; + if (!kasan_arch_is_ready()) return; =20 @@ -655,6 +670,9 @@ int kasan_alloc_module_shadow(void *addr, size_t size, = gfp_t gfp_mask) size_t shadow_size; unsigned long shadow_start; =20 + if (!kasan_enabled()) + return 0; + shadow_start =3D (unsigned long)kasan_mem_to_shadow(addr); scaled_size =3D (size + KASAN_GRANULE_SIZE - 1) >> KASAN_SHADOW_SCALE_SHIFT; @@ -691,6 +709,9 @@ int kasan_alloc_module_shadow(void *addr, size_t size, = gfp_t gfp_mask) =20 void kasan_free_module_shadow(const struct vm_struct *vm) { + if (!kasan_enabled()) + return; + if (IS_ENABLED(CONFIG_UML)) return; =20 diff --git a/mm/kasan/sw_tags.c b/mm/kasan/sw_tags.c index b9382b5b6a37..01f19bc4a326 100644 --- a/mm/kasan/sw_tags.c +++ b/mm/kasan/sw_tags.c @@ -78,6 +78,9 @@ bool kasan_check_range(const void *addr, size_t size, boo= l write, u8 *shadow_first, *shadow_last, *shadow; void *untagged_addr; =20 + if (!kasan_enabled()) + return true; + if (unlikely(size =3D=3D 0)) return true; =20 --=20 2.41.0