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>
This commit is contained in:
Breno Leitao 2026-03-16 04:54:34 -07:00 committed by Andrew Morton
parent 85e4139282
commit 062dd306d9

View 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;
}
}