arm64: kexec: Add comment to explain use of __flush_icache_range()
authorWill Deacon <will.deacon@arm.com>
Tue, 31 Jul 2018 11:09:03 +0000 (12:09 +0100)
committerWill Deacon <will.deacon@arm.com>
Tue, 31 Jul 2018 11:10:38 +0000 (12:10 +0100)
Now that we understand the deadlock arising from flush_icache_range()
on the kexec crash kernel path, add a comment to justify the use of
__flush_icache_range() here.

Reported-by: Dave Kleikamp <dave.kleikamp@oracle.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/kernel/machine_kexec.c

index 4c0eb30..f6a5c6b 100644 (file)
@@ -184,8 +184,15 @@ void machine_kexec(struct kimage *kimage)
 
        /* Flush the reboot_code_buffer in preparation for its execution. */
        __flush_dcache_area(reboot_code_buffer, arm64_relocate_new_kernel_size);
+
+       /*
+        * Although we've killed off the secondary CPUs, we don't update
+        * the online mask if we're handling a crash kernel and consequently
+        * need to avoid flush_icache_range(), which will attempt to IPI
+        * the offline CPUs. Therefore, we must use the __* variant here.
+        */
        __flush_icache_range((uintptr_t)reboot_code_buffer,
-               arm64_relocate_new_kernel_size);
+                            arm64_relocate_new_kernel_size);
 
        /* Flush the kimage list and its buffers. */
        kexec_list_flush(kimage);