[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 4/7] xen/arm: Parse xen,shared-mem when host phys address is not provided
Hi Luca, On 22/05/2024 09:51, Luca Fancellu wrote: > > > Handle the parsing of the 'xen,shared-mem' property when the host physical > address is not provided, this commit is introducing the logic to parse it, > but the functionality is still not implemented and will be part of future > commits. > > Rework the logic inside process_shm_node to check the shm_id before doing > the other checks, because it ease the logic itself, add more comment on > the logic. > Now when the host physical address is not provided, the value > INVALID_PADDR is chosen to signal this condition and it is stored as > start of the bank, due to that change also early_print_info_shmem and > init_sharedmem_pages are changed, to not handle banks with start equal > to INVALID_PADDR. > > Another change is done inside meminfo_overlap_check, to skip banks that > are starting with the start address INVALID_PADDR, that function is used > to check banks from reserved memory, shared memory and ACPI and since > the comment above the function states that wrapping around is not handled, > it's unlikely for these bank to have the start address as INVALID_PADDR. > Same change is done inside consider_modules, find_unallocated_memory and > dt_unreserved_regions functions, in order to skip banks that starts with > INVALID_PADDR from any computation. > The changes above holds because of this consideration. > > Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx> > Reviewed-by: Michal Orzel <michal.orzel@xxxxxxx> > --- > v3 changes: > - fix typo in commit msg, add R-by Michal > v2 changes: > - fix comments, add parenthesis to some conditions, remove unneeded > variables, remove else branch, increment counter in the for loop, > skip INVALID_PADDR start banks from also consider_modules, > find_unallocated_memory and dt_unreserved_regions. (Michal) > --- > xen/arch/arm/arm32/mmu/mm.c | 11 +++- > xen/arch/arm/domain_build.c | 5 ++ > xen/arch/arm/setup.c | 14 +++- > xen/arch/arm/static-shmem.c | 125 +++++++++++++++++++++++++----------- > 4 files changed, 111 insertions(+), 44 deletions(-) > > diff --git a/xen/arch/arm/arm32/mmu/mm.c b/xen/arch/arm/arm32/mmu/mm.c > index be480c31ea05..30a7aa1e8e51 100644 > --- a/xen/arch/arm/arm32/mmu/mm.c > +++ b/xen/arch/arm/arm32/mmu/mm.c > @@ -101,8 +101,15 @@ static paddr_t __init consider_modules(paddr_t s, > paddr_t e, > nr += reserved_mem->nr_banks; > for ( ; i - nr < shmem->nr_banks; i++ ) > { > - paddr_t r_s = shmem->bank[i - nr].start; > - paddr_t r_e = r_s + shmem->bank[i - nr].size; > + paddr_t r_s, r_e; > + > + r_s = shmem->bank[i - nr].start; > + > + /* Shared memory banks can contain INVALID_PADDR as start */ > + if ( INVALID_PADDR == r_s ) > + continue; > + > + r_e = r_s + shmem->bank[i - nr].size; > > if ( s < r_e && r_s < e ) > { > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c > index 968c497efc78..02e741685102 100644 > --- a/xen/arch/arm/domain_build.c > +++ b/xen/arch/arm/domain_build.c > @@ -927,6 +927,11 @@ static int __init find_unallocated_memory(const struct > kernel_info *kinfo, > for ( j = 0; j < mem_banks[i]->nr_banks; j++ ) > { > start = mem_banks[i]->bank[j].start; > + > + /* Shared memory banks can contain INVALID_PADDR as start */ > + if ( INVALID_PADDR == start ) > + continue; > + > end = mem_banks[i]->bank[j].start + mem_banks[i]->bank[j].size; > res = rangeset_remove_range(unalloc_mem, PFN_DOWN(start), > PFN_DOWN(end - 1)); > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > index c4e5c19b11d6..0c2fdaceaf21 100644 > --- a/xen/arch/arm/setup.c > +++ b/xen/arch/arm/setup.c > @@ -240,8 +240,15 @@ static void __init dt_unreserved_regions(paddr_t s, > paddr_t e, > offset = reserved_mem->nr_banks; > for ( ; i - offset < shmem->nr_banks; i++ ) > { > - paddr_t r_s = shmem->bank[i - offset].start; > - paddr_t r_e = r_s + shmem->bank[i - offset].size; > + paddr_t r_s, r_e; > + > + r_s = shmem->bank[i - offset].start; > + > + /* Shared memory banks can contain INVALID_PADDR as start */ > + if ( INVALID_PADDR == r_s ) > + continue; > + > + r_e = r_s + shmem->bank[i - offset].size; > > if ( s < r_e && r_s < e ) > { > @@ -272,7 +279,8 @@ static bool __init meminfo_overlap_check(const struct > membanks *mem, > bank_start = mem->bank[i].start; > bank_end = bank_start + mem->bank[i].size; > > - if ( region_end <= bank_start || region_start >= bank_end ) > + if ( INVALID_PADDR == bank_start || region_end <= bank_start || > + region_start >= bank_end ) > continue; > else > { > diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c > index c15a65130659..74c81904b8a4 100644 > --- a/xen/arch/arm/static-shmem.c > +++ b/xen/arch/arm/static-shmem.c > @@ -264,6 +264,12 @@ int __init process_shm(struct domain *d, struct > kernel_info *kinfo, > pbase = boot_shm_bank->start; > psize = boot_shm_bank->size; > > + if ( INVALID_PADDR == pbase ) > + { > + printk("%pd: host physical address must be chosen by users at > the moment", d); > + return -EINVAL; > + } > + > /* > * xen,shared-mem = <pbase, gbase, size>; > * TODO: pbase is optional. > @@ -377,7 +383,8 @@ int __init process_shm_node(const void *fdt, int node, > uint32_t address_cells, > { > const struct fdt_property *prop, *prop_id, *prop_role; > const __be32 *cell; > - paddr_t paddr, gaddr, size, end; > + paddr_t paddr = INVALID_PADDR; > + paddr_t gaddr, size, end; > struct membanks *mem = bootinfo_get_shmem(); > struct shmem_membank_extra *shmem_extra = bootinfo_get_shmem_extra(); > unsigned int i; > @@ -432,24 +439,37 @@ int __init process_shm_node(const void *fdt, int node, > uint32_t address_cells, > if ( !prop ) > return -ENOENT; > > + cell = (const __be32 *)prop->data; > if ( len != dt_cells_to_size(address_cells + size_cells + address_cells) > ) > { > - if ( len == dt_cells_to_size(size_cells + address_cells) ) > - printk("fdt: host physical address must be chosen by users at > the moment.\n"); > - > - printk("fdt: invalid `xen,shared-mem` property.\n"); > - return -EINVAL; > + if ( len == dt_cells_to_size(address_cells + size_cells) ) > + device_tree_get_reg(&cell, address_cells, size_cells, &gaddr, > + &size); > + else > + { > + printk("fdt: invalid `xen,shared-mem` property.\n"); > + return -EINVAL; > + } > } > + else > + { > + device_tree_get_reg(&cell, address_cells, address_cells, &paddr, > + &gaddr); > + size = dt_next_cell(size_cells, &cell); > > - cell = (const __be32 *)prop->data; > - device_tree_get_reg(&cell, address_cells, address_cells, &paddr, &gaddr); > - size = dt_next_cell(size_cells, &cell); > + if ( !IS_ALIGNED(paddr, PAGE_SIZE) ) > + { > + printk("fdt: physical address 0x%"PRIpaddr" is not suitably > aligned.\n", > + paddr); > + return -EINVAL; > + } > > - if ( !IS_ALIGNED(paddr, PAGE_SIZE) ) > - { > - printk("fdt: physical address 0x%"PRIpaddr" is not suitably > aligned.\n", > - paddr); > - return -EINVAL; > + end = paddr + size; > + if ( end <= paddr ) > + { > + printk("fdt: static shared memory region %s overflow\n", shm_id); > + return -EINVAL; > + } > } > > if ( !IS_ALIGNED(gaddr, PAGE_SIZE) ) > @@ -471,39 +491,64 @@ int __init process_shm_node(const void *fdt, int node, > uint32_t address_cells, > return -EINVAL; > } > > - end = paddr + size; > - if ( end <= paddr ) > - { > - printk("fdt: static shared memory region %s overflow\n", shm_id); > - return -EINVAL; > - } > - > for ( i = 0; i < mem->nr_banks; i++ ) > { > /* > * Meet the following check: > - * 1) The shm ID matches and the region exactly match > - * 2) The shm ID doesn't match and the region doesn't overlap > - * with an existing one > + * - when host address is provided: > + * 1) The shm ID matches and the region exactly match > + * 2) The shm ID doesn't match and the region doesn't overlap > + * with an existing one > + * - when host address is not provided: > + * 1) The shm ID matches and the region size exactly match > */ > - if ( paddr == mem->bank[i].start && size == mem->bank[i].size ) > + bool paddr_assigned = (INVALID_PADDR == paddr); Shouldn't it be INVALID_PADDR != paddr to indicate that paddr was assigned? Otherwise, looking at the code belowe you would allow a configuration where the shm_id matches but the phys addresses don't. ~Michal
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |