[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v11 03/12] xen/arm: permit non direct-mapped Dom0 construction



Hi,

On Mon, Dec 9, 2024 at 8:17 PM Julien Grall <julien@xxxxxxx> wrote:
>
> Hi Michal,
>
> On 07/12/2024 15:04, Michal Orzel wrote:
> >
> >
> > On 06/12/2024 19:37, Julien Grall wrote:
> >>
> >>
> >> Hi,
> >>
> >> Sorry for the late answer.
> >>
> >> On 05/12/2024 09:40, Michal Orzel wrote:
> >>>
> >>>
> >>> On 02/12/2024 17:59, Carlo Nonato wrote:
> >>>>
> >>>>
> >>>> Cache coloring requires Dom0 not to be direct-mapped because of its non
> >>>> contiguous mapping nature, so allocate_memory() is needed in this case.
> >>>> 8d2c3ab18cc1 ("arm/dom0less: put dom0less feature code in a separate 
> >>>> module")
> >>>> moved allocate_memory() in dom0less_build.c. In order to use it
> >>>> in Dom0 construction bring it back to domain_build.c and declare it in
> >>>> domain_build.h.
> >>>>
> >>>> Take the opportunity to adapt the implementation of allocate_memory() so
> >>>> that it uses the host layout when called on the hwdom, via
> >>>> find_unallocated_memory().
> >>>>
> >>>> Signed-off-by: Carlo Nonato <carlo.nonato@xxxxxxxxxxxxxxx>
> >>>> ---
> >>>> v11:
> >>>> - GUEST_RAM_BANKS instead of hardcoding the number of banks in 
> >>>> allocate_memory()
> >>>> - hwdom_ext_regions -> hwdom_free_mem in allocate_memory()
> >>>> - added a comment in allocate_memory() when skipping small banks
> >>>> v10:
> >>>> - fixed a compilation bug that happened when dom0less support was 
> >>>> disabled
> >>>> v9:
> >>>> - no changes
> >>>> v8:
> >>>> - patch adapted to new changes to allocate_memory()
> >>>> v7:
> >>>> - allocate_memory() now uses the host layout when called on the hwdom
> >>>> v6:
> >>>> - new patch
> >>>> ---
> >>>>    xen/arch/arm/dom0less-build.c           | 44 -----------
> >>>>    xen/arch/arm/domain_build.c             | 97 ++++++++++++++++++++++++-
> >>>>    xen/arch/arm/include/asm/domain_build.h |  1 +
> >>>>    3 files changed, 94 insertions(+), 48 deletions(-)
> >>>>
> >>>> diff --git a/xen/arch/arm/dom0less-build.c 
> >>>> b/xen/arch/arm/dom0less-build.c
> >>>> index d93a85434e..67b1503647 100644
> >>>> --- a/xen/arch/arm/dom0less-build.c
> >>>> +++ b/xen/arch/arm/dom0less-build.c
> >>>> @@ -49,50 +49,6 @@ bool __init is_dom0less_mode(void)
> >>>>        return ( !dom0found && domUfound );
> >>>>    }
> >>>>
> >>>> -static void __init allocate_memory(struct domain *d, struct kernel_info 
> >>>> *kinfo)
> >>>> -{
> >>>> -    struct membanks *mem = kernel_info_get_mem(kinfo);
> >>>> -    unsigned int i;
> >>>> -    paddr_t bank_size;
> >>>> -
> >>>> -    printk(XENLOG_INFO "Allocating mappings totalling %ldMB for %pd:\n",
> >>>> -           /* Don't want format this as PRIpaddr (16 digit hex) */
> >>>> -           (unsigned long)(kinfo->unassigned_mem >> 20), d);
> >>>> -
> >>>> -    mem->nr_banks = 0;
> >>>> -    bank_size = MIN(GUEST_RAM0_SIZE, kinfo->unassigned_mem);
> >>>> -    if ( !allocate_bank_memory(kinfo, gaddr_to_gfn(GUEST_RAM0_BASE),
> >>>> -                               bank_size) )
> >>>> -        goto fail;
> >>>> -
> >>>> -    bank_size = MIN(GUEST_RAM1_SIZE, kinfo->unassigned_mem);
> >>>> -    if ( !allocate_bank_memory(kinfo, gaddr_to_gfn(GUEST_RAM1_BASE),
> >>>> -                               bank_size) )
> >>>> -        goto fail;
> >>>> -
> >>>> -    if ( kinfo->unassigned_mem )
> >>>> -        goto fail;
> >>>> -
> >>>> -    for( i = 0; i < mem->nr_banks; i++ )
> >>>> -    {
> >>>> -        printk(XENLOG_INFO "%pd BANK[%d] %#"PRIpaddr"-%#"PRIpaddr" 
> >>>> (%ldMB)\n",
> >>>> -               d,
> >>>> -               i,
> >>>> -               mem->bank[i].start,
> >>>> -               mem->bank[i].start + mem->bank[i].size,
> >>>> -               /* Don't want format this as PRIpaddr (16 digit hex) */
> >>>> -               (unsigned long)(mem->bank[i].size >> 20));
> >>>> -    }
> >>>> -
> >>>> -    return;
> >>>> -
> >>>> -fail:
> >>>> -    panic("Failed to allocate requested domain memory."
> >>>> -          /* Don't want format this as PRIpaddr (16 digit hex) */
> >>>> -          " %ldKB unallocated. Fix the VMs configurations.\n",
> >>>> -          (unsigned long)kinfo->unassigned_mem >> 10);
> >>>> -}
> >>>> -
> >>>>    #ifdef CONFIG_VGICV2
> >>>>    static int __init make_gicv2_domU_node(struct kernel_info *kinfo)
> >>>>    {
> >>>> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> >>>> index 2c30792de8..2b8cba9b2f 100644
> >>>> --- a/xen/arch/arm/domain_build.c
> >>>> +++ b/xen/arch/arm/domain_build.c
> >>>> @@ -416,7 +416,6 @@ static void __init allocate_memory_11(struct domain 
> >>>> *d,
> >>>>        }
> >>>>    }
> >>>>
> >>>> -#ifdef CONFIG_DOM0LESS_BOOT
> >>>>    bool __init allocate_domheap_memory(struct domain *d, paddr_t 
> >>>> tot_size,
> >>>>                                        alloc_domheap_mem_cb cb, void 
> >>>> *extra)
> >>>>    {
> >>>> @@ -508,7 +507,6 @@ bool __init allocate_bank_memory(struct kernel_info 
> >>>> *kinfo, gfn_t sgfn,
> >>>>
> >>>>        return true;
> >>>>    }
> >>>> -#endif
> >>>>
> >>>>    /*
> >>>>     * When PCI passthrough is available we want to keep the
> >>>> @@ -1003,6 +1001,94 @@ out:
> >>>>        return res;
> >>>>    }
> >>>>
> >>>> +void __init allocate_memory(struct domain *d, struct kernel_info *kinfo)
> >>>> +{
> >>>> +    struct membanks *mem = kernel_info_get_mem(kinfo);
> >>>> +    unsigned int i, nr_banks = GUEST_RAM_BANKS;
> >>>> +    paddr_t bank_start, bank_size;
> >>> Limit the scope
> >>>
> >>>> +    struct membanks *hwdom_free_mem = NULL;
> >>>> +    const uint64_t bankbase[] = GUEST_RAM_BANK_BASES;
> >>>> +    const uint64_t banksize[] = GUEST_RAM_BANK_SIZES;
> >>> Limit the scope
> >>>
> >>>> +
> >>>> +    printk(XENLOG_INFO "Allocating mappings totalling %ldMB for %pd:\n",
> >>>> +           /* Don't want format this as PRIpaddr (16 digit hex) */
> >>>> +           (unsigned long)(kinfo->unassigned_mem >> 20), d);
> >>>> +
> >>>> +    mem->nr_banks = 0;
> >>>> +    /*
> >>>> +     * Use host memory layout for hwdom. Only case for this is when LLC 
> >>>> coloring
> >>>> +     * is enabled.
> >>>> +     */
> >>>> +    if ( is_hardware_domain(d) )
> >>>> +    {
> >>>> +        ASSERT(llc_coloring_enabled);
> >>> This patch does not build because of declaration not being visible. You 
> >>> must include <xen/llc-coloring.h>.
> >>
> >> Piggying back on this comment. AFAICT, the code below would work also in
> >> the non cache coloring case. So what's the assert is for?
> >>
> >>>
> >>>> +
> >>>> +        hwdom_free_mem = xzalloc_flex_struct(struct membanks, bank,
> >>>> +                                             NR_MEM_BANKS);
> >>>> +        if ( !hwdom_free_mem )
> >>>> +            goto fail;
> >>>> +
> >>>> +        hwdom_free_mem->max_banks = NR_MEM_BANKS;
> >>>> +
> >>>> +        if ( find_unallocated_memory(kinfo, hwdom_free_mem) )
> >>> My remarks for the use of find_unallocated_memory() 1:1 have not been 
> >>> addressed. You did not even
> >>> change the comments inside the function. The problem is that the function 
> >>> is specifically designed
> >>> for finding extended regions and assumes being called at certain point 
> >>> i.e. dom0 RAM allocated, gnttab
> >>> region allocated, etc.
> >>
> >> So I agree that the function should be updated if we plan to use it for
> >> other purpose.
> >>
> >> My opinion is that we should attempt to make the function generic so
> >> that in your
> >>> case you can choose which regions to exclude, define even your own 
> >>> function to grab free regions (at the moment
> >>> add_ext_regions grabs banks >= 64M but you still discards banks >= 128M, 
> >>> so it's a bit wasteful.
> >>>
> >>> My very short attempt to make the function as generic as possible in the 
> >>> first iteration:
> >>> https://paste.debian.net/1338334/
> >>
> >> This looks better, but I wonder why we need still need to exclude the
> >> static regions? Wouldn't it be sufficient to exclude just reserved regions?
> > Static shared memory banks are not part of reserved memory (i.e. 
> > bootinfo.reserved_mem) if that's what you're asking.
> > They are stored in bootinfo.shmem, hence we need to take them into account 
> > when searching for unused address space.
>
> Oh I missed the fact you now pass "mem_banks" as a parameter. I thought
> they would still get excluded for cache coloring case.
>
> >
> > If you and Carlo are ok with my proposed solution for making the function 
> > generic, I can send a patch as a prerequisite
> > patch for Carlo series.
>
> I am fine with the approach.
>
> Cheers,
>
> --
> Julien Grall
>

> @@ -2152,7 +2238,10 @@ static int __init construct_dom0(struct domain *d)
>      /* type must be set before allocate_memory */
>      d->arch.type = kinfo.type;
>  #endif
> -    allocate_memory_11(d, &kinfo);
> +    if ( is_domain_direct_mapped(d) )
> +        allocate_memory_11(d, &kinfo);
> +    else
> +        allocate_memory(d, &kinfo);
>      find_gnttab_region(d, &kinfo);

Since find_gnttab_region() is called after allocate_memory(), kinfo->gnttab_*
fields aren't initialized and the call to find_unallocated_memory() with
gnttab as the region to exclude, fails ending in a crash since memory for
dom0 can't be allocated.

Can the solution be to call find_gnttab_region() before the above if?
Or should I just call it before allocate_memory() in one case, but still after
allocate_memory_11() in the other?

Thanks.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.