|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5 7/7] xen/arm: introduce allocate_static_memory
On Thu, 2 Sep 2021, Stefano Stabellini wrote:
> On Tue, 24 Aug 2021, Penny Zheng wrote:
> > This commit introduces allocate_static_memory to allocate static memory as
> > guest RAM for Domain on Static Allocation.
> >
> > It uses acquire_domstatic_pages to acquire pre-configured static memory
> > for this domain, and uses guest_physmap_add_pages to set up P2M table.
> > These pre-defined static memory banks shall be mapped to the fixed guest RAM
> > banks. And only when they exhausts the current guest RAM bank, it will seek
> > to the next one.
> >
> > In order to deal with the trouble of count-to-order conversion when page
> > number
> > is not in a power-of-two, this commit exports p2m_insert_mapping and
> > introduce
> > a new function guest_physmap_add_pages to cope with adding guest RAM p2m
> > mapping with nr_pages.
> >
> > Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
> > ---
> > v5 changes:
> > - don't split comment over multi-line (even they are more than 80
> > characters)
> > - simply use dt_find_property(node, "xen,static-mem", NULL) to tell
> > whether using allocate_static_memory, and add error comment when
> > "xen,static-mem" is used but CONFIG_STATIC_MEMORY is not enabled.
> > - exporting p2m_insert_mapping() and introduce guest_physmap_add_pages
> > to cope with adding guest RAM p2m mapping with nr_pages.
> > - check both pbase and psize are page aligned
> > - simplify the code in the loops by moving append_static_memory_to_bank()
> > outside of the if/else.
> > ---
> > xen/arch/arm/domain_build.c | 156 +++++++++++++++++++++++++++++++++++-
> > xen/arch/arm/p2m.c | 7 +-
> > xen/include/asm-arm/p2m.h | 11 +++
> > 3 files changed, 168 insertions(+), 6 deletions(-)
> >
> > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> > index 6c86d52781..843b8514c7 100644
> > --- a/xen/arch/arm/domain_build.c
> > +++ b/xen/arch/arm/domain_build.c
> > @@ -480,6 +480,148 @@ fail:
> > (unsigned long)kinfo->unassigned_mem >> 10);
> > }
> >
> > +#ifdef CONFIG_STATIC_MEMORY
> > +static bool __init append_static_memory_to_bank(struct domain *d,
> > + struct membank *bank,
> > + mfn_t smfn,
> > + paddr_t size)
> > +{
> > + int res;
> > + unsigned int nr_pages = size >> PAGE_SHIFT;
> ^ PFN_DOWN
>
>
> > + /* Infer next GFN. */
> > + gfn_t sgfn = gaddr_to_gfn(bank->start + bank->size);
> > +
> > + res = guest_physmap_add_pages(d, sgfn, smfn, nr_pages);
> > + if ( res )
> > + {
> > + dprintk(XENLOG_ERR, "Failed to map pages to DOMU: %d", res);
> > + return false;
> > + }
> > +
> > + bank->size = bank->size + size;
> > +
> > + return true;
> > +}
> > +
> > +/* Allocate memory from static memory as RAM for one specific domain d. */
> > +static void __init allocate_static_memory(struct domain *d,
> > + struct kernel_info *kinfo,
> > + const struct dt_device_node
> > *node)
> > +{
> > + const struct dt_property *prop;
> > + u32 addr_cells, size_cells, reg_cells;
> > + unsigned int nr_banks, gbank = 0, bank = 0;
> > + const uint64_t rambase[] = GUEST_RAM_BANK_BASES;
> > + const uint64_t ramsize[] = GUEST_RAM_BANK_SIZES;
> > + const __be32 *cell;
> > + u64 tot_size = 0;
> > + paddr_t pbase, psize, gsize;
> > + mfn_t smfn;
> > + int res;
> > +
> > + prop = dt_find_property(node, "xen,static-mem", NULL);
> > + if ( !dt_property_read_u32(node, "#xen,static-mem-address-cells",
> > + &addr_cells) )
> > + {
> > + printk(XENLOG_ERR
> > + "%pd: failed to read \"#xen,static-mem-address-cells\".\n",
> > d);
> > + goto fail;
> > + }
> > +
> > + if ( !dt_property_read_u32(node, "#xen,static-mem-size-cells",
> > + &size_cells) )
> > + {
> > + printk(XENLOG_ERR
> > + "%pd: failed to read \"#xen,static-mem-size-cells\".\n", d);
> > + goto fail;
> > + }
> > + reg_cells = addr_cells + size_cells;
> > +
> > + /* Start with GUEST_RAM0. */
> > + gsize = ramsize[gbank];
> > + kinfo->mem.bank[gbank].start = rambase[gbank];
> > +
> > + cell = (const __be32 *)prop->value;
> > + nr_banks = (prop->length) / (reg_cells * sizeof (u32));
> > +
> > + for ( ; bank < nr_banks; bank++ )
> > + {
> > + device_tree_get_reg(&cell, addr_cells, size_cells, &pbase, &psize);
> > + ASSERT(IS_ALIGNED(pbase, PAGE_SIZE) && IS_ALIGNED(psize,
> > PAGE_SIZE));
> > +
> > + smfn = maddr_to_mfn(pbase);
> > + res = acquire_domstatic_pages(d, smfn, psize >> PAGE_SHIFT, 0);
> ^ PFN_DOWN(psize)
>
>
> > + if ( res )
> > + {
> > + printk(XENLOG_ERR
> > + "%pd: failed to acquire static memory: %d.\n", d, res);
> > + goto fail;
> > + }
> > +
> > + printk(XENLOG_INFO "%pd: STATIC BANK[%u]
> > %#"PRIpaddr"-%#"PRIpaddr"\n",
> > + d, bank, pbase, pbase + psize);
> > +
> > + /*
> > + * It shall be mapped to the fixed guest RAM
> > banks(GUEST_RAM_BANK_BASES),
> > + * And only when it exhausts the current guest RAM bank, it will
> > seek
> > + * to the next.
> > + */
> > + while ( 1 )
> > + {
> > + /* Map as much as possible the static range to the guest bank
> > */
> > + if ( !append_static_memory_to_bank(d, &kinfo->mem.bank[gbank],
> > smfn,
> > + min(psize, gsize)) )
> > + goto fail;
> > +
> > + /*
> > + * The current physical bank is fully mapped.
> > + * Handle the next physical bank.
> > + */
> > + if ( gsize >= psize )
> > + {
> > + gsize = gsize - psize;
> > + break;
> > + }
> > + /*
> > + * When current guest bank size is not enough to map.
> > + * Before seeking to the next, check if we still have available
> > + * guest bank.
> > + */
> > + else if ( (gbank + 1) >= GUEST_RAM_BANKS )
> > + {
> > + printk(XENLOG_ERR "Exhausted all fixed guest banks.\n");
> > + goto fail;
> > + }
> > + else
> > + {
> > + psize = psize - gsize;
> > + smfn = mfn_add(smfn, gsize >> PAGE_SHIFT);
> ^ PFN_DOWN
>
>
> > + /* Update to the next guest bank. */
> > + gbank++;
> > + gsize = ramsize[gbank];
> > + kinfo->mem.bank[gbank].start = rambase[gbank];
> > + }
> > + }
> > +
> > + tot_size += psize;
> > + }
> > +
> > + kinfo->mem.nr_banks = ++gbank;
> > + kinfo->unassigned_mem -= tot_size;
> > + if ( kinfo->unassigned_mem )
> > + {
> > + printk(XENLOG_ERR
> > + "Size of \"memory\" property doesn't match up with the
> > sum-up of \"xen,static-mem\".\n");
> > + goto fail;
>
> Do we need to make this a fatal failure?
>
> I am asking because unassigned_mem comes from the "memory" property of
> the domain in device tree which is kind of redundant with the
> introduction of xen,static-mem. In fact, I think it would be better to
> clarify the role of "memory" when "xen,static-mem" is also present.
> In that case, we could even make "memory" optional.
>
> In any case, even if we don't make "memory" optional, it might still be
> good to turn this error into a warning and ignore the remaining
> kinfo->unassigned_mem.
One more thing: if we decide to make "memory" optional, we need to avoid
failing if it is not present at the beginning of construct_domU (if
xen,static-mem is present).
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |