[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/arm: p2m: Populate pages for GICv2 mapping in arch_domain_create()
On 13/10/2022 10:40, Henry Wang wrote: Hi Andrew,-----Original Message----- From: Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx> Subject: Re: [PATCH] xen/arm: p2m: Populate pages for GICv2 mapping in arch_domain_create() On 13/10/2022 09:38, Henry Wang wrote:Hardware using GICv2 needs to create a P2M mapping of 8KB GICv2 area when the domain is created. Considering the worst case of page tables and keep a buffer, populate 16 pages as the default value to the P2M pages pool in arch_domain_create() at the domain creation stage to satisfy the GICv2 requirement. Fixes: cbea5a1149ca ("xen/arm: Allocate and free P2M pages from the P2Mpool")Suggested-by: Julien Grall <jgrall@xxxxxxxxxx> Signed-off-by: Henry Wang <Henry.Wang@xxxxxxx> --- This should also be backported to 4.13, 4.14, 4.15 and 4.16. --- xen/arch/arm/domain.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 2c84e6dbbb..e40e2bcba1 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -740,6 +740,20 @@ int arch_domain_create(struct domain *d, BUG(); } + spin_lock(&d->arch.paging.lock); + /* + * Hardware using GICv2 needs to create a P2M mapping of 8KB GICv2area+ * when the domain is created. Considering the worst case for page + * tables and keep a buffer, populate 16 pages to the P2M pages poolhere.+ */ + if ( (rc = p2m_set_allocation(d, 16, NULL)) != 0 ) + { + p2m_set_allocation(d, 0, NULL); + spin_unlock(&d->arch.paging.lock); + goto fail; + } + spin_unlock(&d->arch.paging.lock);Generally, this would be better written as spin_lock(); if ( rc = p2m_set_allocation(16) ) p2m_set_allocation(0) spin_unlock(); if ( rc ) goto fail; to reduce the number of spin_unlock() calls and make the error paths more clear. However...I think in Arm's arch_domain_create(), all the error handling are the same style using: if ( (rc = <function>) !=0 ) goto fail; and we need to keep them the same? We don't have too. I agree with Andrew's point. How about the following: spin_lock() rc = ... spin_unlock() if ( rc ) goto fail; Cheers, -- Julien Grall
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |