[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 7/7] xen/arm: disable CPUs with different dcache line sizes
On Tue, 6 Mar 2018, Julien Grall wrote: > Hi Stefano, > > Something is wrong with your threading again. Patch #2-7 have "In-Reply-To" > matching patch #1 and not the cover letter. Thanks, I lost my git configuration. > On 02/03/18 19:06, Stefano Stabellini wrote: > > Even different cpus in big.LITTLE systems are expected to have the same > > dcache line size. Unless the minimum of all dcache line sizes is used > > across all cpu cores, cache coherency protocols can go wrong. Instead, > > for now, just disable any cpu with a different dcache line size. > > > > This check is not covered by the hmp-unsafe option, because even with > > the correct scheduling and vcpu pinning in place, the system breaks if > > dcache line sizes differ across cores. We don't believe it is a problem > > for most big.LITTLE systems. > > > > This patch moves the implementation of setup_cache to a static inline, > > still setting dcache_line_bytes at the beginning of start_xen as > > before. > > > > In start_secondary we check that the dcache level 1 line sizes match, > > otherwise we disable the cpu. > > > > Suggested-by: Julien Grall <julien.grall@xxxxxxx> > > Signed-off-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > > > > --- > > Changes in v4: > > - improve commit message > > - use %zu > > --- > > xen/arch/arm/setup.c | 14 +------------- > > xen/arch/arm/smpboot.c | 8 ++++++++ > > xen/include/asm-arm/page.h | 11 +++++++++++ > > 3 files changed, 20 insertions(+), 13 deletions(-) > > > > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > > index fced75a..6ccfdab 100644 > > --- a/xen/arch/arm/setup.c > > +++ b/xen/arch/arm/setup.c > > @@ -682,18 +682,6 @@ static void __init setup_mm(unsigned long dtb_paddr, > > size_t dtb_size) > > size_t __read_mostly dcache_line_bytes; > > -/* Very early check of the CPU cache properties */ > > -void __init setup_cache(void) > > -{ > > - uint32_t ctr; > > - > > - /* Read CTR */ > > - ctr = READ_SYSREG32(CTR_EL0); > > - > > - /* Bits 16-19 are the log2 number of words in the cacheline. */ > > - dcache_line_bytes = (size_t) (4 << ((ctr >> 16) & 0xf)); > > -} > > - > > /* C entry point for boot CPU */ > > void __init start_xen(unsigned long boot_phys_offset, > > unsigned long fdt_paddr, > > @@ -707,7 +695,7 @@ void __init start_xen(unsigned long boot_phys_offset, > > struct domain *dom0; > > struct xen_arch_domainconfig config; > > - setup_cache(); > > + dcache_line_bytes = read_dcache_line_size(); > > It feels a bit odd to have one call dcache_line_bytes and the other call > read_dcache_line_size. Would it be possible to uniformize the name? > > With that: > > Reviewed-by: Julien Grall <julien.grall@xxxxxxx> I fixed that and the other in-code comment, and committed the whole series, thanks! > > percpu_init_areas(); > > set_processor_id(0); /* needed early, for smp_processor_id() */ > > diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c > > index 04efb33..d15230b 100644 > > --- a/xen/arch/arm/smpboot.c > > +++ b/xen/arch/arm/smpboot.c > > @@ -323,6 +323,14 @@ void start_secondary(unsigned long boot_phys_offset, > > stop_cpu(); > > } > > + if ( dcache_line_bytes != read_dcache_line_size() ) > > + { > > + printk(XENLOG_ERR "CPU%u dcache line size (%zu) does not match the > > boot CPU (%zu)\n", > > + smp_processor_id(), read_dcache_line_size(), > > + dcache_line_bytes); > > + stop_cpu(); > > + } > > + > > mmu_init_secondary_cpu(); > > gic_init_secondary_cpu(); > > diff --git a/xen/include/asm-arm/page.h b/xen/include/asm-arm/page.h > > index ce18f0c..e539f83 100644 > > --- a/xen/include/asm-arm/page.h > > +++ b/xen/include/asm-arm/page.h > > @@ -138,6 +138,17 @@ extern size_t dcache_line_bytes; > > #define copy_page(dp, sp) memcpy(dp, sp, PAGE_SIZE) > > +static inline size_t read_dcache_line_size(void) > > +{ > > + uint32_t ctr; > > + > > + /* Read CTR */ > > + ctr = READ_SYSREG32(CTR_EL0); > > + > > + /* Bits 16-19 are the log2 number of words in the cacheline. */ > > + return (size_t) (4 << ((ctr >> 16) & 0xf)); > > +} > > + > > /* Functions for flushing medium-sized areas. > > * if 'range' is large enough we might want to use model-specific > > * full-cache flushes. */ > > > > Cheers, > > -- > Julien Grall > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |