103 lines
3.3 KiB
Diff
103 lines
3.3 KiB
Diff
From cb937c419cee16eb53a09e3c8cc16b675db0214f Mon Sep 17 00:00:00 2001
|
|
From: Pasha Tatashin <pasha.tatashin@soleen.com>
|
|
Date: Fri, 8 Aug 2025 20:18:02 +0000
|
|
Subject: kho: init new_physxa->phys_bits to fix lockdep
|
|
|
|
Patch series "Several KHO Hotfixes".
|
|
|
|
Three unrelated fixes for Kexec Handover.
|
|
|
|
|
|
This patch (of 3):
|
|
|
|
Lockdep shows the following warning:
|
|
|
|
INFO: trying to register non-static key. The code is fine but needs
|
|
lockdep annotation, or maybe you didn't initialize this object before use?
|
|
turning off the locking correctness validator.
|
|
|
|
[<ffffffff810133a6>] dump_stack_lvl+0x66/0xa0
|
|
[<ffffffff8136012c>] assign_lock_key+0x10c/0x120
|
|
[<ffffffff81358bb4>] register_lock_class+0xf4/0x2f0
|
|
[<ffffffff813597ff>] __lock_acquire+0x7f/0x2c40
|
|
[<ffffffff81360cb0>] ? __pfx_hlock_conflict+0x10/0x10
|
|
[<ffffffff811707be>] ? native_flush_tlb_global+0x8e/0xa0
|
|
[<ffffffff8117096e>] ? __flush_tlb_all+0x4e/0xa0
|
|
[<ffffffff81172fc2>] ? __kernel_map_pages+0x112/0x140
|
|
[<ffffffff813ec327>] ? xa_load_or_alloc+0x67/0xe0
|
|
[<ffffffff81359556>] lock_acquire+0xe6/0x280
|
|
[<ffffffff813ec327>] ? xa_load_or_alloc+0x67/0xe0
|
|
[<ffffffff8100b9e0>] _raw_spin_lock+0x30/0x40
|
|
[<ffffffff813ec327>] ? xa_load_or_alloc+0x67/0xe0
|
|
[<ffffffff813ec327>] xa_load_or_alloc+0x67/0xe0
|
|
[<ffffffff813eb4c0>] kho_preserve_folio+0x90/0x100
|
|
[<ffffffff813ebb7f>] __kho_finalize+0xcf/0x400
|
|
[<ffffffff813ebef4>] kho_finalize+0x34/0x70
|
|
|
|
This is becase xa has its own lock, that is not initialized in
|
|
xa_load_or_alloc.
|
|
|
|
Modifiy __kho_preserve_order(), to properly call
|
|
xa_init(&new_physxa->phys_bits);
|
|
|
|
Link: https://lkml.kernel.org/r/20250808201804.772010-2-pasha.tatashin@soleen.com
|
|
Fixes: fc33e4b44b27 ("kexec: enable KHO support for memory preservation")
|
|
Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
|
|
Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
|
|
Cc: Alexander Graf <graf@amazon.com>
|
|
Cc: Arnd Bergmann <arnd@arndb.de>
|
|
Cc: Baoquan He <bhe@redhat.com>
|
|
Cc: Changyuan Lyu <changyuanl@google.com>
|
|
Cc: Coiby Xu <coxu@redhat.com>
|
|
Cc: Dave Vasilevsky <dave@vasilevsky.ca>
|
|
Cc: Eric Biggers <ebiggers@google.com>
|
|
Cc: Kees Cook <kees@kernel.org>
|
|
Cc: Pratyush Yadav <pratyush@kernel.org>
|
|
Cc: <stable@vger.kernel.org>
|
|
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|
---
|
|
kernel/kexec_handover.c | 28 ++++++++++++++++++++++++----
|
|
1 file changed, 24 insertions(+), 4 deletions(-)
|
|
|
|
--- a/kernel/kexec_handover.c
|
|
+++ b/kernel/kexec_handover.c
|
|
@@ -144,14 +144,34 @@ static int __kho_preserve_order(struct k
|
|
unsigned int order)
|
|
{
|
|
struct kho_mem_phys_bits *bits;
|
|
- struct kho_mem_phys *physxa;
|
|
+ struct kho_mem_phys *physxa, *new_physxa;
|
|
const unsigned long pfn_high = pfn >> order;
|
|
|
|
might_sleep();
|
|
|
|
- physxa = xa_load_or_alloc(&track->orders, order, sizeof(*physxa));
|
|
- if (IS_ERR(physxa))
|
|
- return PTR_ERR(physxa);
|
|
+ physxa = xa_load(&track->orders, order);
|
|
+ if (!physxa) {
|
|
+ int err;
|
|
+
|
|
+ new_physxa = kzalloc(sizeof(*physxa), GFP_KERNEL);
|
|
+ if (!new_physxa)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ xa_init(&new_physxa->phys_bits);
|
|
+ physxa = xa_cmpxchg(&track->orders, order, NULL, new_physxa,
|
|
+ GFP_KERNEL);
|
|
+
|
|
+ err = xa_err(physxa);
|
|
+ if (err || physxa) {
|
|
+ xa_destroy(&new_physxa->phys_bits);
|
|
+ kfree(new_physxa);
|
|
+
|
|
+ if (err)
|
|
+ return err;
|
|
+ } else {
|
|
+ physxa = new_physxa;
|
|
+ }
|
|
+ }
|
|
|
|
bits = xa_load_or_alloc(&physxa->phys_bits, pfn_high / PRESERVE_BITS,
|
|
sizeof(*bits));
|