[SLOF] [PATCH slof] fdt: Avoid recursion when traversing tree

Alexey Kardashevskiy aik at ozlabs.ru
Fri Jul 17 10:45:58 AEST 2020



On 17/07/2020 07:21, Segher Boessenkool wrote:
> Hi!
> 
> On Thu, Jul 16, 2020 at 05:54:30PM +0200, Greg Kurz wrote:
>> On Thu, 16 Jul 2020 14:55:42 +1000
>> Alexey Kardashevskiy <aik at ozlabs.ru> wrote:
>>> A loop over peers does not need recursion which becomes a problem with
>>> hundreds devices.
>>
>> You're likely right but, per curiosity, do you have some numbers to
>> share ?
> 
> It's two items on the data stack per recursion (and one on the return
> stack).  This would probably not take too much stack (just a lot, not
> *too* much though), except that to do "peer" we also recurse, so if
> there are a lot of entries in any of your parent nodes, you lose.  And
> most trees have some nodes with many children.
> 
> You can code any of the tree walks without any recursion, using just
> O(1) extra memory (just keep track of the previous node visited, for
> example)


for O(1) we need to keep a parent in the current node (which we do). I
wonder now if SLOF does O(1) walks anywhere.


>, but in this case, it is probably fine to just do a loop to
> handle the nodes on one level.
> 
>>> -: (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
>>>  ;
> 
> ... which is what this does :-)



-- 
Alexey


More information about the SLOF mailing list