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: simplify serialization and remove __kho_abort

Currently, __kho_finalize() performs memory serialization in the middle of
FDT construction. If FDT construction fails later, the function must
manually clean up the serialized memory via __kho_abort().

Refactor __kho_finalize() to perform kho_mem_serialize() only after the
FDT has been successfully constructed and finished. This reordering has
two benefits:
1. It avoids expensive serialization work if FDT generation fails.
2. It removes the need for cleanup in the FDT error path.

As a result, the internal helper __kho_abort() is no longer needed for
internal error handling. Inline its remaining logic (cleanup of the
preserved memory map) directly into kho_abort() and remove the helper.

Link: https://lkml.kernel.org/r/20251114190002.3311679-8-pasha.tatashin@soleen.com
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>

authored by

Pasha Tatashin and committed by
Andrew Morton
71960fe1 e268689a

+17 -24
+17 -24
kernel/liveupdate/kexec_handover.c
··· 1214 1214 } 1215 1215 EXPORT_SYMBOL_GPL(kho_restore_free); 1216 1216 1217 - static void __kho_abort(void) 1218 - { 1219 - if (kho_out.preserved_mem_map) { 1220 - kho_mem_ser_free(kho_out.preserved_mem_map); 1221 - kho_out.preserved_mem_map = NULL; 1222 - } 1223 - } 1224 - 1225 1217 int kho_abort(void) 1226 1218 { 1227 1219 if (!kho_enable) ··· 1223 1231 if (!kho_out.finalized) 1224 1232 return -ENOENT; 1225 1233 1226 - __kho_abort(); 1234 + kho_mem_ser_free(kho_out.preserved_mem_map); 1235 + kho_out.preserved_mem_map = NULL; 1227 1236 kho_out.finalized = false; 1228 1237 1229 1238 return 0; ··· 1232 1239 1233 1240 static int __kho_finalize(void) 1234 1241 { 1235 - int err = 0; 1236 - u64 *preserved_mem_map; 1237 1242 void *root = kho_out.fdt; 1238 1243 struct kho_sub_fdt *fdt; 1244 + u64 *preserved_mem_map; 1245 + int err; 1239 1246 1240 - err |= fdt_create(root, PAGE_SIZE); 1247 + err = fdt_create(root, PAGE_SIZE); 1241 1248 err |= fdt_finish_reservemap(root); 1242 1249 err |= fdt_begin_node(root, ""); 1243 1250 err |= fdt_property_string(root, "compatible", KHO_FDT_COMPATIBLE); ··· 1250 1257 sizeof(*preserved_mem_map), 1251 1258 (void **)&preserved_mem_map); 1252 1259 if (err) 1253 - goto abort; 1254 - 1255 - err = kho_mem_serialize(&kho_out); 1256 - if (err) 1257 - goto abort; 1258 - 1259 - *preserved_mem_map = (u64)virt_to_phys(kho_out.preserved_mem_map); 1260 + goto err_exit; 1260 1261 1261 1262 mutex_lock(&kho_out.fdts_lock); 1262 1263 list_for_each_entry(fdt, &kho_out.sub_fdts, l) { ··· 1264 1277 1265 1278 err |= fdt_end_node(root); 1266 1279 err |= fdt_finish(root); 1280 + if (err) 1281 + goto err_exit; 1267 1282 1268 - abort: 1269 - if (err) { 1270 - pr_err("Failed to convert KHO state tree: %d\n", err); 1271 - __kho_abort(); 1272 - } 1283 + err = kho_mem_serialize(&kho_out); 1284 + if (err) 1285 + goto err_exit; 1273 1286 1287 + *preserved_mem_map = (u64)virt_to_phys(kho_out.preserved_mem_map); 1288 + 1289 + return 0; 1290 + 1291 + err_exit: 1292 + pr_err("Failed to convert KHO state tree: %d\n", err); 1274 1293 return err; 1275 1294 } 1276 1295