Message ID | 20180305160415.16760-57-andre.przywara@linaro.org |
---|---|
State | New |
Headers | show |
Series | New VGIC(-v2) implementation | expand |
Hi, On 05/03/18 16:04, Andre Przywara wrote: > At the moment we allocate exactly one page for struct vcpu on ARM, also > have a check in place to prevent it growing beyond 4KB. > As the struct includes the state of all 32 private (per-VCPU) interrupts, > we are at 3840 bytes on arm64 at the moment already. Growing the per-IRQ > VGIC structure even slightly makes the VCPU quickly exceed the 4K limit. > The new VGIC will need more space per virtual IRQ. I spent a few hours > trying to trim this down, but couldn't get it below 4KB, even with the > nasty hacks piling up to save some bytes here and there. > It turns out that beyond efficiency, maybe, there is no real technical > reason this struct has to fit in one page, so lifting the limit to two > pages seems like the most pragmatic solution. > > Signed-off-by: Andre Przywara <andre.przywara@linaro.org> > --- > Changelog RFC ... v1: > - no changes > > xen/arch/arm/domain.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c > index 11a46aa27f..0bec6aad17 100644 > --- a/xen/arch/arm/domain.c > +++ b/xen/arch/arm/domain.c > @@ -502,10 +502,13 @@ void dump_pageframe_info(struct domain *d) > struct vcpu *alloc_vcpu_struct(void) > { > struct vcpu *v; > - BUILD_BUG_ON(sizeof(*v) > PAGE_SIZE); > - v = alloc_xenheap_pages(0, 0); > - if ( v != NULL ) > + > + BUILD_BUG_ON(sizeof(*v) > 2 * PAGE_SIZE); > + v = alloc_xenheap_pages(1, 0); While I am still not a big fan of increasing struct vcpu. We should at least not blindly increase it for anyone. There are indeed some setup where the 8KB solution is not necessary. This is the case of Arm32, and Arm64 (with the old vGIC). I would also like to hear Stefano's opinion on that one. > + if ( v != NULL ) { > clear_page(v); > + clear_page((void *)v + PAGE_SIZE); > + } > return v; > } > > Cheers,
diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 11a46aa27f..0bec6aad17 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -502,10 +502,13 @@ void dump_pageframe_info(struct domain *d) struct vcpu *alloc_vcpu_struct(void) { struct vcpu *v; - BUILD_BUG_ON(sizeof(*v) > PAGE_SIZE); - v = alloc_xenheap_pages(0, 0); - if ( v != NULL ) + + BUILD_BUG_ON(sizeof(*v) > 2 * PAGE_SIZE); + v = alloc_xenheap_pages(1, 0); + if ( v != NULL ) { clear_page(v); + clear_page((void *)v + PAGE_SIZE); + } return v; }
At the moment we allocate exactly one page for struct vcpu on ARM, also have a check in place to prevent it growing beyond 4KB. As the struct includes the state of all 32 private (per-VCPU) interrupts, we are at 3840 bytes on arm64 at the moment already. Growing the per-IRQ VGIC structure even slightly makes the VCPU quickly exceed the 4K limit. The new VGIC will need more space per virtual IRQ. I spent a few hours trying to trim this down, but couldn't get it below 4KB, even with the nasty hacks piling up to save some bytes here and there. It turns out that beyond efficiency, maybe, there is no real technical reason this struct has to fit in one page, so lifting the limit to two pages seems like the most pragmatic solution. Signed-off-by: Andre Przywara <andre.przywara@linaro.org> --- Changelog RFC ... v1: - no changes xen/arch/arm/domain.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)