[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] xen/arm: exclude xen,reg from direct-map domU extended regions
commit 3af8a6ed8e1db75bee5c51268507333f9f5772a3 Author: Stewart Hildebrand <stewart.hildebrand@xxxxxxx> AuthorDate: Tue Jun 17 13:54:04 2025 -0400 Commit: Stefano Stabellini <stefano.stabellini@xxxxxxx> CommitDate: Tue Jun 17 15:30:17 2025 -0700 xen/arm: exclude xen,reg from direct-map domU extended regions Similarly to fba1b0974dd8, when a device is passed through to a direct-map dom0less domU, the xen,reg ranges may overlap with the extended regions. Remove xen,reg from direct-map domU extended regions. Take the opportunity to update the comment ahead of find_memory_holes(). Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx> Reviewed-by: Michal Orzel <michal.orzel@xxxxxxx> --- xen/arch/arm/domain_build.c | 80 ++++++++++++++++++++++++++++++++--- xen/common/device-tree/domain-build.c | 5 +++ 2 files changed, 80 insertions(+), 5 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 845c92614b..4ff161887e 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -792,15 +792,17 @@ static int __init handle_pci_range(const struct dt_device_node *dev, } /* - * Find the holes in the Host DT which can be exposed to Dom0 as extended - * regions for the special memory mappings. In order to calculate regions - * we exclude every addressable memory region described by "reg" and "ranges" - * properties from the maximum possible addressable physical memory range: + * Find the holes in the Host DT which can be exposed to hwdom or a direct-map + * domU as extended regions for the special memory mappings. In order to + * calculate regions we exclude every addressable memory region described by + * "reg" and "ranges" properties from the maximum possible addressable physical + * memory range: * - MMIO * - Host RAM * - PCI aperture * - Static shared memory regions, which are described by special property * "xen,shared-mem" + * - xen,reg mappings */ static int __init find_memory_holes(const struct kernel_info *kinfo, struct membanks *ext_regions) @@ -882,6 +884,13 @@ static int __init find_memory_holes(const struct kernel_info *kinfo, } } + if ( kinfo->xen_reg_assigned ) + { + res = rangeset_subtract(mem_holes, kinfo->xen_reg_assigned); + if ( res ) + goto out; + } + start = 0; end = (1ULL << p2m_ipa_bits) - 1; res = rangeset_report_ranges(mem_holes, PFN_DOWN(start), PFN_DOWN(end), @@ -962,11 +971,51 @@ static int __init find_domU_holes(const struct kernel_info *kinfo, return res; } +static int __init count(unsigned long s_gfn, unsigned long e_gfn, void *data) +{ + unsigned int *cnt = data; + + (*cnt)++; + + return 0; +} + +static unsigned int __init count_ranges(struct rangeset *r) +{ + unsigned int cnt = 0; + + (void) rangeset_report_ranges(r, 0, PFN_DOWN((1ULL << p2m_ipa_bits) - 1), + count, &cnt); + + return cnt; +} + +static int __init rangeset_to_membank(unsigned long s_gfn, unsigned long e_gfn, + void *data) +{ + struct membanks *membank = data; + paddr_t s = pfn_to_paddr(s_gfn); + paddr_t e = pfn_to_paddr(e_gfn + 1); + + if ( membank->nr_banks >= membank->max_banks ) + return 0; + + membank->bank[membank->nr_banks].start = s; + membank->bank[membank->nr_banks].size = e - s; + membank->nr_banks++; + + return 0; +} + static int __init find_host_extended_regions(const struct kernel_info *kinfo, struct membanks *ext_regions) { int res; struct membanks *gnttab = membanks_xzalloc(1, MEMORY); + struct membanks *xen_reg = + kinfo->xen_reg_assigned + ? membanks_xzalloc(count_ranges(kinfo->xen_reg_assigned), MEMORY) + : NULL; /* * Exclude the following regions: @@ -974,6 +1023,7 @@ static int __init find_host_extended_regions(const struct kernel_info *kinfo, * 2) Remove reserved memory * 3) Grant table assigned to domain * 4) Remove static shared memory (when the feature is enabled) + * 5) Remove xen,reg */ const struct membanks *mem_banks[] = { kernel_info_get_mem_const(kinfo), @@ -982,12 +1032,29 @@ static int __init find_host_extended_regions(const struct kernel_info *kinfo, #ifdef CONFIG_STATIC_SHM bootinfo_get_shmem(), #endif + xen_reg, }; dt_dprintk("Find unallocated memory for extended regions\n"); if ( !gnttab ) - return -ENOMEM; + { + res = -ENOMEM; + goto out; + } + + if ( kinfo->xen_reg_assigned ) + { + if ( !xen_reg ) + { + res = -ENOMEM; + goto out; + } + + rangeset_report_ranges(kinfo->xen_reg_assigned, 0, + PFN_DOWN((1ULL << p2m_ipa_bits) - 1), + rangeset_to_membank, xen_reg); + } gnttab->nr_banks = 1; gnttab->bank[0].start = kinfo->gnttab_start; @@ -995,6 +1062,9 @@ static int __init find_host_extended_regions(const struct kernel_info *kinfo, res = find_unallocated_memory(kinfo, mem_banks, ARRAY_SIZE(mem_banks), ext_regions, add_ext_regions); + + out: + xfree(xen_reg); xfree(gnttab); return res; diff --git a/xen/common/device-tree/domain-build.c b/xen/common/device-tree/domain-build.c index 6b8b8d7cac..99ea81198a 100644 --- a/xen/common/device-tree/domain-build.c +++ b/xen/common/device-tree/domain-build.c @@ -193,6 +193,10 @@ int __init find_unallocated_memory(const struct kernel_info *kinfo, /* Remove all regions listed in mem_banks */ for ( i = 0; i < nr_mem_banks; i++ ) + { + if ( !mem_banks[i] ) + continue; + for ( j = 0; j < mem_banks[i]->nr_banks; j++ ) { start = mem_banks[i]->bank[j].start; @@ -212,6 +216,7 @@ int __init find_unallocated_memory(const struct kernel_info *kinfo, goto out; } } + } start = 0; end = (1ULL << p2m_ipa_bits) - 1; -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |