Skip to content

Commit 9a14070

Browse files
soleengregkh
authored andcommitted
kho: init new_physxa->phys_bits to fix lockdep
commit 63b17b6 upstream. 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: fc33e4b ("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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 11b6e25 commit 9a14070

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

kernel/kexec_handover.c

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,14 +144,34 @@ static int __kho_preserve_order(struct kho_mem_track *track, unsigned long pfn,
144144
unsigned int order)
145145
{
146146
struct kho_mem_phys_bits *bits;
147-
struct kho_mem_phys *physxa;
147+
struct kho_mem_phys *physxa, *new_physxa;
148148
const unsigned long pfn_high = pfn >> order;
149149

150150
might_sleep();
151151

152-
physxa = xa_load_or_alloc(&track->orders, order, sizeof(*physxa));
153-
if (IS_ERR(physxa))
154-
return PTR_ERR(physxa);
152+
physxa = xa_load(&track->orders, order);
153+
if (!physxa) {
154+
int err;
155+
156+
new_physxa = kzalloc(sizeof(*physxa), GFP_KERNEL);
157+
if (!new_physxa)
158+
return -ENOMEM;
159+
160+
xa_init(&new_physxa->phys_bits);
161+
physxa = xa_cmpxchg(&track->orders, order, NULL, new_physxa,
162+
GFP_KERNEL);
163+
164+
err = xa_err(physxa);
165+
if (err || physxa) {
166+
xa_destroy(&new_physxa->phys_bits);
167+
kfree(new_physxa);
168+
169+
if (err)
170+
return err;
171+
} else {
172+
physxa = new_physxa;
173+
}
174+
}
155175

156176
bits = xa_load_or_alloc(&physxa->phys_bits, pfn_high / PRESERVE_BITS,
157177
sizeof(*bits));

0 commit comments

Comments
 (0)