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

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



Hi Michal,

On Thu, Nov 28, 2024 at 11:34 AM Michal Orzel <michal.orzel@xxxxxxx> wrote:
> On 19/11/2024 15:13, 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>
> > ---
> > 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             | 96 +++++++++++++++++++++++--
> >  xen/arch/arm/include/asm/domain_build.h |  1 +
> >  3 files changed, 93 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..a95376dcdc 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,93 @@ 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 = 2;
> Instead of hardcoding, shouldn't it be GUEST_RAM_BANKS?

Right.

> Also, the second bank won't work with CONFIG_ARM_PA_BITS_32 which limits PA 
> to 32bit.

How is this being addressed in the current allocate_memory?
Also, LLC_COLORING depends on ARM_64. ARM_PA_BITS_32 requires ARM_32, so the
two configurations should be incompatible as of now.

> > +    paddr_t bank_start, bank_size;
> > +    struct membanks *hwdom_ext_regions = NULL;
> AFAICT you search for free memory. Naming it as extended regions is not a 
> good choice.
> Instead, hwdom_free_mem?

Yes.

> > +
> > +    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);
> > +
> > +        hwdom_ext_regions = xzalloc_flex_struct(struct membanks, bank,
> > +                                                NR_MEM_BANKS);
> > +        if ( !hwdom_ext_regions )
> > +            goto fail;
> empty line here please
>
> > +        hwdom_ext_regions->max_banks = NR_MEM_BANKS;
> > +
> > +        if ( find_unallocated_memory(kinfo, hwdom_ext_regions) )
> If you reuse find_unallocated_memory for a purpose other than extended 
> regions, I think
> the description of this function should change as well as comments inside.

I can definetely change that.

> Today, the function gets all RAM and exclude dom0 RAM (in your case is 0 at 
> this point, reserved memory,
> static shmem and gnttab (in your case is 0 at this point). I think we cannot 
> get away without
> making this function more generic. Maybe it should take as a parameter struct 
> membanks * array?
> Also, the callback add_ext_regions() may not be suited for all purposes (i.e. 
> it takes only banks
> > 64MB into account). I know that there will be more use cases for a function 
> > that will return the
> free memory for domains. As an example, today, for direct mapped domains we 
> hardcode the gnttab region
> (only dom0 is special cased). This should not be like that. We would need to 
> find a free memory region
> to expose as gnttab.

For the current cases (including llc coloring) it works. If there are no
objections, a TODO plus comments and description changes you talked above is
probably sufficient to cover the (current) use-cases and "ensure" this is not
forgotten for the future extension you mention.

> > +            goto fail;
> > +
> > +        nr_banks = hwdom_ext_regions->nr_banks;
> > +    }
> > +
> > +    for ( i = 0; kinfo->unassigned_mem > 0 && nr_banks > 0; i++, 
> > nr_banks-- )
> > +    {
> > +        if ( is_hardware_domain(d) )
> > +        {
> > +            bank_start = hwdom_ext_regions->bank[i].start;
> > +            bank_size = hwdom_ext_regions->bank[i].size;
> > +
> > +            if ( bank_size < min_t(paddr_t, kinfo->unassigned_mem, 
> > MB(128)) )
> I would expect some explanation.
>
> > +                continue;
> > +        }
> > +        else
> > +        {
> > +            if ( i == 0 )
> > +            {
> > +                bank_start = GUEST_RAM0_BASE;
> > +                bank_size = GUEST_RAM0_SIZE;
> > +            }
> > +            else if ( i == 1 )
> > +            {
> > +                bank_start = GUEST_RAM1_BASE;
> > +                bank_size = GUEST_RAM1_SIZE;
> > +            }
> > +            else
> > +                goto fail;
> This could be simplified:
> const uint64_t bankbase[] = GUEST_RAM_BANK_BASES;
> const uint64_t banksize[] = GUEST_RAM_BANK_SIZES;
>
> if ( i >= GUEST_RAM_BANKS )
>     goto fail;
>
> bank_start = bankbase[i];
> bank_size = banksize[i];

Ok.

> This patch requires also opinion of other maintainers.
>
> ~Michal

Thanks.

- Carlo



 


Rackspace

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