[SLOF] [PATCH v3] boot: do not use catpad to concatenate strings

Alexey Kardashevskiy aik at ozlabs.ru
Tue Dec 12 17:44:04 AEDT 2017


On 12/12/17 14:47, Nikunj A Dadhania wrote:
> Alexey Kardashevskiy <aik at ozlabs.ru> writes:
> 
>> On 11/12/17 19:57, Nikunj A Dadhania wrote:
>>> Alexey Kardashevskiy <aik at ozlabs.ru> writes:
>>>
>>>> On 11/12/17 17:30, Nikunj A Dadhania wrote:
>>>>> Hi Alexey,
>>>>>
>>>>> Alexey Kardashevskiy <aik at ozlabs.ru> writes:
>>>>>
>>>>>> On 08/12/17 16:32, Nikunj A Dadhania wrote:
>>>>>>> The catpad size is 1K size, which can be hit easily hit with around 20 devices
>>>>>>> with bootindex.
>>>>>>>
>>>>>>> Open code EVALUATE such that concatenation is not required. Replace usage of
>>>>>>> $cat with a dynamically allocated buffer(16K) here.
>>>>>>>
>>>>>>> Reported here: https://github.com/qemu/SLOF/issues/3
>>>>>>>
>>>>>>> Signed-off-by: Nikunj A Dadhania <nikunj at linux.vnet.ibm.com>
>>>>>>
>>>>>> I've read the v1..v3 of this patch and (to my embarrassment) I do not
>>>>>> understand how this works at all :)
>>>>>>
>>>>>> Above you said "concatenation is not required" but there is
>>>>>> bootdev-string-cat, how is that not concat? We did cat to bootdevice, now -
>>>>>> to bootdev-string-cat, but this is not just it?
>>>>>
>>>>> Earlier the concatenation was done using a common buffer $catpad
>>>>>
>>>>> slof/fs/base.fs:CREATE $catpad 400 allot
>>>>>
>>>>> Which had a limitation of 1K, my first patch was to increase the size of
>>>>> $catpad and Segher said that $catpad was kept small on purpose for
>>>>> concatenating quickly without much overhead.
>>>>>
>>>>> Version-2 patch did following things:
>>>>>
>>>>>     1) introduced a similar static buffer for bootdev concatenation without
>>>>>        using $cat.
>>>>
>>>> This part I understood :)
>>>>
>>>>
>>>>>     2) Replaced concatenation in LOAD and LOAD-NEXT by open coding EVALUATE word.
>>>>
>>>> This part I do not understand - why is this change needed or how does it
>>>> make it better?
>>>
>>> Because we were  concatenating and then evaluating during runtime, newer
>>> code plays directly with args and populates the stack and calls
>>> parse-load, so concatenation is not required anymore.
>>
>>
>> This must be some different concatenation then as the patch uses new
>> bootdev-buf for concatenation.
> 
> Let us take the example:
> 
>    set-boot-args s" parse-load " $bootdev $cat strdup evaluate
>                                           ^^^^^^^^^^^
> 
> We were concatenating the word " parse-load" and our bootdevice list
> that was input to evaluate. In the discussion with Segher, he suggested
> to open code evaluate, that eliminates the requirement for
> concatenation. Newer "load" does not use $cat anymore.
> 
>    set-boot-args
>    save-source  -1 to source-id
>    $bootdev dup #ib ! span ! to ib
>    0 >in !
>    ['] parse-load catch restore-source throw


Ah, I see... Hm. But why do not we just call parse-load directly, without
evaluate or this really not obvious open coded version of evaluate? :)

It all looks unnecessary complicated :(



> 
> 
>>
>>>> There is a global list of boot devices - bootdevice; and for some reason
>>>> now there is another one - bootdev-buf, both are strings...
>>>
>>> No, bootdev-buf is a temporary buffer, its not replacing bootdevice.
>>
>> Ufff. I am lost now. $bootdev adds something to the dictionary (via
>> strdup), and so does (set-boot-device), and "bootdevice" points to
>> what?
> 
> slof/fs/loaders.fs:CREATE bootdevice 2 cells allot bootdevice 2 cells erase
> 
> Its where you store the boot device string and its length. Whenever you
> read/update the list of boot devices, this is where finally the list is
> updated. Something sort of a pointer + length
> 
> 
>> Since you understand this stuff, can you please outline what is called what
>> and where it is all stored?
>>
>> (add-boot-device) is called when devices are discovered, the result is in
>> the dictionary, "bootdevice" points to a concatenated string. What happens
>> then?
> 
> At every discovery of boot device, old list of boot device and new one
> is concatenated and stored back in bootdevice.
> 
> During the loading stage, this list is passed as argument to parse-load.
> It goes one by one through this list trying to boot:
> 
> There are three conditions:
> 1) Fails loading (not bootable device)
> 2) Execption during loading (bootable device but something went wrong)
> 3) Successfully loaded (boots to the guest)
> 
> 
> For first case we just go to next device. Second case is caught in
> "boot" word and we need to resume back from the next eligible boot
> device. That is where load-next comes into picture, but till what point
> did we complete in the list of boot devices? That info is there in
> load-list.

I have $bootdev = "/pci at 800000020000000/ethernet at 1
/pci at 800000020000000/ethernet at 2 disk cdrom net net1" and I see slof trying
them all but I do not see load-next called at all, hence my question...




> 
> And finally if nothing works we drop to slof prompt. 
> 
> Thomas/Segher, please feel free to add/comment
> 
>>>> And there is also a load-list list which is what for? :)
>>>
>>> Not sure what you are referring to.
>>
>> slof/fs/boot.fs  :
>>
>> : load-next ( -- success ). \ Continue after go failed
>>    load-list 2@ ?dup IF
>>       save-source  -1 to source-id
>>       dup #ib ! span ! to ib
>>       0 >in !
>>       ['] parse-load catch restore-source throw
>>    ELSE drop false THEN
>> ;
> 
> 
>> This uses "load-list" - what is that for?
> 
> Explained above.
> 
>> I would have pushed this out already if they were 2 patches - one replacing
>> $cat with bootdev-string-cat and the other doing this open coded thing but
>> I do not know if these parts are independent and where is the line :)
> 
> Yes, i was thinking on that line as well. Maybe easier to read them. The
> will be solved with both the patches though.
> 
> Regards
> Nikunj
> 


-- 
Alexey


More information about the SLOF mailing list