Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

kho: fix kho_in_debugfs_init() to handle non-FDT blobs

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>

authored by

Breno Leitao and committed by
Andrew Morton
062dd306 85e41392

+21 -11
+21 -11
kernel/liveupdate/kexec_handover_debugfs.c
··· 122 122 fdt_for_each_subnode(child, fdt, 0) { 123 123 int len = 0; 124 124 const char *name = fdt_get_name(fdt, child, NULL); 125 - const u64 *fdt_phys; 126 - void *sub_fdt; 125 + const u64 *blob_phys; 126 + const u64 *blob_size; 127 + void *blob; 127 128 128 - fdt_phys = fdt_getprop(fdt, child, 129 + blob_phys = fdt_getprop(fdt, child, 129 130 KHO_SUB_TREE_PROP_NAME, &len); 130 - if (!fdt_phys) 131 + if (!blob_phys) 131 132 continue; 132 - if (len != sizeof(*fdt_phys)) { 133 - pr_warn("node %s prop fdt has invalid length: %d\n", 134 - name, len); 133 + if (len != sizeof(*blob_phys)) { 134 + pr_warn("node %s prop %s has invalid length: %d\n", 135 + name, KHO_SUB_TREE_PROP_NAME, len); 135 136 continue; 136 137 } 137 - sub_fdt = phys_to_virt(*fdt_phys); 138 + 139 + blob_size = fdt_getprop(fdt, child, 140 + KHO_SUB_TREE_SIZE_PROP_NAME, &len); 141 + if (!blob_size || len != sizeof(*blob_size)) { 142 + pr_warn("node %s missing or invalid %s property\n", 143 + name, KHO_SUB_TREE_SIZE_PROP_NAME); 144 + continue; 145 + } 146 + 147 + blob = phys_to_virt(*blob_phys); 138 148 err = __kho_debugfs_blob_add(&dbg->fdt_list, sub_fdt_dir, name, 139 - sub_fdt, fdt_totalsize(sub_fdt)); 149 + blob, *blob_size); 140 150 if (err) { 141 - pr_warn("failed to add fdt %s to debugfs: %pe\n", name, 142 - ERR_PTR(err)); 151 + pr_warn("failed to add blob %s to debugfs: %pe\n", 152 + name, ERR_PTR(err)); 143 153 continue; 144 154 } 145 155 }