[RFC PATCH 1/3] ARM: Use lazy cache flushing on ARMv7 SMP systems

Russell King - ARM Linux linux at arm.linux.org.uk
Thu May 13 07:32:15 EDT 2010


On Thu, May 13, 2010 at 12:15:55PM +0100, Catalin Marinas wrote:
> diff --git a/arch/arm/mm/fault-armv.c b/arch/arm/mm/fault-armv.c
> index 0d414c2..a415dc0 100644
> --- a/arch/arm/mm/fault-armv.c
> +++ b/arch/arm/mm/fault-armv.c
> @@ -170,10 +170,8 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr,
>  		return;
>  
>  	mapping = page_mapping(page);
> -#ifndef CONFIG_SMP
>  	if (test_and_clear_bit(PG_dcache_dirty, &page->flags))
>  		__flush_dcache_page(mapping, page);
> -#endif
>  	if (mapping) {
>  		if (cache_is_vivt())
>  			make_coherent(mapping, vma, addr, ptep, pfn);
> diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c
> index c6844cb..5ad8711 100644
> --- a/arch/arm/mm/flush.c
> +++ b/arch/arm/mm/flush.c
> @@ -17,6 +17,7 @@
>  #include <asm/smp_plat.h>
>  #include <asm/system.h>
>  #include <asm/tlbflush.h>
> +#include <asm/smp_plat.h>
>  
>  #include "mm.h"
>  
> @@ -93,12 +94,10 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsig
>  #define flush_pfn_alias(pfn,vaddr)	do { } while (0)
>  #endif
>  
> -#ifdef CONFIG_SMP
>  static void flush_ptrace_access_other(void *args)
>  {
>  	__flush_icache_all();
>  }
> -#endif
>  
>  static
>  void flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
> @@ -122,11 +121,9 @@ void flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
>  	if (vma->vm_flags & VM_EXEC) {
>  		unsigned long addr = (unsigned long)kaddr;
>  		__cpuc_coherent_kern_range(addr, addr + len);
> -#ifdef CONFIG_SMP
>  		if (cache_ops_need_broadcast())
>  			smp_call_function(flush_ptrace_access_other,
>  					  NULL, 1);
> -#endif

Err.  __cpuc_coherent_kern_range() makes the cache lines coherent between
the data and instruction threads.  So what you're doing is:

1. flush the D and I caches for the affected cache lines on the local
   processor
2. flush the entire I cache on the local processor

Why?

This has absolutely nothing to do with the rest of the patch.



More information about the linux-arm-kernel mailing list