[PATCH 1/2] lmb: Avoid to add identical region in lmb_add_region_flags()

Patrice CHOTARD patrice.chotard at foss.st.com
Tue Mar 12 12:35:47 CET 2024



On 3/11/24 16:36, Kumar, Udit wrote:
> 
> On 3/11/2024 8:09 PM, Patrice Chotard wrote:
>> In case lmb_add_region_flags() is called with the same parameter than
>> an already existing lmb and this lmb is adjacent to its previous lmb with
>> different flag, this lmb is added again.
> 
> 
> Same parameter means , addr and size and different flags correct ?

Hi Udit,

Same parameters means same addr, same size and same flags.

> 
> 
>> Instead breaking the loop, continue, at the next iteration, we are able
>> to detect that this region already exist.
> 
> Once region already exist detected, then you can think of returning error , no ?

Before detecting this region is already present, it's detected 
that this region we want to add is adjacent to a region present in rgn[] array.

That's why i replace the "break" by a "continue" to be able to detect this region is already
present in rgn[] in the next iteration.

Thanks
Patrice

> 
> 
>> Issue reproduced on STM32MP157-DK2 with SCMI DT, bdinfo command's output
>> shows:
>>
>> Before this patch, the last LMB [0xde000000-0xdfffffff] is duplicated:
>> ...
>> lmb_dump_all:nnn
>>   memory.cnt = 0x1 / max = 0x2
>>   memory[0]      [0xc0000000-0xdfffffff], 0x20000000 bytes flags: 0
>>   reserved.cnt = 0x6 / max = 0x10
>>   reserved[0]    [0x10000000-0x10045fff], 0x00046000 bytes flags: 4
>>   reserved[1]    [0x30000000-0x3003ffff], 0x00040000 bytes flags: 4
>>   reserved[2]    [0x38000000-0x3800ffff], 0x00010000 bytes flags: 4
>>   reserved[3]    [0xdaadf000-0xdfffffff], 0x05521000 bytes flags: 0
>>   reserved[4]    [0xde000000-0xdfffffff], 0x02000000 bytes flags: 4
>>   reserved[5]    [0xde000000-0xdfffffff], 0x02000000 bytes flags: 4
>> ...
>>
>> After this patch:
>> ...
>> lmb_dump_all:
>>   memory.cnt = 0x1 / max = 0x2
>>   memory[0]      [0xc0000000-0xdfffffff], 0x20000000 bytes flags: 0
>>   reserved.cnt = 0x5 / max = 0x10
>>   reserved[0]    [0x10000000-0x10045fff], 0x00046000 bytes flags: 4
>>   reserved[1]    [0x30000000-0x3003ffff], 0x00040000 bytes flags: 4
>>   reserved[2]    [0x38000000-0x3800ffff], 0x00010000 bytes flags: 4
>>   reserved[3]    [0xdaadf000-0xdfffffff], 0x05521000 bytes flags: 0
>>   reserved[4]    [0xde000000-0xdfffffff], 0x02000000 bytes flags: 4
>> ...
>>
>> Fixes: 59c0ea5df33f ("lmb: Add support of flags for no-map properties")
>>
>> Signed-off-by: Patrice Chotard <patrice.chotard at foss.st.com>
>> ---
>>
>>   lib/lmb.c | 4 ++--
>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/lib/lmb.c b/lib/lmb.c
>> index 44f98205310..b6afb731440 100644
>> --- a/lib/lmb.c
>> +++ b/lib/lmb.c
>> @@ -285,14 +285,14 @@ static long lmb_add_region_flags(struct lmb_region *rgn, phys_addr_t base,
>>           adjacent = lmb_addrs_adjacent(base, size, rgnbase, rgnsize);
>>           if (adjacent > 0) {
>>               if (flags != rgnflags)
>> -                break;
>> +                continue;
>>               rgn->region[i].base -= size;
>>               rgn->region[i].size += size;
>>               coalesced++;
>>               break;
>>           } else if (adjacent < 0) {
>>               if (flags != rgnflags)
>> -                break;
>> +                continue;
>>               rgn->region[i].size += size;
>>               coalesced++;
>>               break;


More information about the U-Boot mailing list