|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 2/7] xen/arm: make process_memory_node a device_tree_node_func
Hi Stefano,
Stefano Stabellini writes:
> On Tue, 13 Aug 2019, Volodymyr Babchuk wrote:
>> > @@ -162,6 +156,10 @@ static void __init process_memory_node(const void
>> > *fdt, int node,
>> > bootinfo.mem.bank[bootinfo.mem.nr_banks].size = size;
>> > bootinfo.mem.nr_banks++;
>> > }
>> > +
>> > + if ( bootinfo.mem.nr_banks == NR_MEM_BANKS )
>> > + return -ENOSPC;
>> Are you sure that this logic is correct?
>>
>> For example, if NR_MEM_BANKS is 1, and we have exactly one memory node
>> in device tree, this function will fail. But it should not. I think you
>> want this condition: bootinfo.mem.nr_banks > NR_MEM_BANKS
>
> You are right, if NR_MEM_BANKS is 1 and we have 1 memory node in device
> tree the code would return an error while actually it is normal.
>
> I think the right check would be:
>
> if ( i < banks && bootinfo.mem.nr_banks == NR_MEM_BANKS )
> return -ENOSPC;
Actually, this does not cover all corner cases. Here is the resulting
code:
150 for ( i = 0; i < banks && bootinfo.mem.nr_banks < NR_MEM_BANKS; i++ )
151 {
152 device_tree_get_reg(&cell, address_cells, size_cells, &start,
&size);
153 if ( !size )
154 continue;
155 bootinfo.mem.bank[bootinfo.mem.nr_banks].start = start;
156 bootinfo.mem.bank[bootinfo.mem.nr_banks].size = size;
157 bootinfo.mem.nr_banks++;
158 }
159
160 if ( i < banks && bootinfo.mem.nr_banks == NR_MEM_BANKS )
161 return -ENOSPC;
Lines 153-154 cause the issue.
Imagine that NR_MEM_BANKS = 1 and we have two memory nodes in device
tree with. Nodes have sizes 0 and 1024. Your code will work as
intended. At the end of loop we will have banks = 2, i = 2 and
bootinfo.mem.nr_banks = 1.
But if we switch order of memory nodes, so first one will be with size
1024 and second one with size 0, your code will return -ENOSPC, because
we'll have banks = 2, i = 1, bootinfo.mem.nr_banks = 1.
I think, right solution will be to scan all nodes to count nodes
with size > 0. And then - either return an error or do second loop to
fill bootinfo.mem.bank[].
>
> (That's because it is impossible to get to nr_banks > NR_MEM_BANKS.)
Yes, this is my mistake.
--
Volodymyr Babchuk at EPAM
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |