FAILED: patch "[PATCH] kasan: remove kasan_find_vm_area() to prevent possible" failed to apply to 6.12-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x 6ee9b3d84775944fb8c8a447961cd01274ac671c
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025071347-compel-crate-aeba@gregkh' --subject-prefix 'PATCH 6.12.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 6ee9b3d84775944fb8c8a447961cd01274ac671c Mon Sep 17 00:00:00 2001
From: Yeoreum Yun <[email protected]>
Date: Thu, 3 Jul 2025 19:10:18 +0100
Subject: [PATCH] kasan: remove kasan_find_vm_area() to prevent possible
deadlock
find_vm_area() couldn't be called in atomic_context. If find_vm_area() is called to reports vm area information, kasan can trigger deadlock like:
CPU0 CPU1vmalloc();
alloc_vmap_area();
spin_lock(&vn->busy.lock)
spin_lock_bh(&some_lock);
<interrupt occurs>
<in softirq>
spin_lock(&some_lock);
<access invalid address>
kasan_report();
print_report();
print_address_description();
kasan_find_vm_area();
find_vm_area();
spin_lock(&vn->busy.lock) // deadlock!To prevent possible deadlock while kasan reports, remove kasan_find_vm_area().
mm/kasan/report.c +2 -43
@@ -370,36 +370,6 @@ static inline bool init_task_stack_addr(const void *addr) sizeof(init_thread_union.stack)); } -/* -* This function is invoked with report_lock (a raw_spinlock) held. A -* PREEMPT_RT kernel cannot call find_vm_area() as it will acquire a sleeping -* rt_spinlock. -* -* For !RT kernel, the PROVE_RAW_LOCK_NESTING config option will print a -* lockdep warning for this raw_spinlock -> spinlock dependency. This config -* option is enabled by default to ensure better test coverage to expose this -* kind of RT kernel problem. This lockdep splat, however, can be suppressed -* by using DEFINE_WAIT_OVERRIDE_MAP() if it serves a useful purpose and the -* invalid PREEMPT_RT case has been taken care of. -*/ -static inline struct vm_struct *kasan_find_vm_area (void *addr) -{ - static DEFINE_WAIT_OVERRIDE_MAP(vmalloc_map, LD_WAIT_SLEEP); -struct vm_struct *va; - -if (IS_ENABLED (CONFIG_PREEMPT_RT )) -return NULL ; - -/* -* Suppress lockdep warning and fetch vmalloc area of the -* offending address. -*/ -lock_map_acquire_try (&vmalloc_map); - va =find_vm_area (addr); -lock_map_release (&vmalloc_map); -return va; -} -static void print_address_description (void *addr,u8 tag,struct kasan_report_info *info) {
@@ -429,19 +399,8 @@ static void print_address_description(void *addr, u8 tag, }if (is_vmalloc_addr (addr)) { -struct vm_struct *va =kasan_find_vm_area (addr); - -if (va) { -pr_err ("The buggy address belongs to the virtual mapping at\n" -" [%px, %px) created by:\n" -" %pS\n" , - va->addr, va->addr + va->size, va->caller); -pr_err ("\n" ); - - page =vmalloc_to_page (addr); - }else { -pr_err ("The buggy address %px belongs to a vmalloc virtual mapping\n" , addr); - } +pr_err ("The buggy address %px belongs to a vmalloc virtual mapping\n" , addr); + page =vmalloc_to_page (addr); }if (page) {
PATCH 1/1 kasan: remove kasan_find_vm_area() to prevent possible deadlock
find_vm_area() couldn't be called in atomic_context. If find_vm_area() is called to reports vm area information, kasan can trigger deadlock like:
CPU0 CPU1vmalloc();
alloc_vmap_area();
spin_lock(&vn->busy.lock)
spin_lock_bh(&some_lock);
<interrupt occurs>
<in softirq>
spin_lock(&some_lock);
<access invalid address>
kasan_report();
print_report();
print_address_description();
kasan_find_vm_area();
find_vm_area();
spin_lock(&vn->busy.lock) // deadlock!To prevent possible deadlock while kasan reports, remove kasan_find_vm_area().
--- mm/kasan/report.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-)
mm/kasan/report.c +2 -11
@@ -398,17 +398,8 @@ static void print_address_description(void *addr, u8 tag, }if (is_vmalloc_addr (addr)) { -struct vm_struct *va =find_vm_area (addr); - -if (va) { -pr_err ("The buggy address belongs to the virtual mapping at\n" -" [%px, %px) created by:\n" -" %pS\n" , - va->addr, va->addr + va->size, va->caller); -pr_err ("\n" ); - - page =vmalloc_to_page (addr); - } +pr_err ("The buggy address %px belongs to a vmalloc virtual mapping\n" , addr); + page =vmalloc_to_page (addr); }if (page) {
Signature · 1 line
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}