]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
kho: remove abort functionality and support state refresh
authorPasha Tatashin <pasha.tatashin@soleen.com>
Fri, 14 Nov 2025 18:59:58 +0000 (13:59 -0500)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 27 Nov 2025 22:24:36 +0000 (14:24 -0800)
Previously, KHO required a dedicated kho_abort() function to clean up
state before kho_finalize() could be called again.  This was necessary to
handle complex unwind paths when using notifiers.

With the shift to direct memory preservation, the explicit abort step is
no longer strictly necessary.

Remove kho_abort() and refactor kho_finalize() to handle re-entry.  If
kho_finalize() is called while KHO is already finalized, it will now
automatically clean up the previous memory map and state before generating
a new one.  This allows the KHO state to be updated/refreshed simply by
triggering finalize again.

Update debugfs to return -EINVAL if userspace attempts to write 0 to the
finalize attribute, as explicit abort is no longer supported.

Link: https://lkml.kernel.org/r/20251114190002.3311679-10-pasha.tatashin@soleen.com
Suggested-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Pratyush Yadav <pratyush@kernel.org>
Cc: Alexander Graf <graf@amazon.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Baoquan He <bhe@redhat.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>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
kernel/liveupdate/kexec_handover.c
kernel/liveupdate/kexec_handover_debugfs.c
kernel/liveupdate/kexec_handover_internal.h

index 63800f63551fed4b2af044a5b16b396b8ecda5ea..624fd648d21f194a2fff0e9c4dc402ab9a053930 100644 (file)
@@ -1232,21 +1232,6 @@ void kho_restore_free(void *mem)
 }
 EXPORT_SYMBOL_GPL(kho_restore_free);
 
-int kho_abort(void)
-{
-       if (!kho_enable)
-               return -EOPNOTSUPP;
-
-       guard(mutex)(&kho_out.lock);
-       if (!kho_out.finalized)
-               return -ENOENT;
-
-       kho_update_memory_map(NULL);
-       kho_out.finalized = false;
-
-       return 0;
-}
-
 static int __kho_finalize(void)
 {
        void *root = kho_out.fdt;
@@ -1297,8 +1282,10 @@ int kho_finalize(void)
                return -EOPNOTSUPP;
 
        guard(mutex)(&kho_out.lock);
-       if (kho_out.finalized)
-               return -EEXIST;
+       if (kho_out.finalized) {
+               kho_update_memory_map(NULL);
+               kho_out.finalized = false;
+       }
 
        ret = __kho_finalize();
        if (ret)
index ac739d25094dd4c2226b48e9ad0f37d4d0ceaee5..2abbf62ba94243e577e0df94ef07b0301dfe1dee 100644 (file)
@@ -87,7 +87,7 @@ static int kho_out_finalize_set(void *data, u64 val)
        if (val)
                return kho_finalize();
        else
-               return kho_abort();
+               return -EINVAL;
 }
 
 DEFINE_DEBUGFS_ATTRIBUTE(kho_out_finalize_fops, kho_out_finalize_get,
index 52ed73659fe6a78f1d398bf186575ad05537e633..0202c85ad14f919ad1649da97fef7ab7a2fce8c7 100644 (file)
@@ -24,7 +24,6 @@ extern unsigned int kho_scratch_cnt;
 
 bool kho_finalized(void);
 int kho_finalize(void);
-int kho_abort(void);
 
 #ifdef CONFIG_KEXEC_HANDOVER_DEBUGFS
 int kho_debugfs_init(void);