[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 09/10] xen/arm: fix duplicate /reserved-memory node in Dom0
Hi Penny, On 11/09/2023 12:39, Penny Zheng wrote: > > > Hi Michal > > On 2023/9/11 17:40, Michal Orzel wrote: >> Hi Penny, >> >> On 11/09/2023 06:04, Penny Zheng wrote: >>> >>> >>> In case there is a /reserved-memory node already present in the host dtb, >>> current Xen codes would create yet another /reserved-memory node specially >> s/codes/code/ >> >>> for the static shm in Dom0 Device Tree. >>> >>> Xen will use write_properties() to copy the reserved memory nodes from host >>> dtb >>> to Dom0 FDT, so we want to insert the shm node along with the copying. >>> And avoiding duplication, we add a checking before make_resv_memory_node(). >>> >>> Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx> >>> >>> --- >>> v3 -> v4: >>> new commit >>> --- >>> xen/arch/arm/domain_build.c | 31 ++++++++++++++++++++++++++++--- >>> xen/arch/arm/include/asm/kernel.h | 2 ++ >>> 2 files changed, 30 insertions(+), 3 deletions(-) >>> >>> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c >>> index 02d903be78..dad234e4b5 100644 >>> --- a/xen/arch/arm/domain_build.c >>> +++ b/xen/arch/arm/domain_build.c >>> @@ -1401,6 +1401,10 @@ static int __init handle_linux_pci_domain(struct >>> kernel_info *kinfo, >>> return fdt_property_cell(kinfo->fdt, "linux,pci-domain", segment); >>> } >>> >>> +static int __init make_shm_memory_node(const struct domain *d, >>> + void *fdt, >>> + int addrcells, int sizecells, >>> + const struct kernel_info *kinfo); >>> static int __init write_properties(struct domain *d, struct kernel_info >>> *kinfo, >>> const struct dt_device_node *node) >>> { >>> @@ -1549,6 +1553,23 @@ static int __init write_properties(struct domain *d, >>> struct kernel_info *kinfo, >>> } >>> } >>> >>> + if ( dt_node_path_is_equal(node, "/reserved-memory") ) >>> + { >>> + kinfo->resv_mem = true; >> kinfo structure is used to store per-domain parameters and presence of >> reserved memory in host dtb >> does not fit into this. Moreover, there is no need to introduce yet another >> flag for that given >> that in other parts of the code in Xen we use bootinfo.reserved_mem.nr_banks >> to check if there are >> reserved regions. >> >>> + >>> + /* shared memory provided. */ >>> + if ( kinfo->shminfo.nr_banks != 0 ) >>> + { >>> + uint32_t addrcells = dt_n_addr_cells(node), >>> + sizecells = dt_n_size_cells(node); >>> + >>> + res = make_shm_memory_node(d, kinfo->fdt, >>> + addrcells, sizecells, kinfo); >> I haven't yet looked at previous patches but does it make sense to request >> passing both kinfo->fdt and kinfo? >> IMO, the latter would be sufficient. This would apply to other functions you >> modified. >> > > yes, the latter would be sufficient. I'll fix it in next version. > > >>> + if ( res ) >>> + return res; >>> + } >>> + } >>> + >>> return 0; >>> } >>> >>> @@ -2856,9 +2877,13 @@ static int __init handle_node(struct domain *d, >>> struct kernel_info *kinfo, >>> return res; >>> } >>> >>> - res = make_resv_memory_node(d, kinfo->fdt, addrcells, sizecells, >>> kinfo); >>> - if ( res ) >>> - return res; >>> + /* Avoid duplicate /reserved-memory nodes in Device Tree */ >>> + if ( !kinfo->resv_mem ) >> No need for a new flag as mentioned above. Just before this line of code >> there is a check: >> if ( bootinfo.reserved_mem.nr_banks > 0 ) >> { >> res = make_memory_node(d, kinfo->fdt, addrcells, sizecells, >> &bootinfo.reserved_mem); >> if ( res ) >> return res; >> } >> so you can just append the following: >> else >> { >> res = make_resv_memory_node(d, kinfo->fdt, addrcells, sizecells, kinfo); >> if ( res ) >> return res; >> } >> to achieve the same without a need for a new flag. > > > Right now, bootinfo.reserved_mem is not only containing reserved regions > described in host FDT /reserved-memory, but also the reserved ones for > domain only, like in xen,static-mem = <xxx>. > So simply with non-zero bootinfo.reserved_mem.nr_banks, we couldn't tell > whether we had a /reserved-memory node in host FDT. > > I agree that kinfo is not a good place to store whether host FDT has a > /reserved-memory node. Maybe bootinfo.has_resv_memory_node? Yes, I see. So we have 2 options: 1) Introduce flag under bootinfo (just like static_heap) 2) Inside make_resv_memory_node(), do a check e.g.: for ( i = 0; i < bootinfo.reserved_mem.nr_banks && (bootinfo.reserved_mem.bank[i].type == MEMBANK_DEFAULT); i++ ); to see if there is a /reserved-memory node (i > 0). ~Michal
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |