[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 1/2] xen/arm: exclude xen,reg from direct-map domU extended regions
On 5/14/25 03:31, Orzel, Michal wrote: > On 13/05/2025 21:54, Stewart Hildebrand wrote: >> 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. >> >> Introduce rangeset_count_ranges(). >> >> Take the opportunity to update the comment ahead of find_memory_holes(). >> >> Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx> >> --- >> v2->v3: >> * new patch >> --- >> xen/arch/arm/domain_build.c | 57 +++++++++++++++++++++++++++++++++---- >> xen/common/rangeset.c | 14 +++++++++ >> xen/include/xen/rangeset.h | 2 ++ >> 3 files changed, 68 insertions(+), 5 deletions(-) >> >> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c >> index b189a7cfae9f..3cdf5839bc98 100644 >> --- a/xen/arch/arm/domain_build.c >> +++ b/xen/arch/arm/domain_build.c >> @@ -824,15 +824,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 Dom0 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) >> @@ -914,6 +916,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), >> @@ -994,11 +1003,30 @@ static int __init find_domU_holes(const struct >> kernel_info *kinfo, >> return res; >> } >> >> +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) - 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 + 1; >> + 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 = membanks_xzalloc( >> + max(1, rangeset_count_ranges(kinfo->xen_reg_assigned)), MEMORY); > You allocate at least 1 membank even though xen_reg_assigned may be empty > because: > - this function is called for hwdom - no xen,reg > - there may be no xen,reg i.e. no passthrough Ah, sorry, there's no need to allocate at least 1. This can just be: struct membanks *xen_reg = membanks_xzalloc( rangeset_count_ranges(kinfo->arch.xen_reg_assigned), MEMORY);
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |