* [XEN VMID PATCH 1/2] xen/arm: Move p2m_vmid_allocator_init() inside setup_virt_paging() @ 2016-12-12 7:26 Bhupinder Thakur 2016-12-12 7:26 ` [XEN VMID PATCH 2/2 v3] xen/arm: Add support for 16 bit VMIDs Bhupinder Thakur 2016-12-13 14:06 ` [XEN VMID PATCH 1/2] xen/arm: Move p2m_vmid_allocator_init() inside setup_virt_paging() Julien Grall 0 siblings, 2 replies; 6+ messages in thread From: Bhupinder Thakur @ 2016-12-12 7:26 UTC (permalink / raw) To: xen-devel; +Cc: Julien Grall, Stefano Stabellini Since VMIDs are related to 2nd stage address translation, it makes more sense to move the call to p2m_vmid_allocator_init(), which initializes the vmid allocation bitmap, inside setup_virt_paging(), where 2nd stage address translation is set up. Signed-off-by: Bhupinder Thakur <bhupinder.thakur@linaro.org> --- xen/arch/arm/p2m.c | 3 +++ xen/arch/arm/setup.c | 2 -- xen/include/asm-arm/p2m.h | 3 --- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index cc5634b..d155c1d 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -1659,6 +1659,9 @@ void __init setup_virt_paging(void) #endif printk("P2M: %d levels with order-%d root, VTCR 0x%lx\n", 4 - P2M_ROOT_LEVEL, P2M_ROOT_ORDER, val); + + p2m_vmid_allocator_init(); + /* It is not allowed to concatenate a level zero root */ BUG_ON( P2M_ROOT_LEVEL == 0 && P2M_ROOT_ORDER > 0 ); setup_virt_paging_one((void *)val); diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 38eb888..ac49515 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -789,8 +789,6 @@ void __init start_xen(unsigned long boot_phys_offset, gic_init(); - p2m_vmid_allocator_init(); - softirq_init(); tasklet_subsys_init(); diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h index fdb6b47..0987be2 100644 --- a/xen/include/asm-arm/p2m.h +++ b/xen/include/asm-arm/p2m.h @@ -152,9 +152,6 @@ void p2m_altp2m_check(struct vcpu *v, uint16_t idx) /* Not supported on ARM. */ } -/* Initialise vmid allocator */ -void p2m_vmid_allocator_init(void); - /* Second stage paging setup, to be called on all CPUs */ void setup_virt_paging(void); -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [XEN VMID PATCH 2/2 v3] xen/arm: Add support for 16 bit VMIDs 2016-12-12 7:26 [XEN VMID PATCH 1/2] xen/arm: Move p2m_vmid_allocator_init() inside setup_virt_paging() Bhupinder Thakur @ 2016-12-12 7:26 ` Bhupinder Thakur 2016-12-13 14:13 ` Julien Grall 2016-12-13 14:06 ` [XEN VMID PATCH 1/2] xen/arm: Move p2m_vmid_allocator_init() inside setup_virt_paging() Julien Grall 1 sibling, 1 reply; 6+ messages in thread From: Bhupinder Thakur @ 2016-12-12 7:26 UTC (permalink / raw) To: xen-devel; +Cc: Julien Grall, Stefano Stabellini VMID space is increased to 16-bits from 8-bits in ARMv8 8.1 revision. This allows more than 256 VMs to be supported by Xen. This change adds support for 16-bit VMIDs in Xen based on whether the architecture supports it. Signed-off-by: Bhupinder Thakur <bhupinder.thakur@linaro.org> --- xen/arch/arm/p2m.c | 56 ++++++++++++++++++++++++++++++++++------- xen/include/asm-arm/p2m.h | 2 +- xen/include/asm-arm/processor.h | 18 ++++++++++++- 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index d155c1d..0c98616 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -7,6 +7,7 @@ #include <xen/vm_event.h> #include <xen/monitor.h> #include <xen/iocap.h> +#include <xen/xmalloc.h> #include <public/vm_event.h> #include <asm/flushtlb.h> #include <asm/gic.h> @@ -14,15 +15,23 @@ #include <asm/hardirq.h> #include <asm/page.h> +#define MAX_VMID_8_BIT (1UL << 8) +#define MAX_VMID_16_BIT (1UL << 16) + +#define INVALID_VMID 0 /* VMID 0 is reserved */ + #ifdef CONFIG_ARM_64 static unsigned int __read_mostly p2m_root_order; static unsigned int __read_mostly p2m_root_level; #define P2M_ROOT_ORDER p2m_root_order #define P2M_ROOT_LEVEL p2m_root_level +static unsigned int __read_mostly max_vmid = MAX_VMID_8_BIT; +#define MAX_VMID max_vmid #else /* First level P2M is alway 2 consecutive pages */ #define P2M_ROOT_LEVEL 1 #define P2M_ROOT_ORDER 1 +#define MAX_VMID MAX_VMID_8_BIT #endif #define P2M_ROOT_PAGES (1<<P2M_ROOT_ORDER) @@ -1219,7 +1228,7 @@ static int p2m_alloc_table(struct domain *d) p2m->root = page; - p2m->vttbr = page_to_maddr(p2m->root) | ((uint64_t)p2m->vmid & 0xff) << 48; + p2m->vttbr = page_to_maddr(p2m->root) | ((uint64_t)p2m->vmid << 48); /* * Make sure that all TLBs corresponding to the new VMID are flushed @@ -1230,20 +1239,32 @@ static int p2m_alloc_table(struct domain *d) return 0; } -#define MAX_VMID 256 -#define INVALID_VMID 0 /* VMID 0 is reserved */ static spinlock_t vmid_alloc_lock = SPIN_LOCK_UNLOCKED; /* - * VTTBR_EL2 VMID field is 8 bits. Using a bitmap here limits us to - * 256 concurrent domains. + * VTTBR_EL2 VMID field is 8 or 16 bits. Aarch64 supports 16-bit VMID. + * Using a bitmap here limits us to 256 or 65536 (for Aarch64) concurrent + * domains. The bitmap space will be allocated dynamically based on + * whether 8 or 16 bit VMIDs are supported. */ -static DECLARE_BITMAP(vmid_mask, MAX_VMID); +static unsigned long *vmid_mask; -void p2m_vmid_allocator_init(void) +int p2m_vmid_allocator_init(void) { - set_bit(INVALID_VMID, vmid_mask); + int ret = 0; + + /* + * allocate space for vmid_mask based on MAX_VMID + */ + vmid_mask = xzalloc_array(unsigned long, BITS_TO_LONGS(MAX_VMID)); + + if ( vmid_mask ) + set_bit(INVALID_VMID, vmid_mask); + else + ret = -1; + + return ret; } static int p2m_alloc_vmid(struct domain *d) @@ -1632,20 +1653,36 @@ void __init setup_virt_paging(void) unsigned int cpu; unsigned int pa_range = 0x10; /* Larger than any possible value */ + unsigned int vmid_8_bit_flag = 0; for_each_online_cpu ( cpu ) { const struct cpuinfo_arm *info = &cpu_data[cpu]; if ( info->mm64.pa_range < pa_range ) pa_range = info->mm64.pa_range; + + /* set a flag if the current cpu does not suppot 16 bit VMIDs */ + if ( info->mm64.vmid_bits != MM64_VMID_16_BITS_SUPPORT ) + vmid_8_bit_flag = 1; } + /* + * if the flag is not set then it means all CPUs support 16-bit + * VMIDs. + */ + if ( !vmid_8_bit_flag ) + max_vmid = MAX_VMID_16_BIT; + /* pa_range is 4 bits, but the defined encodings are only 3 bits */ if ( pa_range&0x8 || !pa_range_info[pa_range].pabits ) panic("Unknown encoding of ID_AA64MMFR0_EL1.PARange %x\n", pa_range); val |= VTCR_PS(pa_range); val |= VTCR_TG0_4K; + + /* set the VS bit only if 16 bit VMID is supported */ + if ( MAX_VMID == MAX_VMID_16_BIT ) + val |= VTCR_VS; val |= VTCR_SL0(pa_range_info[pa_range].sl0); val |= VTCR_T0SZ(pa_range_info[pa_range].t0sz); @@ -1660,7 +1697,8 @@ void __init setup_virt_paging(void) printk("P2M: %d levels with order-%d root, VTCR 0x%lx\n", 4 - P2M_ROOT_LEVEL, P2M_ROOT_ORDER, val); - p2m_vmid_allocator_init(); + if ( p2m_vmid_allocator_init() != 0 ) + panic("Could not allocate VMID bitmap space"); /* It is not allowed to concatenate a level zero root */ BUG_ON( P2M_ROOT_LEVEL == 0 && P2M_ROOT_ORDER > 0 ); diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h index 0987be2..9de55fc 100644 --- a/xen/include/asm-arm/p2m.h +++ b/xen/include/asm-arm/p2m.h @@ -30,7 +30,7 @@ struct p2m_domain { struct page_info *root; /* Current VMID in use */ - uint8_t vmid; + uint16_t vmid; /* Current Translation Table Base Register for the p2m */ uint64_t vttbr; diff --git a/xen/include/asm-arm/processor.h b/xen/include/asm-arm/processor.h index 15bf890..48ce59b 100644 --- a/xen/include/asm-arm/processor.h +++ b/xen/include/asm-arm/processor.h @@ -215,6 +215,8 @@ #define VTCR_PS(x) ((x)<<16) +#define VTCR_VS (_AC(0x1,UL)<<19) + #endif #define VTCR_RES1 (_AC(1,UL)<<31) @@ -269,6 +271,11 @@ /* FSR long format */ #define FSRL_STATUS_DEBUG (_AC(0x22,UL)<<0) +#ifdef CONFIG_ARM_64 +#define MM64_VMID_8_BITS_SUPPORT 0x0 +#define MM64_VMID_16_BITS_SUPPORT 0x2 +#endif + #ifndef __ASSEMBLY__ struct cpuinfo_arm { @@ -337,7 +344,16 @@ struct cpuinfo_arm { unsigned long tgranule_64K:4; unsigned long tgranule_4K:4; unsigned long __res0:32; - }; + + unsigned long hafdbs:4; + unsigned long vmid_bits:4; + unsigned long vh:4; + unsigned long hpds:4; + unsigned long lo:4; + unsigned long pan:4; + unsigned long __res1:8; + unsigned long __res2:32; + }; } mm64; struct { -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [XEN VMID PATCH 2/2 v3] xen/arm: Add support for 16 bit VMIDs 2016-12-12 7:26 ` [XEN VMID PATCH 2/2 v3] xen/arm: Add support for 16 bit VMIDs Bhupinder Thakur @ 2016-12-13 14:13 ` Julien Grall 2016-12-15 6:04 ` Bhupinder Thakur 0 siblings, 1 reply; 6+ messages in thread From: Julien Grall @ 2016-12-13 14:13 UTC (permalink / raw) To: Bhupinder Thakur, xen-devel; +Cc: Stefano Stabellini Hi Bhupinder, On 12/12/16 07:26, Bhupinder Thakur wrote: [...] > -void p2m_vmid_allocator_init(void) > +int p2m_vmid_allocator_init(void) > { > - set_bit(INVALID_VMID, vmid_mask); > + int ret = 0; > + > + /* > + * allocate space for vmid_mask based on MAX_VMID > + */ > + vmid_mask = xzalloc_array(unsigned long, BITS_TO_LONGS(MAX_VMID)); I would directly handle the panic within this function rather than return an error. I.e if ( !vmid_mask ) panic(....); This would simplify the logic a bit. > + > + if ( vmid_mask ) > + set_bit(INVALID_VMID, vmid_mask); > + else > + ret = -1; > + > + return ret; > } > > static int p2m_alloc_vmid(struct domain *d) > @@ -1632,20 +1653,36 @@ void __init setup_virt_paging(void) > > unsigned int cpu; > unsigned int pa_range = 0x10; /* Larger than any possible value */ > + unsigned int vmid_8_bit_flag = 0; Please use bool: bool vmid_8_bit_flag = false; I would also drop _flag as it is not necessary. > > for_each_online_cpu ( cpu ) > { > const struct cpuinfo_arm *info = &cpu_data[cpu]; > if ( info->mm64.pa_range < pa_range ) > pa_range = info->mm64.pa_range; > + > + /* set a flag if the current cpu does not suppot 16 bit VMIDs */ > + if ( info->mm64.vmid_bits != MM64_VMID_16_BITS_SUPPORT ) > + vmid_8_bit_flag = 1; s/1/true/ The rest of the patch looks good to me. Cheers, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [XEN VMID PATCH 2/2 v3] xen/arm: Add support for 16 bit VMIDs 2016-12-13 14:13 ` Julien Grall @ 2016-12-15 6:04 ` Bhupinder Thakur 0 siblings, 0 replies; 6+ messages in thread From: Bhupinder Thakur @ 2016-12-15 6:04 UTC (permalink / raw) To: Julien Grall; +Cc: xen-devel, Stefano Stabellini Hi Julien, On 13 December 2016 at 19:43, Julien Grall <julien.grall@arm.com> wrote: > Hi Bhupinder, > > On 12/12/16 07:26, Bhupinder Thakur wrote: > > [...] > >> -void p2m_vmid_allocator_init(void) >> +int p2m_vmid_allocator_init(void) >> { >> - set_bit(INVALID_VMID, vmid_mask); >> + int ret = 0; >> + >> + /* >> + * allocate space for vmid_mask based on MAX_VMID >> + */ >> + vmid_mask = xzalloc_array(unsigned long, BITS_TO_LONGS(MAX_VMID)); > > > I would directly handle the panic within this function rather than return an > error. I.e > > if ( !vmid_mask ) > panic(....); > > This would simplify the logic a bit. > ok. I will modify the code accordingly. >> static int p2m_alloc_vmid(struct domain *d) >> @@ -1632,20 +1653,36 @@ void __init setup_virt_paging(void) >> >> unsigned int cpu; >> unsigned int pa_range = 0x10; /* Larger than any possible value */ >> + unsigned int vmid_8_bit_flag = 0; > > > Please use bool: > > bool vmid_8_bit_flag = false; > > I would also drop _flag as it is not necessary. ok. I will modify the code accordingly. > >> >> for_each_online_cpu ( cpu ) >> { >> const struct cpuinfo_arm *info = &cpu_data[cpu]; >> if ( info->mm64.pa_range < pa_range ) >> pa_range = info->mm64.pa_range; >> + >> + /* set a flag if the current cpu does not suppot 16 bit VMIDs */ >> + if ( info->mm64.vmid_bits != MM64_VMID_16_BITS_SUPPORT ) >> + vmid_8_bit_flag = 1; > > > s/1/true/ > ok > The rest of the patch looks good to me. > > Cheers, > > -- > Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [XEN VMID PATCH 1/2] xen/arm: Move p2m_vmid_allocator_init() inside setup_virt_paging() 2016-12-12 7:26 [XEN VMID PATCH 1/2] xen/arm: Move p2m_vmid_allocator_init() inside setup_virt_paging() Bhupinder Thakur 2016-12-12 7:26 ` [XEN VMID PATCH 2/2 v3] xen/arm: Add support for 16 bit VMIDs Bhupinder Thakur @ 2016-12-13 14:06 ` Julien Grall 2016-12-13 14:09 ` Julien Grall 1 sibling, 1 reply; 6+ messages in thread From: Julien Grall @ 2016-12-13 14:06 UTC (permalink / raw) To: Bhupinder Thakur, xen-devel; +Cc: Stefano Stabellini Hi Bhupinder, On 12/12/16 07:26, Bhupinder Thakur wrote: > Since VMIDs are related to 2nd stage address translation, it makes more sense > to move the call to p2m_vmid_allocator_init(), which initializes the vmid > allocation bitmap, inside setup_virt_paging(), where 2nd stage address translation > is set up. > > Signed-off-by: Bhupinder Thakur <bhupinder.thakur@linaro.org> Reviewed-by: Julien Grall <julien.grall@arm.com> Regards, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [XEN VMID PATCH 1/2] xen/arm: Move p2m_vmid_allocator_init() inside setup_virt_paging() 2016-12-13 14:06 ` [XEN VMID PATCH 1/2] xen/arm: Move p2m_vmid_allocator_init() inside setup_virt_paging() Julien Grall @ 2016-12-13 14:09 ` Julien Grall 0 siblings, 0 replies; 6+ messages in thread From: Julien Grall @ 2016-12-13 14:09 UTC (permalink / raw) To: Bhupinder Thakur, xen-devel; +Cc: Stefano Stabellini On 13/12/16 14:06, Julien Grall wrote: > Hi Bhupinder, > > On 12/12/16 07:26, Bhupinder Thakur wrote: >> Since VMIDs are related to 2nd stage address translation, it makes >> more sense >> to move the call to p2m_vmid_allocator_init(), which initializes the vmid >> allocation bitmap, inside setup_virt_paging(), where 2nd stage address >> translation >> is set up. >> >> Signed-off-by: Bhupinder Thakur <bhupinder.thakur@linaro.org> > > Reviewed-by: Julien Grall <julien.grall@arm.com> Actually, one minor change. The function p2m_vmid_allocator_init does not need to be exported anymore. So can you please make it static? With that, you can keep my reviewed-by tag. Cheers, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-12-15 6:04 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-12-12 7:26 [XEN VMID PATCH 1/2] xen/arm: Move p2m_vmid_allocator_init() inside setup_virt_paging() Bhupinder Thakur 2016-12-12 7:26 ` [XEN VMID PATCH 2/2 v3] xen/arm: Add support for 16 bit VMIDs Bhupinder Thakur 2016-12-13 14:13 ` Julien Grall 2016-12-15 6:04 ` Bhupinder Thakur 2016-12-13 14:06 ` [XEN VMID PATCH 1/2] xen/arm: Move p2m_vmid_allocator_init() inside setup_virt_paging() Julien Grall 2016-12-13 14:09 ` Julien Grall
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).