aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Kardashevskiy <aik@ozlabs.ru>2020-07-16 14:33:08 +1000
committerAlexey Kardashevskiy <aik@ozlabs.ru>2020-07-17 11:05:52 +1000
commit8f21e1eb81f3a777139d09a5a0fcb04eee04d5e7 (patch)
tree529fe9889e97f1894062f62424b1b358e7b64306
parent6184ca06c8d8df9235aef2b5331f9f11b3aff8be (diff)
downloadSLOF-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.fs27
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