diff mbox series

[2/2] mm/kmemleak: move set_track_prepare() outside raw_spinlocks

Message ID 20231115082138.2649870-3-liushixin2@huawei.com (mailing list archive)
State Mainlined
Commit d63385a7d3099fedf201b0263282aebf9f9af3e8
Delegated to: Geert Uytterhoeven
Headers show
Series Fix invalid wait context of set_track_prepare() | expand

Commit Message

Liu Shixin Nov. 15, 2023, 8:21 a.m. UTC
set_track_prepare() will call __alloc_pages() which attempt to acquire
zone->lock(spinlocks), so move it outside object->lock(raw_spinlocks)
because it's not right to acquire spinlocks while holding raw_spinlocks
in RT mode.

Signed-off-by: Liu Shixin <liushixin2@huawei.com>
---
 mm/kmemleak.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Catalin Marinas Nov. 15, 2023, 2:19 p.m. UTC | #1
On Wed, Nov 15, 2023 at 04:21:38PM +0800, Liu Shixin wrote:
> set_track_prepare() will call __alloc_pages() which attempt to acquire
> zone->lock(spinlocks), so move it outside object->lock(raw_spinlocks)
> because it's not right to acquire spinlocks while holding raw_spinlocks
> in RT mode.
> 
> Signed-off-by: Liu Shixin <liushixin2@huawei.com>

Acked-by: Catalin Marinas <catalin.marinas@arm.com>

Thanks for the quick fixes.
diff mbox series

Patch

diff --git a/mm/kmemleak.c b/mm/kmemleak.c
index 22bab3738a9e..5501363d6b31 100644
--- a/mm/kmemleak.c
+++ b/mm/kmemleak.c
@@ -1152,6 +1152,7 @@  EXPORT_SYMBOL_GPL(kmemleak_free_percpu);
 void __ref kmemleak_update_trace(const void *ptr)
 {
 	struct kmemleak_object *object;
+	depot_stack_handle_t trace_handle;
 	unsigned long flags;
 
 	pr_debug("%s(0x%px)\n", __func__, ptr);
@@ -1168,8 +1169,9 @@  void __ref kmemleak_update_trace(const void *ptr)
 		return;
 	}
 
+	trace_handle = set_track_prepare();
 	raw_spin_lock_irqsave(&object->lock, flags);
-	object->trace_handle = set_track_prepare();
+	object->trace_handle = trace_handle;
 	raw_spin_unlock_irqrestore(&object->lock, flags);
 
 	put_object(object);