mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 13:34:27 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			39 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From: Paul Burton <paul.burton@imgtec.com>
 | |
| Date: Mon, 5 Sep 2016 15:24:54 +0100
 | |
| Subject: [PATCH] MIPS: c-r4k: Fix size calc when avoiding IPIs for small
 | |
|  icache flushes
 | |
| 
 | |
| Commit f70ddc07b637 ("MIPS: c-r4k: Avoid small flush_icache_range SMP
 | |
| calls") adds checks to force use of hit-type cache ops for small icache
 | |
| flushes where they are globalised & index-type cache ops aren't, in
 | |
| order to avoid the overhead of IPIs in those cases. However it
 | |
| calculated the size of the region being flushed incorrectly, subtracting
 | |
| the end address from the start address rather than the reverse. This
 | |
| would have led to an overflow with size wrapping round to some large
 | |
| value, and likely to the special case for avoiding IPIs not actually
 | |
| being hit.
 | |
| 
 | |
| Signed-off-by: Paul Burton <paul.burton@imgtec.com>
 | |
| Cc: James Hogan <james.hogan@imgtec.com>
 | |
| Fixes: f70ddc07b637 ("MIPS: c-r4k: Avoid small flush_icache_range SMP calls")
 | |
| Reviewed-by: James Hogan <james.hogan@imgtec.com>
 | |
| Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
 | |
| Cc: Huacai Chen <chenhc@lemote.com>
 | |
| Cc: linux-mips@linux-mips.org
 | |
| Cc: linux-kernel@vger.kernel.org
 | |
| Patchwork: https://patchwork.linux-mips.org/patch/14211/
 | |
| Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
 | |
| ---
 | |
| 
 | |
| --- a/arch/mips/mm/c-r4k.c
 | |
| +++ b/arch/mips/mm/c-r4k.c
 | |
| @@ -781,7 +781,7 @@ static void r4k_flush_icache_range(unsig
 | |
|  		 * If address-based cache ops are globalized, then we may be
 | |
|  		 * able to avoid the IPI for small flushes.
 | |
|  		 */
 | |
| -		size = start - end;
 | |
| +		size = end - start;
 | |
|  		cache_size = icache_size;
 | |
|  		if (!cpu_has_ic_fills_f_dc) {
 | |
|  			size *= 2;
 |