|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 5/8] xen/arm: Add additional reference to owner domain when the owner is allocated
On Tue, 17 May 2022, Penny Zheng wrote:
> Borrower domain will fail to get a page ref using the owner domain
> during allocation, when the owner is created after borrower.
>
> So here, we decide to get and add the right amount of reference, which
> is the number of borrowers, when the owner is allocated.
>
> Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
> v4 changes:
> - no change
> ---
> v3 change:
> - printk rather than dprintk since it is a serious error
> ---
> v2 change:
> - new commit
> ---
> xen/arch/arm/domain_build.c | 62 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 62 insertions(+)
>
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 59591e3c6e..3a20247836 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -794,6 +794,34 @@ static mfn_t __init acquire_shared_memory_bank(struct
> domain *d,
>
> }
>
> +static int __init acquire_nr_borrower_domain(struct domain *d,
> + paddr_t pbase, paddr_t psize,
> + unsigned long *nr_borrowers)
> +{
> + unsigned long bank;
> +
> + /* Iterate reserved memory to find requested shm bank. */
> + for ( bank = 0 ; bank < bootinfo.reserved_mem.nr_banks; bank++ )
> + {
> + paddr_t bank_start = bootinfo.reserved_mem.bank[bank].start;
> + paddr_t bank_size = bootinfo.reserved_mem.bank[bank].size;
> +
> + if ( pbase == bank_start && psize == bank_size )
> + break;
> + }
> +
> + if ( bank == bootinfo.reserved_mem.nr_banks )
> + return -ENOENT;
> +
> + if ( d == dom_io )
> + *nr_borrowers = bootinfo.reserved_mem.bank[bank].nr_shm_domain;
> + else
> + /* Exclude the owner domain itself. */
> + *nr_borrowers = bootinfo.reserved_mem.bank[bank].nr_shm_domain - 1;
> +
> + return 0;
> +}
> +
> /*
> * Func allocate_shared_memory is supposed to be only called
> * from the owner.
> @@ -805,6 +833,8 @@ static int __init allocate_shared_memory(struct domain *d,
> {
> mfn_t smfn;
> int ret = 0;
> + unsigned long nr_pages, nr_borrowers, i;
> + struct page_info *page;
>
> dprintk(XENLOG_INFO,
> "Allocate static shared memory BANK
> %#"PRIpaddr"-%#"PRIpaddr".\n",
> @@ -819,6 +849,7 @@ static int __init allocate_shared_memory(struct domain *d,
> * DOMID_IO is the domain, like DOMID_XEN, that is not auto-translated.
> * It sees RAM 1:1 and we do not need to create P2M mapping for it
> */
> + nr_pages = PFN_DOWN(psize);
> if ( d != dom_io )
> {
> ret = guest_physmap_add_pages(d, gaddr_to_gfn(gbase), smfn,
> PFN_DOWN(psize));
> @@ -830,6 +861,37 @@ static int __init allocate_shared_memory(struct domain
> *d,
> }
> }
>
> + /*
> + * Get the right amount of references per page, which is the number of
> + * borrow domains.
> + */
> + ret = acquire_nr_borrower_domain(d, pbase, psize, &nr_borrowers);
> + if ( ret )
> + return ret;
> +
> + /*
> + * Instead of let borrower domain get a page ref, we add as many
> + * additional reference as the number of borrowers when the owner
> + * is allocated, since there is a chance that owner is created
> + * after borrower.
> + */
> + page = mfn_to_page(smfn);
> + for ( i = 0; i < nr_pages; i++ )
> + {
> + if ( !get_page_nr(page + i, d, nr_borrowers) )
> + {
> + printk(XENLOG_ERR
> + "Failed to add %lu references to page %"PRI_mfn".\n",
> + nr_borrowers, mfn_x(smfn) + i);
> + goto fail;
> + }
> + }
> +
> + return 0;
> +
> + fail:
> + while ( --i >= 0 )
> + put_page_nr(page + i, nr_borrowers);
> return ret;
> }
>
> --
> 2.25.1
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |