Le 07/05/2024 à 19:23, Tom Rini a écrit :
> On Tue, May 07, 2024 at 09:17:46AM +0200, Yoann Congal wrote:
>> Le 06/05/2024 à 19:43, Tom Rini a écrit :
>>> On Sun, May 05, 2024 at 03:53:53PM +0200, Yoann Congal wrote:
>>>
>>>> From: Masahiro Yamada <masahi...@kernel.org>
>>>>
>>>> This is a cherry-pick from the kernel commit:
>>>> 6262afa10ef7c (kconfig: default to zero if int/hex symbol lacks default 
>>>> property, 2023-11-26)
>>>>
>>>> When a default property is missing in an int or hex symbol, it defaults
>>>> to an empty string, which is not a valid symbol value.
>>>>
>>>> It results in an incorrect .config, and can also lead to an infinite
>>>> loop in scripting.
>>>>
>>>> Use "0" for int and "0x0" for hex as a default value.
>>>>
>>>> Signed-off-by: Masahiro Yamada <masahi...@kernel.org>
>>>> Reviewed-by: Yoann Congal <yoann.con...@smile.fr>
>>>>
>>>> Signed-off-by: Yoann Congal <yoann.con...@smile.fr>
>>>> ---
>>>> Added context that was not in the upstream commit:
>>>> The infinite loop case happens with a configuration defined like this
>>>> (a hex config without a valid default value):
>>>>   config HEX_TEST
>>>>    hex "Hex config without default"
>>>>
>>>> And using:
>>>>   $ make oldconfig < /dev/null
>>>>   scripts/kconfig/conf  --oldconfig Kconfig
>>>>   *
>>>>   * General setup
>>>>   *
>>>>
>>>>   Error in reading or end of file.
>>>>
>>>>   Error in reading or end of file.
>>>>   Hex config without default (HEX_TEST) [] (NEW)
>>>>
>>>>   Error in reading or end of file.
>>>>   Hex config without default (HEX_TEST) [] (NEW)
>>>>   # This loops forever
>>>>
>>>> NB: Scripted config manipulation often call make with /dev/null as
>>>> stdin (Yocto recipe, CI build, ...)
>>>>
>>>> This was discovered when working on Yocto bug:
>>>> https://bugzilla.yoctoproject.org/show_bug.cgi?id=14136
>>
>> Hi Tom,
>>
>>> I'm surprised this was accepted. In the past I've wanted to avoid this
>>> kind of change in Kconfig because while the empty string can be easily
>>> be checked in the code as "user didn't really configure this, do
>>> nothing" a value of zero is a valid option in these cases and so then in
>>> the code we need a bool symbol to decide if the hex/int symbol is set or
>>> not.
>>
>> For context (and what it's worth), before this patch was merged, I've tried 
>> to fix this problem with a patch of my own which only exited the config 
>> process when the infinite loop would start:
>> "[PATCH v4] kconfig: avoid an infinite loop in oldconfig/syncconfig" [0]
>> ... the v5 version was a bit more severe and exited as soon as an error was 
>> hit, it was then removed from -next because it triggered a build failure [1].
>>
>>> Today this is less of an issue than it used to be in U-Boot with
>>> everything CONFIG-related migrated to Kconfig and so there's no longer
>>> the question of if we missed migrating a file that defined the value but
>>> there's still places we have in the code where hex symbol is undefined
>>> is not the same thing as hex symbol is 0x0.
>>>
>>> Is there a specific use case you have for this in U-Boot? It's been a
>>> while, but it's also been cases of newly introduced symbols in Kconfig
>>> files with incorrect dependencies, where the infinite loop in kconfig
>>> happened, CI failed and we caught the problem.
>>
>> For a specific example, one can trigger this with CMD_PSTORE_MEM_ADDR like 
>> this (tested on today's master):
>>   make qemu_arm64_defconfig
>>   make menuconfig
>>    # activate CONFIG_CMD_PSTORE=y but forget to fill CMD_PSTORE_MEM_ADDR
>>   make < /dev/null # This emulates a Yocto/scripted/CI build and loops 
>> infinitely
>>
>> But, my more general use case is the Yocto dev trying to change the U-Boot 
>> (or any kconfig based software) config and accidentally trigger this.
>> In Yocto, what they will see is a do_configure task taking a very long time 
>> but they won't see the looping logs the detect the problem (This is caught 
>> later by filing the RAM and the build process is killed by OOM, or the disk 
>> run out of space filed multi-GB log files).
>>
>> I'm sadly aware that defining a default value for this kind of config (fixed 
>> addresses) is not really sensible but the build time infinite loop is not 
>> good either.
> 
> Exactly, but to me it's worse to cover up the build issue and introduce
> a runtime issue instead. Something builds but then crashes at run time
> is worse to me than builds fail / get stuck. Using your example,
> CMD_PSTORE_MEM_ADDR depends on CMD_PSTORE and so if someone enables
> CMD_PSTORE in a config fragment but doesn't define the address, the
> build should not complete. Using 0x0 means that oops, now it fails to
> work and might not be obvious why either.
> 
> I won't revert this change when in the future we're able to sync up with
> the kernel again, but I'm not eager to bring this in by itself as it
> feels like the wrong way to deal with the problem. Thanks for explaining
> the history here.

Ok, I understand your position (I agree that runtime failure is bad)

Thanks for looking at this. I need to find another solution.

Regards,
-- 
Yoann Congal
Smile ECS - Tech Expert

Reply via email to