diff options
author | Alexey Kardashevskiy <aik@ozlabs.ru> | 2020-07-16 14:33:08 +1000 |
---|---|---|
committer | Alexey Kardashevskiy <aik@ozlabs.ru> | 2020-07-17 11:05:52 +1000 |
commit | 8f21e1eb81f3a777139d09a5a0fcb04eee04d5e7 (patch) | |
tree | 529fe9889e97f1894062f62424b1b358e7b64306 | |
parent | 6184ca06c8d8df9235aef2b5331f9f11b3aff8be (diff) | |
download | SLOF-8f21e1eb81f3a777139d09a5a0fcb04eee04d5e7.zip SLOF-8f21e1eb81f3a777139d09a5a0fcb04eee04d5e7.tar.gz SLOF-8f21e1eb81f3a777139d09a5a0fcb04eee04d5e7.tar.bz2 |
fdt: Avoid recursion when traversing tree
A loop over peers does not need recursion which becomes a problem with
hundreds devices.
This was discovered with "-smp 2048,cores=512,threads=4".
Suggested-by: Jordan Niethe <jniethe5@gmail.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
-rw-r--r-- | board-qemu/slof/fdt.fs | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/board-qemu/slof/fdt.fs b/board-qemu/slof/fdt.fs index 7da4ff0..78d2efe 100644 --- a/board-qemu/slof/fdt.fs +++ b/board-qemu/slof/fdt.fs @@ -636,20 +636,23 @@ r> drop THEN ; -: (fdt-cas-search-obsolete-nodes) ( start node -- ) - dup IF - dup child 2 pick swap recurse - dup peer 2 pick swap recurse - - dup fdt-cas-node-obsolete? IF - fdt-debug IF dup ." Deleting obsolete node: " dup .node ." = " . cr THEN - dup delete-node - THEN +: (fdt-cas-search-obsolete-nodes) ( node -- ) + dup child + BEGIN + dup + WHILE + dup recurse + peer + REPEAT + drop + dup fdt-cas-node-obsolete? IF + fdt-debug IF dup ." Deleting obsolete node: " dup .node ." = " . cr THEN + dup delete-node THEN - 2drop + drop ; -: fdt-cas-delete-obsolete-nodes ( start -- ) +: fdt-cas-delete-obsolete-nodes ( -- ) s" /" find-device get-node (fdt-cas-search-obsolete-nodes) fdt-cas-delete-obsolete-aliases ; @@ -657,7 +660,7 @@ r> drop : fdt-fix-cas-node ( start -- ) fdt-generation# 1+ to fdt-generation# 0 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Add phandles - dup fdt-cas-delete-obsolete-nodes \ Delete removed devices + fdt-cas-delete-obsolete-nodes \ Delete removed devices 1 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Patch+add other properties 2 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Delete phandles from pass 0 drop |