How to flush the CPU cache for a region of address space in Linux?

前端 未结 5 1008
你的背包
你的背包 2020-12-01 05:04

I am interested in flushing cache (L1, L2, and L3) only for a region of address space, for example all cache entries from address A to address B. Is there a mechanism to do

5条回答
  •  孤独总比滥情好
    2020-12-01 05:40

    Check this page for list of available flushing methods in linux kernel: https://www.kernel.org/doc/Documentation/cachetlb.txt

    Cache and TLB Flushing Under Linux. David S. Miller

    There are set of range flushing functions

    2) flush_cache_range(vma, start, end);
       change_range_of_page_tables(mm, start, end);
       flush_tlb_range(vma, start, end);
    

    3) void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)

    Here we are flushing a specific range of (user) virtual
    addresses from the cache.  After running, there will be no
    entries in the cache for 'vma->vm_mm' for virtual addresses in
    the range 'start' to 'end-1'.
    

    You can also check implementation of the function - http://lxr.free-electrons.com/ident?a=sh;i=flush_cache_range

    For example, in arm - http://lxr.free-electrons.com/source/arch/arm/mm/flush.c?a=sh&v=3.13#L67

     67 void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
     68 {
     69         if (cache_is_vivt()) {
     70                 vivt_flush_cache_range(vma, start, end);
     71                 return;
     72         }
     73 
     74         if (cache_is_vipt_aliasing()) {
     75                 asm(    "mcr    p15, 0, %0, c7, c14, 0\n"
     76                 "       mcr     p15, 0, %0, c7, c10, 4"
     77                     :
     78                     : "r" (0)
     79                     : "cc");
     80         }
     81 
     82         if (vma->vm_flags & VM_EXEC)
     83                 __flush_icache_all();
     84 }
    

提交回复
热议问题