[PATCH V2] arm64: add DSB after icache flush in __flush_icache_all()

Will Deacon will.deacon at arm.com
Tue Jan 28 11:14:02 EST 2014


On Tue, Jan 28, 2014 at 07:06:53AM +0000, Vinayak Kale wrote:
> Add DSB after icache flush. It's needed to complete the cache maintenance
> operation. The function __flush_icache_all() is used only for user space
> mappings and an ISB is not required because of an exception return before
> executing user instructions. An exception return would behave like an ISB.
> 
> This patch also uses 'memory' clobber for flush operation instruction to 
> prevent instruction re-ordering by compiler. 
> 
> Signed-off-by: Vinayak Kale <vkale at apm.com>
> ---
> 
> V2: - Add more desciption in the commit message as suggested by Catalin & Will
>     - Use 'memory' clobber for flush instruction as suggested by Will

Please can you check and fix other occurrences of this bug too, as I asked
in v1? For example, a 2 second grep shows problems with data-cache
maintenance in kvm. I can also see the same problem for system register
writes followed up with isb.

I also don't buy you not being able to test AArch32 kernels. Does KVM not
work for you?

Will

> 
>  arch/arm64/include/asm/cacheflush.h | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm64/include/asm/cacheflush.h b/arch/arm64/include/asm/cacheflush.h
> index fea9ee3..bd30f42 100644
> --- a/arch/arm64/include/asm/cacheflush.h
> +++ b/arch/arm64/include/asm/cacheflush.h
> @@ -115,7 +115,8 @@ extern void flush_dcache_page(struct page *);
>  
>  static inline void __flush_icache_all(void)
>  {
> -	asm("ic	ialluis");
> +	asm volatile("ic ialluis" : : : "memory");
> +	dsb();
>  }
>  
>  #define flush_dcache_mmap_lock(mapping) \
> -- 
> 1.8.2.1
> 
> 



More information about the linux-arm-kernel mailing list