]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
kho: fix kho_in_debugfs_init() to handle non-FDT blobs
authorBreno Leitao <leitao@debian.org>
Mon, 16 Mar 2026 11:54:34 +0000 (04:54 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 18 Apr 2026 07:10:48 +0000 (00:10 -0700)
kho_in_debugfs_init() calls fdt_totalsize() to determine blob sizes, which
assumes all blobs are FDTs.  This breaks for non-FDT blobs like struct
kho_kexec_metadata.

Fix this by reading the "blob-size" property from the FDT (persisted by
kho_add_subtree()) instead of calling fdt_totalsize().  Also rename local
variables from fdt_phys/sub_fdt to blob_phys/blob for consistency with the
non-FDT-specific naming.

Link: https://lore.kernel.org/20260316-kho-v9-4-ed6dcd951988@debian.org
Signed-off-by: Breno Leitao <leitao@debian.org>
Reviewed-by: Pratyush Yadav <pratyush@kernel.org>
Cc: Alexander Graf <graf@amazon.com>
Cc: David Hildenbrand <david@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport (Microsoft) <rppt@kernel.org>
Cc: Pasha Tatashin <pasha.tatashin@soleen.com>
Cc: SeongJae Park <sj@kernel.org>
Cc: Shuah Khan <skhan@linuxfoundation.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
kernel/liveupdate/kexec_handover_debugfs.c

index b416846810d785e741584a208772527bc4e6a5fa..257ee8a52be6652ac21d915c73f53841e25398e9 100644 (file)
@@ -122,24 +122,34 @@ __init void kho_in_debugfs_init(struct kho_debugfs *dbg, const void *fdt)
        fdt_for_each_subnode(child, fdt, 0) {
                int len = 0;
                const char *name = fdt_get_name(fdt, child, NULL);
-               const u64 *fdt_phys;
-               void *sub_fdt;
+               const u64 *blob_phys;
+               const u64 *blob_size;
+               void *blob;
 
-               fdt_phys = fdt_getprop(fdt, child,
+               blob_phys = fdt_getprop(fdt, child,
                                        KHO_SUB_TREE_PROP_NAME, &len);
-               if (!fdt_phys)
+               if (!blob_phys)
                        continue;
-               if (len != sizeof(*fdt_phys)) {
-                       pr_warn("node %s prop fdt has invalid length: %d\n",
-                               name, len);
+               if (len != sizeof(*blob_phys)) {
+                       pr_warn("node %s prop %s has invalid length: %d\n",
+                               name, KHO_SUB_TREE_PROP_NAME, len);
                        continue;
                }
-               sub_fdt = phys_to_virt(*fdt_phys);
+
+               blob_size = fdt_getprop(fdt, child,
+                                       KHO_SUB_TREE_SIZE_PROP_NAME, &len);
+               if (!blob_size || len != sizeof(*blob_size)) {
+                       pr_warn("node %s missing or invalid %s property\n",
+                               name, KHO_SUB_TREE_SIZE_PROP_NAME);
+                       continue;
+               }
+
+               blob = phys_to_virt(*blob_phys);
                err = __kho_debugfs_blob_add(&dbg->fdt_list, sub_fdt_dir, name,
-                                            sub_fdt, fdt_totalsize(sub_fdt));
+                                            blob, *blob_size);
                if (err) {
-                       pr_warn("failed to add fdt %s to debugfs: %pe\n", name,
-                               ERR_PTR(err));
+                       pr_warn("failed to add blob %s to debugfs: %pe\n",
+                               name, ERR_PTR(err));
                        continue;
                }
        }