From: Felix Fietkau Date: Tue, 27 Dec 2016 23:23:00 +0000 (+0100) Subject: kernel: backport a MIPS SMP icache flush fix X-Git-Tag: v17.01.0-rc1~149 X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fopenwrt.git;a=commitdiff_plain;h=80dbaa4ef39306f0c6b8c379488a26158340c112 kernel: backport a MIPS SMP icache flush fix Signed-off-by: Felix Fietkau --- diff --git a/target/linux/generic/patches-4.4/094-MIPS-c-r4k-Fix-size-calc-when-avoiding-IPIs-for-smal.patch b/target/linux/generic/patches-4.4/094-MIPS-c-r4k-Fix-size-calc-when-avoiding-IPIs-for-smal.patch new file mode 100644 index 0000000000..733d9c77b3 --- /dev/null +++ b/target/linux/generic/patches-4.4/094-MIPS-c-r4k-Fix-size-calc-when-avoiding-IPIs-for-smal.patch @@ -0,0 +1,38 @@ +From: Paul Burton +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 +Cc: James Hogan +Fixes: f70ddc07b637 ("MIPS: c-r4k: Avoid small flush_icache_range SMP calls") +Reviewed-by: James Hogan +Reviewed-by: Florian Fainelli +Cc: Huacai Chen +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 +--- + +--- 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;