diff options
author | Madhavan Srinivasan <maddy@linux.vnet.ibm.com> | 2018-01-17 14:03:36 -0500 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2018-04-17 05:29:04 -0400 |
commit | 9dfbf78e4114fcaf4ef61c49885c3ab5bad40d0b (patch) | |
tree | 6ace136dd4a34d4d260e5d1f8f0b5d99f3e398f6 | |
parent | b8858581febb050688e276b956796bc4a78299ed (diff) |
powerpc/64s: Default l1d_size to 64K in RFI fallback flush
If there is no d-cache-size property in the device tree, l1d_size could
be zero. We don't actually expect that to happen, it's only been seen
on mambo (simulator) in some configurations.
A zero-size l1d_size leads to the loop in the asm wrapping around to
2^64-1, and then walking off the end of the fallback area and
eventually causing a page fault which is fatal.
Just default to 64K which is correct on some CPUs, and sane enough to
not cause a crash on others.
Fixes: aa8a5e0062ac9 ('powerpc/64s: Add support for RFI flush of L1-D cache')
Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
[mpe: Rewrite comment and change log]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r-- | arch/powerpc/kernel/setup_64.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 44c30dd38067..b78f142a4148 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -890,6 +890,17 @@ static void __ref init_fallback_flush(void) | |||
890 | return; | 890 | return; |
891 | 891 | ||
892 | l1d_size = ppc64_caches.l1d.size; | 892 | l1d_size = ppc64_caches.l1d.size; |
893 | |||
894 | /* | ||
895 | * If there is no d-cache-size property in the device tree, l1d_size | ||
896 | * could be zero. That leads to the loop in the asm wrapping around to | ||
897 | * 2^64-1, and then walking off the end of the fallback area and | ||
898 | * eventually causing a page fault which is fatal. Just default to | ||
899 | * something vaguely sane. | ||
900 | */ | ||
901 | if (!l1d_size) | ||
902 | l1d_size = (64 * 1024); | ||
903 | |||
893 | limit = min(ppc64_bolted_size(), ppc64_rma_size); | 904 | limit = min(ppc64_bolted_size(), ppc64_rma_size); |
894 | 905 | ||
895 | /* | 906 | /* |